K-means聚类算法

基本概念

k均值聚类算法(k-means clustering algorithm)是一种迭代求解的聚类分析算法,其步骤是,预将数据分为K组,则随机选取K个对象作为初始的聚类中心,然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给它们的对象就代表一个聚类。每分配一个样本,聚类的聚类中心会根据聚类中现有的对象被重新计算。这个过程将不断重复直到满足某个终止条件。终止条件可以是没有(或最小数目)对象被重新分配给不同的聚类,没有(或最小数目)聚类中心再发生变化,误差平方和局部最小。

  1. 聚成多少个簇:由K的值决定
  2. 距离的衡量标准:一般由欧式距离作为距离的衡量标准
  3. 质心的选取:由各向量的均值决定
  4. 目标优化函数:

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=1kxci(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=x1x2+y1y2

欧式距离

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=(x1x2)2+(y1y2)2(一般都使用欧式距离)

K-means聚合步骤

在这里插入图片描述

  1. 首先选取确定k值之后,在目标图中随机生成k个聚类中心点
  2. 分别计算距离中心点最近的点的欧式距离,进行分类
  3. 划分完所有点之后平均每个类的所有点的坐标,重新找到聚类中心点
  4. 重复步骤二,找到距离此中心点最近的所有点的欧式距离,进行分类
  5. 重复步骤三,重新找到最优的聚类中心点
    … \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)=1b(i)a(i),a(i)<b(i)0,a(i)=b(i)a(i)b(i)1,a(i)>b(i)
  1. 轮廓系数范围在[-1,1]之间。该值越大,越合理。
  2. si接近1,则说明样本i聚类合理;(0.6以上就表示可以)
  3. si接近-1,则说明样本i更应该分类到另外的簇;
  4. 若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版权协议,转载请附上原文出处链接和本声明。