机器学习笔记之-Kmeans

今天来聊聊聚类分析中最基础的一个算法:Kmeans。

Kmeans思想及算法流程:

      首先Kmeans是一种无监督的聚类算法。对于给定的样本集,按照样本之间的距离大小,将样本划分为K个簇,让簇内的点尽量紧密的连接在一起,而让簇间的距离尽量的大。

算法流程:

1、给各个簇中心\mu 1,\mu 2...,\mu c以适当的初值。

2、更新样本x1,x2,...,xn对应的簇标签y1,y2,...,yn。

                             yi\leftarrow argmin\left \| xi-\mu y\right \|^2,i=1,2,...,n   argmin是使目标函数取最小值时的变量值

3、更新各个簇中心\mu 1,\mu 2...,\mu c

                             \mu y\leftarrow \frac{1}{ny}\sum_{i:yi=y}xi                          其中y=1,2,...,c

               上式中, ny为属于簇y的样本总数。                       

4、直到簇标签达到收敛精度为止,否则重复2,3步的计算。

K值的确定:

在实际的应用中,主要两种方法进行K值的确定:

1、经验法:在实际的工作中,可以结合业务的场景和需求,来决定分几类以确定K值。

2、肘部法则:在使用聚类算法时,如果没有指定聚类的数量,即K值,则可以通过肘部法则来进行对K值得确定。肘部法则是通过成本函数来刻画的,其是通过将不同K值得成本函数刻画出来,随着K值的增大,平均畸变程度会不断减小且每个类包含的样本数会减少,于是样本离其重心会更近。但是,随着值继续增大,平均畸变程度的改善效果会不断减低。因此找出在K值增大的过程中,畸变程度下降幅度最大的位置所对应的K较为合理。

注:

成本函数:各个类的畸变程度之和与其内部成员位置距离的平方和,最优解是以成本函数最小化为目标。公式如下:

                                                                     J=\sum_{k=1}^{k}\sum_{i\epsilon _{Ck}}^{i}\left | Xi-\mu k \right |^2   其中\mu k是第k个质心的位置。

3、规则法:K=\sqrt{n/2}     (此种方法存在一定的缺点:可能导致聚类的数目较大)

下面来说说Kmeans算法的模型效果评估,模型算法的评估主要是从以下几个方面来进行度量(当然还有其他的指标):

1、样本离最近聚类中心的总和(inertias)

inertias:其是K均值模型对象的属性,表示样本距离最近的聚类中心的总和,它是作为在没有真实分类标签下的非监督式评估指标,该值越小越好,值越小证明样本在类间的分布越集中,即类内的距离越小。

2、轮廓系数

轮廓系数:它用来计算所有样本的平均轮廓系数,使用平均群内距离和每个样本的平均最近簇距离来计算,它是一种非监督式评估指标。其最高值为1,最差值为-1,0附近的值表示重叠的聚类,负值通常表示样本已被分配到错误的集群。

3、兰德指数

调整后的兰德指数:兰德指数通过考虑在预测和真实聚类中在相同或不同的聚类中分配的所有样本对和计数对来计算两个聚类之间的相似性度量。调整后的兰德指数通过对兰德指数的调整得到独立于样本量和类别的接近于0的值,其取值范围为[-1,1],负数代表结果不好,越接近于1越好意味着聚类结果与真实情况吻合。

4、同质化得分

同质化得分(Homogeneity),如果所有的聚类都只包含属于单个类的成员的数据点,则聚类结果将满足同质性。其取值范围[0,1]值越大意味着聚类结果与真实情况越吻合。

优缺点小结

优点:1、原理简单,容易实现且收敛速度快。

2、聚类效果较好

缺点也很明显:

1、K值得选取不好确定

2、对于不是凸的数据集比较难收敛

3、如果各隐含类别的数据不平衡,比如各隐含类别的数据量严重失衡,或者各隐含类别的方差不同,则聚类效果较差

4、采用迭代方法,得到的结果只是局部最优。

5、对噪音和异常点比较的敏感

代码实例:

import numpy as np    
import matplotlib.pyplot as plt  
from sklearn.cluster import KMeans
from scipy.spatial.distance import cdist
from sklearn import metrics  #导入sklearn效果评估模块

#导入相关数据
raw_data=np.loadtxt('D:\data\chapter4\cluster.txt')
X=raw_data[:,:-1]     #分割要聚类的数据
y_true=raw_data[:,-1] 

#确定要聚类的数目:肘部法则
X=raw_data[:,:-1]   #分割要聚类的数据
y_true=raw_data[:,-1]  
plt.figure()
plt.axis([0, 2.5, 0, 2.5])
plt.grid(True)
plt.plot(X[:,0],X[:,1],'k.')

K = range(1, 10)
meandistortions = []
for k in K:
    kmeans = KMeans(n_clusters=k)
    kmeans.fit(X)
    meandistortions.append(sum(np.min(cdist(X, kmeans.cluster_centers_, 'euclidean'), axis=1)) / X.shape[0])
plt.plot(K, meandistortions, 'bx-')
plt.xlabel('k')
plt.ylabel('meandistortions')
plt.title('best K of the model');

#训练聚类模型
n_clusters=3  #设置聚类数量
model_kmeans=KMeans(n_clusters=n_clusters,random_state=0)  #建立聚类模型对象
model_kmeans.fit(X)            #训练聚类模型
y_pre=model_kmeans.predict(X)  #预测聚类模型

#模型效果评估
n_samples,n_features=X.shape     #总样本量,总特征数
inertias=model_kmeans.inertia_   #样本距离最近的聚类中心的总和
adjusted_rand_s=metrics.adjusted_rand_score(y_true,y_pre)           #调整后的兰德指数
homogeneity_s=metrics.homogeneity_score(y_true,y_pre)               #同质化得分
silhouette_s=metrics.silhouette_score(X,y_pre,metric='euclidean')   #平均轮廓系数

#模型效果可视化
centers=model_kmeans.cluster_centers_  #各类别中心
colors=['#4EACC5','#FF9C34','#4E9A06']   #设置不同类别的颜色
plt.figure()    #建立画布
for i in range(n_clusters):    #循环读取类别
    index_sets=np.where(y_pre==i)  #找到相同类的索引集合、
    cluster=X[index_sets]   #将相同类的数据划分为一个聚类子集
    plt.scatter(cluster[:,0],cluster[:,1],c=colors[i],marker='.')   #展示聚类子集内的样本点
    plt.plot(centers[i][0],centers[i][1],'o',markerfacecolor=colors[i]
             ,markeredgecolor='k',markersize=6) #展示各聚类子集的中心
plt.show()     #展示图像

肘部法确定K值:

从图中可以看出K值应该取3。

#模型效果评估:

ine     ARI     homo    silh
300     0.96    0.94    0.63
----------------------------------------------------------------------
ine         inertias
ARI        adjuster_rand_s
homo     homogeneity_s
silh         silhouette_s
----------------------------------------------------------------------

模型效果的可视化:

从上表和图中可以看出,兰德指数得分0.96、平均轮廓系数得分0.94,轮廓系数0.63,说明聚类效果较好。

 

  • 8
    点赞
  • 104
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
机器学习&深度学习资料笔记&基本算法实现&资源整理.zip 0.不调库系列 No free lunch. 线性回归 - logistic回归 - 感知机 - SVM(SMO) - 神经网络 决策树 - Adaboost kNN - 朴素贝叶斯 EM - HMM - 条件随机场 kMeans - PCA ROC曲线&AUC值 Stacking(demo) 计算IOU 参考:《机器学习》周志华 《统计学习方法》李航 1.机器学习&深度学习 工具 | 书籍 | 课程 | 比赛 | 框架 ---------|---------------|-------------|-------- |--------- Scikit-learn| 机器学习实战 | 机器学习/Andrew Ng | Kaggle | Keras ★ XGBoost | 集体智慧编程 | Deep Learning/Andrew Ng | 天池 | Tensorflow LightGBM | | | Biendata | PyTorch ★ Spark| | | AI challenge |Mxnet | | | | DataFountain | Caffe 2.自然语言处理 课程:自然语言处理班 - 七月在线 | CS224n 工具:NLTK | jieba | gensim | NLPIR | word2vec | LDA | BLEU(介绍、使用) 代码:社交网络语言re | 经典项目: funNLP AI写诗 对话系统DeepQA Awesome-Chinese-NLP NLP知识点整理>> 3.计算机视觉 常用代码 常用预处理:打乱数据集 | 计算图像均值方差 | 分类数据增强 | 检测数据增强 数据集相关:生成VOC目录结构 | 标签转xml写入 | coco txt转voc xml | 可视化VOC标签框 | 更新训练验证txt图片名 | VOC转csv格式 | 计算csv格式数据合适的anchor | labelme标注的人体17点json转COCO 常用算法:NMS | Mixup | label_smoothing | Weighted-Boxes-Fusion(NMS,WBF..) | mAP计算 | IOU计算 | YOLO F1 其他 课程: CS231n/Feifei Li 笔记: chinese-ocr项目 | 《深度卷积网络:原理与实践》读书笔记 | 手写汉字识别调研 经典分类网络: LeNet-5 | AlexNet | VGGNet | GoogleNet | ResNet | DenseNet | Xception | EfficientNet 经典检测网络: SSD(自己实现)| FasterRCNN | Yolo | CornerNet | CenterNet | EfficientDet 经典分割网络:Unet | DeepLab | 谷歌bodypix(走通了tfjs转onnx转tnn安卓部署的流程,但是实时精度不高) 经典项目: HyperLPR车牌识别 中文OCR1(YOLOv3+CRNN) 中文OCR2(CTPN + DenseNet) RFBNet(ECCV2018快速目标检测) AlphaPose(人体姿态估计) 轻量级性别年龄分类模型 图像风格迁移 超分辨率 Mask_RCNN人体关键点、分割 人像卡通化 移动端人脸检测1:libface | 移动端人脸检测2:Ultra Face 人脸识别facenet-tf(2018) | 人脸识别facenet-pth(2018) | AdaFace(2022) 人脸关键点pth版 CV知识点整理>> 4.数据挖掘 笔记:特征工程 常见数学、机器学习知识点整理>> 5.其他 资源索引

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值