聚类算法

聚类算法k-means

无监督学习: 训练数据只有特征值, 没有目标值

k-means聚类步骤

  • 1、随机设置K个特征空间内的点作为初始的聚类中心
  • 2、对于其他每个点计算到K个中心的距离,未知的点选择最近的一个聚类中心点作为标记类别
  • 3、接着对着标记的聚类中心之后,重新计算出每个聚类的新中心点(平均值)
  • 4、如果计算得出的新中心点与原中心点一样(质心不再移动),那么结束,否则重新进行第二步过程

k-means算法api

sklearn.cluster.KMeans(n_clusters=8)

  • 参数:
    • n_clusters:开始的聚类中心数量
    • 整型,缺省值=8,生成的聚类数,即产生的质心(centroids)数。
  • 方法:
    • estimator.fit(x)
    • estimator.predict(x)
    • estimator.fit_predict(x)
    • 计算聚类中心并预测每个样本属于哪个类别,相当于先调用fit(x),然后再调用predict(x)

模型评估

  1. 误差平方和SSE

所有样本到对应类别中心得距离的平方相加
S S E=\sum_{i=1}^{k} \sum_{p \in C_{i}}\left|p-m_{i}\right|^{2}
随着迭代, sse减少, 若质心初始值选择不好, sse只会达到一个不怎么好的局部最优解.

  1. 肘方法确定k值

    (1)对于n个点的数据集,迭代计算k from 1 to n,每次聚类完成后计算每个点到其所属的簇中心的距离的平方和;

    (2)平方和是会逐渐变小的,直到k==n时平方和为0,因为每个点都是它所在的簇中心本身。

    (3)在这个平方和变化过程中,会出现一个拐点也即“肘”点,下降率突然变缓时即认为是最佳的k值

    在决定什么时候停止训练时,肘形判据同样有效,数据通常有更多的噪音,在增加分类无法带来更多回报时,我们停止增加类别

  2. 轮廓系数法silhouette coefficient

越大越好

凝聚度: 样本i到同一簇内其他点不相似程度的平均值

分离度: 样本i到其他簇的平均不相似程度的最小值
\mathbf{S}=\frac{(b-a)}{\max (a, b)}
每个样本都算出一个轮廓系数[-1,1] 所有的轮廓系数取平均值(平均轮廓系数)

轮廓系数也可确定k值好坏

若s<0, 该样本可能分类错误

  1. CH系数(Calinski-Harabasz Index越大越好)

协方差矩阵
\mathrm{s}(\mathrm{k})=\frac{\operatorname{tr}\left(B_{k}\right)}{\operatorname{tr}\left(W_{k}\right)} \frac{m-k}{k-1}
tr为矩阵的迹, Bk为类别之间的协方差矩阵,Wk为类别内部数据的协方差矩阵;

m为训练集样本数,k为类别数。

k-means算法优化算法

k-means严重依赖初始化的k个中心点

  1. Canopy算法

不用指定k值 t1 t2同心圆 重复画

t1 t2长度不好确定

  1. K-means++

P=\frac{D(x)^{2}}{\sum_{x \in X} D(x)^{2}}

随机选一个中心点, 求其他点的P, 按P抽取第二个中心点(距离远的点被抽到的概率打), 以此类推直到抽取k个点

  1. 二分K-means
  • 1.所有点作为一个簇
  • 2.将该簇一分为二
  • 3.选择能最大限度降低聚类代价函数(也就是误差平方和)的簇划分为两个簇。
  • 4.以此进行下去,直到簇的数目等于用户给定的数目k为止。
  1. k_medoids k-中心聚类算法

与k-means相同, 只是在一个簇中, 对于每个点都计算其距离, 选距离最小的点作为新中心店

  1. Kernel k-means

对于同中心点两簇数据

核函数把样本映射到更高纬度空间

核函数比较难找

6 . ISODATA

不用指定k值, 设定分裂合并规则

类别数目随着聚类过程而变化:

“合并”:(当聚类结果某一类中样本数太少,或两个类间的距离太近时)

“分裂”(当聚类结果中某一类的类内方差太大,将该类进行分裂)

  1. Mini Batch K-means

以部分代替整体, 每次迭代抽一部分数据

适合大数据

发表评论

邮箱地址不会被公开。 必填项已用*标注