[Python][机器学习]基础聚类算法(K-means 、AHC 、DBSCAN )简介及可视化代码
之前写的⼊门级介绍,有点久远有些ref不着了
⽂章⽬录简介根据在数据中发现的描述对象及其关系的信息,将数据对象分组。
对⼤量未知标注的数据集,按数据的内在相似性将数据集划分为多个类别,使类别内的数据相似度极⼤⽽类别间的数据相似度极⼩。⽬标
组内的对象相互之间是相似的,不同组中的对象是不同的。
作⽤
1. 易于理解
⽣物学:界门纲⽬科属种
信息检索:搜索引擎返回结果分类
商业:对客户进⾏分类
2. 更加实⽤
降维:样本数的降维、特征数的降维
发现最近邻:减少计算量
类型
分类
解释
层次的划分的
层次的: 嵌套的,树状,可在不同层次上得到不同数⽬的类别。划分的: ⾮嵌套的。每个样本恰在⼀个⼦集中。
互斥的重叠的模糊的
互斥的: 每个样本仅在⼀个类中。重叠的: ⼀个样本可同时属于多个类。
模糊的: 每个样本以0(绝对不属于)和1(绝对属于)之间的权值属于每个类。完全的
部分的完全的: 每个样本⾄少属于⼀个类。部分的: 部分样本不属于任何⼀个类,如噪声、离点等。
聚类vs 分类
vs
random pythonvs
vs
vs
import random
import matplotlib.pyplot as plt
import pandas as pd
from sklearn import datasets
from pandas import DataFrame
# 造数据
# 圈圈
noisy_circles=datasets.make_circles(n_samples=1000,factor=.5,noise=.05)
circle = DataFrame()
circle['x1']= noisy_circles[0][:,0]
circle['x2']= noisy_circles[0][:,1]
circle['label']= noisy_circles[1]
# 堆堆
def random_sample(num, mean, st):
'''
num:个数
mean:均值
st:标准差
'''
sample =[]
i =0
while i < num:
sample.append(random.gauss(mean, st))
i +=1
return sample
num =300
sample_0 = pd.DataFrame({'x1':random_sample(num,4,0.5),'x2': random_sample(num,4,0.5),'y':[0for
i in range(num)]}) sample_1 = pd.DataFrame({'x1':random_sample(num,2,0.5),'x2': random_sample(num,2,0.5),'y':[1for i in range(num)]}) sample = pd.concat([sample_0, sample_1])
# 聚类vs分类
plt.figure(figsize=(16,8))
plt.subplot(1,2,1)
plt.scatter(sample_0['x1'], sample_0['x2'], marker ='o', c ='k')
plt.scatter(sample_1['x1'], sample_1['x2'], marker ='o', c ='k')
plt.title('聚类(⽆监督)', fontsize =25)
plt.subplot(1,2,2)
plt.scatter(sample_0['x1'], sample_0['x2'], marker ='o', c ='b')
plt.scatter(sample_1['x1'], sample_1['x2'], marker ='o', c ='r')
plt.title('分类(有监督)', fontsize =25)
plt.show()
K-means
[K-means] 伪代码
>>>>>>>##
1. 选择个点作为初始质⼼。
2. repeat
3. 将每个点指派到最近的质⼼,形成个簇。
4. 重新计算每个簇的质⼼。
5. until 质⼼不发⽣变化。
>>>>>>>##
[K-means] 过程详解
ref:
# 修改
data = sample
repeat = 20
# ================开始================
# 导⼊数据
points = [[data .iloc [i ].x1, data .iloc [i ].x2] for i in range (len (data ))]
# 初始质⼼
currentCenter1 = [data .x1.min () + (data .x1.max ()-data .x1.min ())*random .random (), data .x1.min () + (data .x2.max ()-data .x2.min ())*random .random ()]currentCenter2 = [data .x1.min () + (data .x1.max ()-data .x1.min ())*random .random (), data .x1.min () + (data .x2.max ()-data .x2.min ())*random .random ()]# 记录每次迭代后每个簇的质⼼的更新轨迹
center1 = [currentCenter1]; center2 = [currentCenter2]
# 丢点图
plt .figure (figsize =(18,18))
ax = plt .subplot (3,3, 1)
change_ax (ax )
plt .title ('step 0', fontsize = 15)
plt .plot ([eachpoint [0] for eachpoint in points ], [eachpoint [1] for eachpoint in points ], '.', color ='grey')
k k
plt.plot([eachpoint[0]for eachpoint in points],[eachpoint[1]for eachpoint in points],'.', color='grey')
plt.scatter([eachcenter[0]for eachcenter in center1],[eachcenter[1]for eachcenter in center1], marker='x', c='b', s=100)
plt.scatter([eachcenter[0]for eachcenter in center2],[eachcenter[1]for eachcenter in center2], marker='x', c='g', s=100)
# 两个簇
group1 =[]; group2 =[]
for runtime in range(repeat):
group1 =[]; group2 =[]
for eachpoint in points:
# 计算每个点到质⼼的距离
distance1 =pow(abs(eachpoint[0]-currentCenter1[0]),2)+pow(abs(eachpoint[1]-currentCenter1[1]),2)
distance2 =pow(abs(eachpoint[0]-currentCenter2[0]),2)+pow(abs(eachpoint[1]-currentCenter2[1]),2)
# 将该点指派到离它最近的质⼼所在的簇
mindis =min(distance1,distance2)
if(mindis == distance1):
group1.append(eachpoint)
else:
group2.append(eachpoint)
if runtime <5or runtime >(repeat -4):
# 只可视化前五次最后三次
if runtime <5:
ax = plt.subplot(3,3, runtime+2)
change_ax(ax)
plt.title('step %d'%(runtime+1), fontsize =15)
else:
ax = plt.subplot(3,3,10-repeat+runtime)
change_ax(ax)
plt.title('step %d'%(runtime+1), fontsize =15)
# 打印所有的点,⽤颜⾊标识该点所属的簇
plt.plot([eachpoint[0]for eachpoint in group1],[eachpoint[1]for eachpoint in group1],'.', color='lightsteelblue')#, linewidth=1)
plt.plot([eachpoint[0]for eachpoint in group2],[eachpoint[1]for eachpoint in group2],'.', color='lightgreen')#, linewidth=0.3)
# 画质⼼
plt.plot([eachcenter[0]for eachcenter in center1],[eachcenter[1]for eachcenter in center1],'bx')
plt.plot([eachcenter[0]for eachcenter in center1],[eachcenter[1]for eachcenter in center1],'b--', linewidth=0.5)
plt.plot([eachcenter[0]for eachcenter in center2],[eachcenter[1]for eachcenter in center2],'gx')
plt.plot([eachcenter[0]for eachcenter in center2],[eachcenter[1]for eachcenter in center2],'g--', linewidth=0.5)
# 指派完所有的点后,更新每个簇的质⼼
currentCenter1 =[sum([eachpoint[0]for eachpoint in group1])/len(group1),sum([eachpoint[1]for eachpoint in group1])/len(group1)] currentCenter2 =[sum([eachpoint[0]for eachpoint in group2])/len(group2),sum([eachpoint[1]for eachpoint in group2])/len(group2)]
# 记录该次对质⼼的更新
center1.append(currentCenter1)
center2.append(currentCenter2)
plt.show()
[K-means] 初始点的选择
1. 随机选取
2. 在选取第⼀个聚类中⼼时同样通过随机的⽅法。
假设已经选取了个初始聚类中⼼,则在选取第个聚类中⼼时:距离当前个聚类中⼼越远的点会有更⾼的概率被选为第个聚类中⼼。
3. 结合其他算法
选⽤层次聚类或算法进⾏初始聚类,然后从个类别中分别随机选取个点,来作为的初始聚类中⼼点。
[K-means] 距离的度量kmeans ++
(n =1)n (0<n <k )n +1n n +1Canopy k k kmeans
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
python伪随机数生成算法
« 上一篇
蜣螂算法 python代码
下一篇 »
发表评论