基本概念
k均值聚类算法(k-means clustering algorithm)是一种迭代求解的聚类分析算法,其步骤是,预将数据分为K组,则随机选取K个对象作为初始的聚类中心,然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给它们的对象就代表一个聚类。每分配一个样本,聚类的聚类中心会根据聚类中现有的对象被重新计算。这个过程将不断重复直到满足某个终止条件。终止条件可以是没有(或最小数目)对象被重新分配给不同的聚类,没有(或最小数目)聚类中心再发生变化,误差平方和局部最小。
- 聚成多少个簇:由K的值决定
- 距离的衡量标准:一般由欧式距离作为距离的衡量标准
- 质心的选取:由各向量的均值决定
- 目标优化函数:
m i n ∑ i = 1 k ∑ x ∈ c i ( c i , x ) 2 min\sum_{i=1}^k\sum_{x\in c_i}(c_i,x)^2mini=1∑kx∈ci∑(ci,x)2
常见的距离
曼哈顿距离
d = ∣ x 1 − x 2 ∣ + ∣ y 1 − y 2 ∣ d=\lvert x_1-x_2\lvert+\lvert y_1-y_2\lvertd=∣x1−x2∣+∣y1−y2∣
欧式距离
d = ( x 1 − x 2 ) 2 + ( y 1 − y 2 ) 2 (一般都使用欧式距离) d=\sqrt{(x_1-x_2)^2+(y_1-y_2)^2}\tag{一般都使用欧式距离}d=(x1−x2)2+(y1−y2)2(一般都使用欧式距离)
K-means聚合步骤

- 首先选取确定k值之后,在目标图中随机生成k个聚类中心点
- 分别计算距离中心点最近的点的欧式距离,进行分类
- 划分完所有点之后平均每个类的所有点的坐标,重新找到聚类中心点
- 重复步骤二,找到距离此中心点最近的所有点的欧式距离,进行分类
- 重复步骤三,重新找到最优的聚类中心点
… \dots…
聚类效果的评判
- a(i):对于第i个元素xi,计算xi与同一个簇类所有元素的平均距离,用来表示簇内凝聚程度
- b(i):选取xi外一个簇,计算xi与该簇内所有点距离的平均值,遍历其他所有簇,取所有平均值最小的,用来表示簇间的分离度
- 计算所有的x的轮廓系数,求出平均值即为整体的轮廓系数
S ( i ) = b ( i ) − a ( i ) m a x { a ( i ) , b ( i ) } S(i)=\frac{b(i)-a(i)}{max\{a(i),b(i)\}}S(i)=max{a(i),b(i)}b(i)−a(i)
化简可得:
S ( i ) = { 1 − a ( i ) b ( i ) , a ( i ) < b ( i ) 0 , a ( i ) = b ( i ) b ( i ) a ( i ) − 1 , a ( i ) > b ( i ) S(i)=\begin{cases} 1-\frac{a(i)}{b(i)},a(i)<b(i)\\ 0,a(i)=b(i)\\ \frac{b(i)}{a(i)}-1,a(i)>b(i) \end{cases}S(i)=⎩⎨⎧1−b(i)a(i),a(i)<b(i)0,a(i)=b(i)a(i)b(i)−1,a(i)>b(i)
- 轮廓系数范围在[-1,1]之间。该值越大,越合理。
- si接近1,则说明样本i聚类合理;(0.6以上就表示可以)
- si接近-1,则说明样本i更应该分类到另外的簇;
- 若si近似为0,则说明样本i在两个簇的边界上。
参数&属性说明
class sklearn.cluster.KMeans(
n_clusters=8,
init=’k-means++’,
n_init=10,
max_iter=300,
tol=0.0001,
precompute_distances=’auto’,
verbose=0,
random_state=None,
copy_x=True,
n_jobs=None,
algorithm=’auto’)
[source]
参数:
- n_clusters: 类中心的个数,就是要聚成几类。【默认是8个】
- init:参初始化的方法,默认为’k-means++
- n_init: 整形,缺省值=10
用不同的质心初始化值运行算法的次数,最终解是在inertia意义下选出的最优结果 - max_iter :执行一次k-means算法所进行的最大迭代数。
- Tol: 与inertia结合来确定收敛条件。
- precompute_distances:三个可选值,‘auto’,True 或者 False,默认auto自动计算。
- verbose:整形,默认值=0
- random_state :随机状态
- copy_x:布尔型,默认值=True
当我们precomputing distances时,将数据中心化会得到更准确的结果。如果把此参数值设为True,则原始数据不会被改变。如果是False,则会直接在原始数据 上做修改并在函数返回值时将其还原。但是在计算过程中由于有对数据均值的加减运算,所以数据返回后,原始数据和计算前可能会有细小差别。 - algorithm:‘auto’,‘full’ or ‘elkan’.默认为’auto’
- full:采用经典的EM算法
- elkan:通过使用三角不等式从而更有效,但不支持稀疏数据
- auto:数据稀疏选择full模式,数据稠密选择elkan模式
属性:
- cluster_centers_: 一个n-clusters*n_features的矩阵,表示聚类中心的坐标
- Labels_:每个点的分类标签。
- inertia_:每个点到其簇的质心的距离之和。
- n_iter_:迭代次数
样例展示
import pandas as pd
from sklearn.cluster import KMeans
from sklearn import metrics
#读取数据文件
data = pd.read_table('data.txt',sep=' ')
#分离数据集
X = data.iloc[:,1:-1]
# 寻找合适的K值
scores = []
for k in range(2,20):
labels = KMeans(n_clusters=k).fit(X).labels_
score = metrics.silhouette_score(X, labels)
scores.append(score)
#绘制得分结果
import matplotlib.pyplot as plt
plt.plot(list(range(2,20)), scores)
plt.xlabel("Number of Clusters Initialized")
plt.ylabel("Sihouette Score")
#聚类
km = KMeans(n_clusters=2).fit(X) #K值为2【分为2类】
data['cluster'] = km.labels_
data.sort_values('cluster') #对聚类结果排序【排序时不能修改beer数据框,否则会与X中的数据对不上】
#对聚类结果进行评分
"""
采用轮廓系数评分
X:数据集 scaled_cluster:聚类结果
score:非标准化聚类结果的轮廓系数
"""
score = metrics.silhouette_score(X,data.cluster)
print(score)
plt.show()
k值轮廓分值图

优缺点
优点
- 简单,快速,适合常规的数据集。
缺点
- K值难以确定。
- 很难发现任意形状的簇。
使用DBSCAN算法改进
文件数据
链接:https://pan.baidu.com/s/1SQHaGe3p8DbpyIzQwDiS5g?pwd=mfpn
提取码:mfpn
版权声明:本文为m0_50661271原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。