机器学习 jupyter Python无监督学习 聚类 k-meas算法

1.有监督学习与无监督学习

1.1 有监督学习

又称监督学习,就是人们常说的分类,通过已有的训练样本(即已知数据以及其对应的输出)去训练得到一个最优模型,再利用这个模型将所有的输入映射为相应的输出。

1.2 无监督学习

无监督学习(也有人叫非监督学习,反正都差不多)则是另一种研究的比较多的学习方法,它与监督学习的不同之处,在于我们事先没有任何训练样本(训练集),而需要直接对数据进行建模。

2.聚类

2.1 聚类和分类的区别

在这里插入图片描述
聚类和分类的区别:聚类是无监督学习任务,不知道真实的样本标记,只把相似度高的样本聚合在一起分类是监督学习任务,利用已知的样本标记训练学习器预测未知样本的类别。

2.2 聚类的作用

2.2.1 寻找优质用户

在这里插入图片描述

2.2.2 社区发现

在这里插入图片描述
比如将每一个看作一个人,这些人之间存在这联系,我们把联系比较多的聚成一个类别,认为是同一个社群

2.2.3 异常点监控

在这里插入图片描述
将银行后台数据归类为两个类别,比如正常一个类别,不正常一个类别。大多数情况下,数据都会归为正常类别的那一个类,但是出现异常点的时候,就会归为另一个类别,所以这个点可能是信用卡诈骗或者是黑客攻击。
例如将后台数据分成一个个特征,根据这些特征做聚类。然后发现异常点。

3.常见的聚类算法(k-means算法)

3.1 算法核心

算法接受参数K;然后将事先输入的n个数据对象划分成k个聚类。使得所获得聚类满足:同一聚类中的对象相似度较高;而不同聚类中的对象相似度较低。(物以类聚)

3.2 算法思想

以空间中k个样本点为中心进行聚类,对最靠近他们的对象归类。通过迭代的方法,逐步更新各聚类中心的值,直至找得到最好的聚类结果。

3.3 算法步骤

3.3.1 先从没有标签的元素集合A中随机选K个元素,作为k个子集(簇)各自的重心。注:所有样本点的初识簇可以为0
3.3.2 分别计算所有的样本点到k个子集重心的距离(这里的距离可以是欧式距离),根据距离将样本划分到距离最近的子集。(注:求样本点到所有质心的距离)
3.3.3根据聚类的结果,重新计算重心(重心的计算方法是计算各子集中所有样本各个维度的算数平均值)
(4)重复第2步,即将集合A中的所有元素按照新的质心重新聚类。
(5)重复第4步,直至聚类结果不再发生变化。(就是所有的样本点所属的簇不再发生变化)

4.深入理解k-means算法

4.1 取4个点(1,1),(2,1),(4,3),(5,4)
在这里插入图片描述
假设取(1,1),(2,1)为两个分类中心点
4.2 计算各个点到质心的距离,并把他们分簇
在这里插入图片描述
0是点(1,1)到分类中心点(1,1)的距离,
1是点(2,1)到分类中心点(1,1)的距离,
3.61是点(4,3)到分类中心点(1,1)的距离,
5是点(5,4)到分类中心点(1,1)的距离;

1是点(1,1)到分类中心点(2,1)的距离,
0是点(2,1)到分类中心点(2,1)的距离,
2.83是点(4,3)到分类中心点(2,1)的距离
4.24是点(5,4)到分类中心点(2,1)的距离。

在这里插入图片描述
0<1,说明(1,1)距离分类中心点(1,1)近,所以将(1,1)分为第一簇,
1>0,说明(2,1)距离分类中心点(2,1)近,所以将(2,1)分为第二簇,
3.61>2.83,说明(4,3)距离分类中心点(2,1)近,所以将(4,3)分为第二簇,
5>4.24,说明(5,4)距离分类中心点(2,1)近,所以将(5,4)分为第二簇。
在这里插入图片描述
最后,更换分类中心点,分类中心点变为(1,1),(11/3,8/3)。
问题1:为什么不停止计算呢?
答:算法终止的判定条件:样本所属的簇不再发生变化,算法终止。
4.3 第二次计算各个点到质心的距离,并把他们分簇
在这里插入图片描述
在这里插入图片描述
0是点(1,1)到分类中心点(1,1)的距离,
1是点(2,1)到分类中心点(1,1)的距离,
3.61是点(4,3)到分类中心点(1,1)的距离,
5是点(5,4)到分类中心点(1,1)的距离;

3.14是点(1,1)到分类中心点(11/3,8/3)的距离,
2.36是点(2,1)到分类中心点(11/3,8/3)的距离,
0.47是点(4,3)到分类中心点(11/3,8/3)的距离,
1.89是点(5,4)到分类中心点(11/3,8/3)的距离。

在这里插入图片描述
0<3.14,说明(1,1)距离分类中心点(1,1)近,所以将(1,1)分为第一簇,
1<2.36,说明(2,1)距离分类中心点(1,1)近,所以将(2,1)分为第一簇,
3.61>0.47,说明(4,3)距离分类中心点(11/3,8/3近,所以将(4,3)分为第二簇,
1<2.36,说明(5,4)距离分类中心点(11/3,8/3近,所以将(5,4)分为第二簇。

在这里插入图片描述
最后,更换分类中心点,分类中心点变为(3/2,1),(9/2,7/2)。
4.4 第三次计算各个点到质心的距离,并把他们分簇
在这里插入图片描述
在这里插入图片描述
0.5是点(1,1)到分类中心点(3/2,1)的距离,
1是点(2,1)到分类中心点(3/2,1)的距离,
3.61是点(4,3)到分类中心点(3/2,1)的距离,
5是点(5,4)到分类中心点(3/2,1)的距离;

4.30是点(1,1)到分类中心点(9/2,7/2)的距离,
3.54是点(2,1)到分类中心点(9/2,7/2)的距离,
0.71是点(4,3)到分类中心点(9/2,7/2)的距离,
0.71是点(5,4)到分类中心点(9/2,7/2)的距离。
在这里插入图片描述
0.5<4.30,说明(1,1)距离分类中心点(1,1)近,所以将(1,1)分为第一簇,
0.5<3.54,说明(2,1)距离分类中心点(1,1)近,所以将(2,1)分为第一簇,
3.20>0.7,说明(4,3)距离分类中心点(11/3,8/3近,所以将(4,3)分为第二簇,
4.61<0.71,说明(5,4)距离分类中心点(11/3,8/3近,所以将(5,4)分为第二簇。
聚类不发生变化,算法迭代停止

5.具体案列

5.1 问题

根据数据集testSet2.txt,利用sklearn里的Kmeans算法完成聚类分类,并画出图形。
testSet2.txt部分展示:
在这里插入图片描述

5.2 思路

5.2.1导入相关包

import numpy as np
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

5.2.2 画出散点图,并建立模型和训练模型,计算分类中心点和分簇结果

dataSet=np.genfromtxt('testSet2.txt')#读取文件
plt.scatter(dataSet[:,0],dataSet[:,1],c='r')#画出散点图
KM=KMeans(n_clusters=4)#根据散点图大致确定为4簇,n_clusters簇数
KM.fit(dataSet)#训练数据
centers=KM.cluster_centers_#这里是最终的聚类分类点的分类中心点
print(centers)
result=KM.predict(dataSet)#预测结果
print('分簇的结果',result)
# print(KM.labels_)

在这里插入图片描述
在这里插入图片描述

5.2.3 画图。分类之后的图和分类中心点

#画图
#画样本点
#属于第一簇的样本点用红色三角表示。。。。。。。
mark=['^r','sb','*g','oy']
for i,d in enumerate(dataSet):
    #enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
    #d[0],d[1]是样本点的横纵坐标,分簇的结果为0,1,2,3,所以可以和mark对应上
    plt.plot(d[0],d[1],mark[result[i]])
#画出分类中心点    
markcentor=['+r','+b','+g','+y']
for i,centor in enumerate(centers):
    #centor[0],centor[1]是一个质心的横纵坐标。
    plt.plot(centor[0],centor[1],markcentor[i],markersize=30)

在这里插入图片描述
注:想了解k-means生动化过程点击这里

  • 2
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值