算法篇
k-means
k-means属于无监督学习中的聚类算法,只适用于没有标签的数据集,用来处理聚类问题,需要自己来划分预测结果。
所谓聚类问题,就是给定一个数据集D,每个样本有n个属性,使用某种算法将数据集D分为k个子集,使每个子集内部元素之间的相似度尽可能的高,使集合和集合之间的各个元素之间的相似度尽可能的低,每个子集称为一个簇。
聚类的目的:类内相似,类外相异
算法原理
- 从数据D随机选取k个元素,作为k个簇各自的聚类中心,k个元素可以是数据中的元素也可以不是数据中的元素
- 分别计算剩下的元素和k个聚类中心的相似度(计算距离,越近就是 相似度越高),并将其归属为最相似的簇
- 根据聚类结果,重新划分聚类中心,并且计算距离
- 重复2,3操作,直至满足停止条件
停止条件为:聚类结果基本不再发生变化,或者达到一定的迭代次数
算法特点
- 需要自定义k值
- 数据如果受量纲的影响,需要对数据进行标准化,所谓量纲就是某几列特征数据差距较大
- 会受异常值的影响(如果存在异常值,通常会自成一类)
- 会收敛于局部最优(随机初始化的聚类中心,可能无法达到全局最优)
k-means算法之前,需要考虑是否要去异常、是否要数据标准化
衡量聚类效果:观察每个样本到各自聚类中心距离的和
算法的代码实现
from sklearn.cluster import KMeans
from sklearn.preprocessing import MaxAbsScaler # 小数定标标准化
from sklearn.preprocessing import MinMaxScaler # 离差标准化
from sklearn.preprocessing import StandardScaler # 标准差标准化
# 评估指标-----轮廓系数
from sklearn.metrics import silhouetee_score
# 由于是聚类算法,数据可能存在量纲,需要标准化,在使用算法之前
# 实例化
sca = MaxAbsScaler()
sca = MinMaxScaler()
sca = StandardScaler()
# 拟合
sca.fit( 训练集特征 )
# 处理数据
X_train = sca.transform( 训练集特征 )
# 实例化
km = KMeans()
# 参数:
# n_clusters=3,表示k=3,也就是随机三个聚类中心,最小值是2
# init,聚类中心初始化方法,默认k-means++
# max_iter,最大迭代次数,默认300,如果后期无法收敛可以尝试增加迭代次数
# random_state=1,随机种子,默认是None
# 拟合
km.fit( 训练集特征 )
# 查看聚类中心
print('聚类中心:', km.cluster_centers_)
# 查看预测结果
# 可以直接传入训练集,也可以传入自定义二维数组
y_pred = km.predict( 训练集特征 )
print('整个数据的类别:', y_pred)
# 查看SSE---误差平方和
# 默认是取反操作,大多数情况得出来的是负值【-inf, 0】
# 绝对值越小越好
score = km.score(X_train, y_pred)
print('SSE', score)
# 评估指标----轮廓系数(-1, 1),越大越好
print('轮廓系数:', silhouetee_score(X_train, y_pred))
k-means获取最优k值的方法
手肘法
计算不同k值的SSE,绘制图像,选择图像拐点的k值相对是比较好的,由于图像画出来类似于手肘,所以叫手肘法,选取手肘拐点即可。手肘法选取的就是相对较好的点,也就相当于一个折中效果,使预测结果不会太差,防止过拟合现象的发生。
获取最优轮廓系数
如果想要最优的点,还是要选取最高的点。
设置不同的k值进行测试计算轮廓系数,就能得到最优的k值对应的最优的轮廓系数,也可以绘图进行观察,选取最高。但是为了防止过拟合的现象,也可以通过手肘进行选取最优k值