更新时间:2023-05-05 GMT+08:00
分享

二分k均值

概述

二分k-means算法是分层聚类(Hierarchical clustering)的一种,分层聚类是聚类分析中常用的方法。

分层聚类的策略一般有两种:

  • 聚合:这是一种自底向上的方法,每一个观察者初始化本身为一类,然后两两结合。
  • 分裂:这是一种自顶向下的方法,所有观察者初始化为一类,然后递归地分裂它们。二分k-means算法是分裂法的一种。

二分k-means算法是k-means算法的改进算法,相比k-means算法,它可以加速k-means算法的执行速度,因为它的相似度计算少了,能够克服k-means收敛于局部最小的缺点。

二分k-means算法的一般流程如下所示:

  1. 把所有数据初始化为一个簇,将这个簇分为两个簇。
  2. 选择满足条件的可以分解的簇。选择条件综合考虑簇的元素个数以及聚类代价(也就是误差平方和SSE),误差平方和的公式如下所示,其中 表示权重值, 表示该簇所有点的平均值。

  3. 使用k-means算法将可分裂的簇分为两簇。
  4. 一直重复2、3步,直到满足迭代结束条件。

输入

参数

子参数

参数说明

inputs

dataframe

inputs为字典类型,dataframe为pyspark中的DataFrame类型对象

输出

spark pipeline类型的模型

参数说明

参数

子参数

参数说明

input_features_str

-

输入的列名以逗号分隔组成的字符串,例如:

"column_a"

"column_a,column_b"

cluster_feature_vector_col

-

算子输入的特征向量列的列名,默认为"model_features"

prediction_col

-

算子输出的预测label的列名,默认为"prediction"

k

-

想要聚类的个数,默认为2

max_iter

-

最大迭代次数,默认为100

min_divisible_cluster_size

-

值如果大于等于1,它表示一个可切分簇的最小点数量;如果值小于1,它表示可切分簇的点数量占总数的最小比例,该值默认为1

样例

inputs = {
    "dataframe": None  # @input {"label":"dataframe","type":"DataFrame"}
}
params = {
    "inputs": inputs,
    "b_output_action": True,
    "b_use_default_encoder": True,
    "outer_pipeline_stages": None,
    "input_features_str": "",  # @param {"label": "input_features_str", "type": "string", "required": "false", "helpTip": ""}
    "cluster_feature_vector_col": "model_features",  # @param {"label": "cluster_feature_vector_col", "type": "string", "required": "true", "helpTip": ""}
    "prediction_col": "prediction",  # @param {"label": "prediction_col", "type": "string", "required": "true", "helpTip": ""}
    "k": 2,  # @param {"label": "k", "type": "integer", "required": "true", "range": "(0,2147483647]", "helpTip": ""}
    "max_iter": 100,  # @param {"label": "max_iter", "type": "integer", "required": "true", "range": "(0,2147483647]", "helpTip": ""}
    "min_divisible_cluster_size": 1.0  # @param {"label": "min_divisible_cluster_size", "type": "number", "required": "true", "range": "(0,none)", "helpTip": ""}
}
bisecting_kmeans____id___ = MLSBisectingKmeans(**params)
bisecting_kmeans____id___.run()
# @output {"label":"pipeline_model","name":"bisecting_kmeans____id___.get_outputs()['output_port_1']","type":"PipelineModel"}

分享:

    相关文档

    相关产品