# --- 凝聚层次聚类
# 概念含义: 层次聚类算法结构类似一棵树,分为 自上而下,和自下而上两种;
# 自下而上: 将每个数据点视为一个单独集群,不断合并,直到全部合为一个类
# 自上而下: 自下而上的反向逻辑即可。
#------- 加载必要的库
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import AgglomerativeClustering
from sklearn.neighbors import kneighbors_graph
#------- 定义一个实现凝聚层次聚类的函数
def pf_clustering(x,connectivity,title,num_clusters=3,linkage='ward'):
plt.figure()
model=AgglomerativeClustering(linkage=linkage,connectivity=connectivity,n_clusters=num_clusters)# 建立模型
model.fit(x)# 训练样本
labels=model.labels_# 获取标记,然后指定不同聚类的图形标记
markers='.vx'
color='rgb'
# 循环作图
plt.figure()
for i,marker in zip(labels,markers):
plt.scatter(x[labels==i,0],x[labels==i,1],marker=marker,color=color,s=5)# 画出前4群点
plt.title(title)
#-------对数据增加随机性噪声
def add_noise(x,y,amplitude):
x=np.concatenate((x,y))# 接收进来的参数x 和 参数 y 组合成 (x,y)的成对数据
return x.T
#------- 生成空间第一组数据
def get_spiral(t,noise_amplitude=0.5):
r=t
x=r*np.cos(t)
y=r*np.sin(t)
plt.figure()
plt.scatter(x.T,y.T,s=5)
return add_noise(x,y,noise_amplitude)
#------- 生成空间第二组数据
def get_rose(t,noise_amplitude=0.02):
k=5
r=np.cos(k*t)+0.25
x=r*np.cos(t)
y=r*np.sin(t)
plt.figure()
plt.scatter(x.T,y.T,s=5)
return add_noise(x,y,noise_amplitude)
#------ 生成空间第三组数据
def get_hy(t,noise_amplitude=0):
a,b,h=10.0,2.0,4.0
x=(a-b)*np.cos(t)+h*np.cos((a-b)/b*t)
y=(a-b)*np.sin(t)+h*np.sin((a-b)/b*t)
plt.figure()
plt.scatter(x.T,y.T,s=5)
return add_noise(x,y,0)
#------ 定义主函数
if __name__=='__main__':
# 生成数据
n_samples=500# 定义样本量个数
x=get_spiral(t)
# 不考虑螺旋形的数据连接性
connectivity=None
# 第一组数据情况
x=get_spiral(t)
生成的数据数据图:
pf_clustering(x,connectivity,'No connectivity')
聚类后类别图:
# 第二组数据情况
x=get_rose(t)
生成的数据数据图:
pf_clustering(x,connectivity,'No connectivity')
分类算法下分类图:
# 第三组数据情况
x=get_hy(t)
生成数据数据图:
pf_clustering(x,connectivity,'No connectivity')
聚类后类别图:
领取专属 10元无门槛券
私享最新 技术干货