《机器学习》K-means 聚类 原理、参数解析、案例实现
K-means是一种常用的无监督学习算法,用于将数据集中的对象划分为k个不同的组或簇。该算法的目标是最小化每个数据点与所属簇的质心之间的平方欧氏距离之和。
目录
1)n_clusters: 类中心的个数,就是要聚成几类。【默认是8个】
4)max_iter :执行一次k-means算法所进行的最大迭代数。
6)precompute_distances:三个可选值,‘auto’,True 或者 False。
10)algorithm:'auto','full' or 'elkan'.默认为'auto'
一、K-means 聚类
1、什么是K均值聚类
K-means是一种常用的无监督学习算法,用于将数据集中的对象划分为k个不同的组或簇。该算法的目标是最小化每个数据点与所属簇的质心之间的平方欧氏距离之和。
2、K均值算法的工作原理
- 首先,选择要划分的簇的数量k。
- 随机选择k个数据点作为初始的质心。
- 对于每个数据点,计算其与各个质心之间的欧氏距离,并将其分配给最近的质心所属的簇。
- 更新每个簇的质心,即将每个簇中所有数据点的均值作为新的质心。
- 重复步骤3和4,直到质心不再发生变化或达到预定的迭代次数。
K均值算法有一些优点,如实现简单、计算效率高等。
它也有一些限制,包括对于初始质心的敏感性以及对于数据点的分布存在假设。另外,K均值算法无法处理非球形簇或大小差异较大的簇。
3、核心原理流程图
首先可以看到a图,此时有一堆数据点,这些数据点只有特征,没有类别,想要将其分为2类
随机找俩个点,一个用红色x标记,一个用蓝色x标记(b图),然后将所有点计算到这两个点的距离,得到一部分距离红色标记近,将其全部标记为红色,一部分距离蓝色标记近,将其全部标记为蓝色
将所有的距离计算均值得到一个坐标,然后更新随机构建的坐标点,将其更改到这个新的坐标点,重复上面步骤,求所有点到这两个点的距离,然后得到两部分,同样将其标记,再次计算均值得到新的坐标点,此时即可完成簇的分类。
4、基本概念
1)聚成多少和簇:需要指定k的值
2)距离的度量:一般采用欧氏距离
3)质心:各向量的均值
4)优化目标:
5、常见的距离
1)曼哈顿距离
2)欧氏距离
二、聚类效果评价方式
1、轮廓系数
a(i):对于第i个元素xi,计算与其同一个簇内所有其他元素距离的平均值,表示了簇内的凝聚程度
b(i):选取xi外的一个簇,计算xi与该簇内所有点距离的平均距离,遍历其他所有簇,取所有平均值中最小的一个,表示簇间的分离度
计算所有x的轮廓系数,求出平均值即为当前聚类的整体轮廓系数
2、评价方式
对于轮廓系数,有簇内凝聚程度 a(i) 和簇间分离度 b(i),此时凝聚程度和分离度的比较如上所示,即可得到轮廓系数
1)轮廓系数范围在[-1,1]之间。该值越大,越合理
2)si接近1,此时a(i) < b(i),并且a(i)接近于0,则说明样本深类合理
3)si接近-1,此时a(i) > b(i),并且b(i)接近于0,则说明样本i更应该分类到另外的簇
4)若si 近似为0,a(i) = b(i),则说明样本i在两个族的边界上。
三、K-mean参数解析
1、用法
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]
2、参数
1)n_clusters: 类中心的个数,就是要聚成几类。【默认是8个】
2)init:参初始化的方法,默认为'k-means++'
(1)'k-means++': 用一种特殊的方法选定初始质心从而能加速迭代过程的收敛.
(2) ‘random’: 随机从训练数据中选取初始质心。
(3) 如果传递的是一个ndarray,则应该形如 (n_clusters, n_features) 并给出初始质心。
3)n_init: 整形,缺省值=10
用不同的质心初始化值运行算法的次数,最终解是在inertia意义下选出的最优结果,最优即轮廓系数最大
4)max_iter :执行一次k-means算法所进行的最大迭代数。
即上述流程途中的计算一次所有点到样本点的距离并更新样本点坐标,这一个流程为迭代一次
5)Tol: 与inertia结合来确定收敛条件。
6)precompute_distances:三个可选值,‘auto’,True 或者 False。
预计算距离,计算速度更快但占用更多内存。
(1)‘auto’:如果 样本数乘以聚类数大于 12million 的话则不预计算距离。
(2)True:总是预先计算距离。
(3)False:永远不预先计算距离。
7)verbose:整形,默认值=0
8)random_state :随机状态
9)copy_x:布尔型,默认值=True
当我们precomputing distances时,将数据中心化会得到更准确的结果。如果把此参数值设为True,则原始数据不会被改变。如果是False,则会直接在原始数据 上做修改并在函数返回值时将其还原。但是在计算过程中由于有对数据均值的加减运算,所以数据返回后,原始数据和计算前可能会有细小差别。
10)algorithm:'auto','full' or 'elkan'.默认为'auto'
full:采用经典的EM算法
elkan:通过使用三角不等式从而更有效,但不支持稀疏数据
auto:数据稀疏选择full模式,数据稠密选择elkan模式
3、属性
cluster_centers_:一个n-clusters * n_features的矩阵,表示聚类中心的坐标
labels_:每个点的分类标签。
inertia_:float型,每个点到其簇的质心的距离之和。
n_iter_ : int 迭代次数。
4、案例实现
1)有如下文件
2)完整代码
import pandas as pd
from sklearn.cluster import KMeans # 导入K-mean聚类的包
from sklearn import metrics
beer = pd.read_table('data.txt',sep=' ',encoding='utf8',engine='python') # 导入数据,指定分隔符
x = beer[['calories','sodium','alcohol','cost']] # 取出这四列数据
scores = []
for k in range(2,10): # 循环k值
labels = KMeans(n_clusters=k).fit(x).labels_ # 建立模型,设置参数聚类的类别数,然后对其进行训练,然后再取出每个点的分类标签
score = metrics.silhouette_score(x,labels) # 计算轮廓系数
scores.append(score) # 将轮廓系数保存到scores列表
print(scores)
b =max(scores) # 导出最大概率
a = scores.index(b)+2 # 有最大概率的索引对其求k值,因为k值从2开始,所以对其+2
import matplotlib.pyplot as plt # 导入绘图库
plt.plot(list(range(2,10)),scores) # 绘制折线图,x为2-10之间的数,y为上述求得概率
plt.xlabel("Number of Clusters Initinlized") # x标签名
plt.ylabel("Sihouette Score") # y标签名
plt.show()
km = KMeans(n_clusters=a).fit(x) # 使用上述最优k值进行训练
beer['cluster'] = km.labels_ # 导出数据点的标签信息,将标签信息增加到原始数据beer
score = metrics.silhouette_score(x,beer.cluster) # 计算轮廓系数,参数为特征值和预测结果
print(score)
运行结果:
调试模式可以看到以下结果:
更多推荐
所有评论(0)