K-means算法
特点
优点:容易实现
缺点:可能收敛到局部最小值,在大规模数据集上收敛较慢
适用数据类型:数值型数据
步骤
- 适当给出聚类簇数k
- 根据k,随机选择k个簇质心
- 对任意一个样本,求其到各个簇质心的距离,将其归到距离最近的簇质心
- 用均值等方法更新每个簇的质心
- 重复3、4,直到各个簇质心恒定不变,则聚类完成
选择适当的簇数
肘部法则–Elbow Method
畸变程度:每个簇质心与簇内样本点的平方距离误差和,畸变程度越低,代表簇内成员越紧密,反之则越松散
平均畸变程度:各个簇的畸变程度之和除以簇数
簇的个数越多,总畸变程度越低,但违背了聚类的目标:在保持簇数目不变的情况下提高簇的质量,所以为了保持簇总数不变,可以将最近的两个簇进行合并,或者合并两个使总畸变程度增幅最小的簇质心,必须在所有可能的两个簇上进行操作,直到找到合并最佳的两个簇为止
轮廓系数–Silhouette Coefficient
a:同簇样本彼此距离的均值
b:样本到除自身所在簇外的最近簇的样本的均值
轮廓系数越大,代表聚类的效果越合理
K-means算法代码实现
import numpy as np
# 读取文件
def loadDataSet(filename):
# 用以储存数据
dataMat = []
fr = open(filename)
for line in fr.readline():
# 去掉首尾空格后,按制表符分割每行,返回列表
curLine = line.strip().split('\t')
# 将列表中每一个元素转化为float类型
fltLine =