一、分层聚类
1具体介绍
- 生成结构化的层次
- 分层聚类--又叫系统聚类法
- 具体的做法:
1.开始吧每个样品作为一类
2.然后把嘴靠近的样品(即距离最小的群品)首先聚为小类
3.再将已聚合的小类按其类间距离再合并,并且如此不断的重复下去,最后把一切子类聚合到一个大类。
2距离的计算方式
-
自底向上的合并算法:
-
两个组合数据点间的距离:
(1)single linkage:
(2)complete linkage:
(3)average linkage:
3 与kmeans对比
- 与kmeans对比,kmeans是平面化的结果,没有分层聚类的层次化的结构。
-
如何选择:
4 连通性
- 连通性约束就是控制邻居的数量来实现的。
代码:
import numpy as np
# 凝聚:自下而上
from sklearn.cluster import AgglomerativeClustering
from sklearn import datasets
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d.axes3d import Axes3D#三维图形
from sklearn.cluster import KMeans
d:\python3.7.4\lib\importlib\_bootstrap.py:219: RuntimeWarning: numpy.ufunc size changed, may indicate binary incompatibility. Expected 192 from C header, got 216 from PyObject
return f(*args, **kwds)
X,y = datasets.make_swiss_roll(n_samples=1500,noise = 0.05)
fig = plt.figure()
a3 = Axes3D(fig)
a3.scatter(X[:,0],X[:,1],X[:,2],c = y)
a3.view_init(10,-80)
agg = AgglomerativeClustering(n_clusters=6,linkage='ward')# 最近的距离,作为标准,
agg.fit(X)
y_ = agg.labels_
fig = plt.figure()
a3 = Axes3D(fig)
a3.scatter(X[:,0],X[:,1],X[:,2],c = y_)
a3.view_init(10,-80)
# Kmeans只负责分类,随机性,类别是数字几,不固定
clf = KMeans(n_clusters=6)
clf.fit(X)
y_ = clf.labels_
fig = plt.figure()
a3 = Axes3D(fig)
a3.scatter(X[:,0],X[:,1],X[:,2],c = y_)
a3.view_init(10,-80)
分层聚类中连通性约束
from sklearn.neighbors import kneighbors_graph# graph图形的意思
## 调整数据
X[:,1] *= 0.5 #Y轴方向上的距离缩小了一半,距离变近、变小
什么时候,用连通性约束呢???
尝试一下,用和不用哪个好!
import warnings
warnings.filterwarnings('ignore')
# 邻居数量变少,认为,条件宽松
conn = kneighbors_graph(X,n_neighbors=10) #采用邻居,进行约束
agg = AgglomerativeClustering(n_clusters=6,connectivity=conn,linkage='ward')# 最近的距离,作为标准,
agg.fit(X)
y_ = agg.labels_
fig = plt.figure()
a3 = Axes3D(fig)
a3.scatter(X[:,0],X[:,1],X[:,2],c = y_)
a3.view_init(10,-80)
for i in range(6):
print(i,(y_ == i).sum())
0 1489
1 2
2 2
3 3
4 2
5 2
# 没有连接性约束结果
agg = AgglomerativeClustering(n_clusters=6,linkage='ward')# 最近的距离,作为标准,
agg.fit(X)
y_ = agg.labels_
fig = plt.figure()
a3 = Axes3D(fig)
a3.scatter(X[:,0],X[:,1],X[:,2],c = y_)
a3.view_init(10,-80)
# Kmeans只负责分类,随机性,类别是数字几,不固定
clf = KMeans(n_clusters=6)
clf.fit(X)
y_ = clf.labels_
fig = plt.figure()
a3 = Axes3D(fig)
a3.scatter(X[:,0],X[:,1],X[:,2],c = y_)
a3.view_init(10,-80)