- K-means原理
- K-means步骤如下:
- 性能评估
- 案例分析
- 结果展示
- 优缺点
K-means算法解决的问题是:在不知道如何分类的情况下,让程序根据距离的远近,把N个对象划分为k类(局部最优)。它是无监督算法中较常见的一种,原理比较简单易懂。本质就是通过循环,迭代类的中心点,计算每个对象到中心点的距离,根据距离重新分类。
K-means步骤如下:1.指定聚类的个数k;
2.随机选定k个对象作为聚类中心;
3.计算每个对象到这k个聚类中心的距离,并将其进行分类:分到距离最近的聚类中心;
4.重新计算每个聚类的中心(求均值),得到新的聚类中心;
5.重复3和4,直到满足迭代终止条件;
终止条件一般为:①迭代次数达到上限;②聚类中心点不发生变化或没有对象被分配给新的类;③误差平方和局部最小。
K-means算法使用:
1.导包from sklearn.cluster import KMeans
2.sklearn.cluster.KMeans(n_clusters=8,init=‘k-means++’),其中
n_clusters是开始的聚类中心数量,init是初始化方法,默认为’k-means++’
此处介绍的是轮廓系数法:
S
=
b
−
a
m
a
x
(
a
,
b
)
,
−
1
≤
S
≤
1
Large {S} = frac{b-a}{max(a,b)},-1 le S le 1
S=max(a,b)b−a,−1≤S≤1
a
=
x
与类内其他对象聚类的和
x
所在类的对象数
−
1
Large{a} = frac{x与类内其他对象聚类的和}{x所在类的对象数-1}
a=x所在类的对象数−1x与类内其他对象聚类的和
b
=
m
i
n
x
与其他某一个类内所有对象距离和
该类对象数
large{b} = min frac {x与其他某一个类内所有对象距离和}{该类对象数}
b=min该类对象数x与其他某一个类内所有对象距离和
S越接近1,说明包含x的类越紧凑且离其他类较远,聚类效果较好;S小于0时,说明x距离其他类的对象比距离自己所在类的对象更近,聚类效果差。
因而可以使用X中所有对象的轮廓系数均值来评估聚类好坏。
此处通过对sklearn自带的数据集鸢尾花进行分类,简单熟悉一下K-means算法的流程。
代码如下:
from sklearn.datasets import load_iris from sklearn.cluster import KMeans import matplotlib.pyplot as plt from sklearn.metrics import silhouette_score #导入数据 iris = load_iris().data #建立聚类 estimator = KMeans(n_clusters=3)#此处取k为3 estimator.fit(iris) pred = estimator.predict(iris) #绘制聚类结果 x_label = iris[:,1] y_label = iris[:,2] plt.scatter(x_label,y_label,c=pred) plt.show() #模型评估 S = silhouette_score(iris,pred) print(S)结果展示
最终的S=0.5528190123564091
因为sklearn自带的鸢尾花数据集较小,最终这个S相对来说还是可以接受的。
优点:
1.采用迭代式算法,直观易懂且实用
2.可解释性较强
缺点:
1.k的取值难以确定
2.容易收敛到局部最优解
3.对孤立点敏感,如数据集存在异常突出点,会影响聚类结果
4.不适合差别较小的数据



