- 基本概念
- 常见的距离
- 曼哈顿距离
- 欧式距离
- K-means聚合步骤
- 聚类效果的评判
- 参数&属性说明
- 参数:
- 属性:
- 样例展示
- k值轮廓分值图
- 优缺点
- 优点
- 缺点
- 文件数据
k均值聚类算法(k-means clustering algorithm)是一种迭代求解的聚类分析算法,其步骤是,预将数据分为K组,则随机选取K个对象作为初始的聚类中心,然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给它们的对象就代表一个聚类。每分配一个样本,聚类的聚类中心会根据聚类中现有的对象被重新计算。这个过程将不断重复直到满足某个终止条件。终止条件可以是没有(或最小数目)对象被重新分配给不同的聚类,没有(或最小数目)聚类中心再发生变化,误差平方和局部最小。
- 聚成多少个簇:由K的值决定
- 距离的衡量标准:一般由欧式距离作为距离的衡量标准
- 质心的选取:由各向量的均值决定
- 目标优化函数:
m i n ∑ i = 1 k ∑ x ∈ c i ( c i , x ) 2 minsum_{i=1}^ksum_{xin c_i}(c_i,x)^2 mini=1∑kx∈ci∑(ci,x)2
常见的距离 曼哈顿距离d = ∣ x 1 − x 2 ∣ + ∣ y 1 − y 2 ∣ d=lvert x_1-x_2lvert+lvert y_1-y_2lvert d=∣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) end{cases} S(i)=⎩ ⎨ ⎧1−b(i)a(i),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



