15、分层聚类(与kmeans对比)以及连通性、

一、分层聚类

1具体介绍

image.png
  • 生成结构化的层次
  • 分层聚类--又叫系统聚类法
  • 具体的做法:
    1.开始吧每个样品作为一类
    2.然后把嘴靠近的样品(即距离最小的群品)首先聚为小类
    3.再将已聚合的小类按其类间距离再合并,并且如此不断的重复下去,最后把一切子类聚合到一个大类。

2距离的计算方式

  • 自底向上的合并算法:


    自底向上的合并算法.png
  • 两个组合数据点间的距离:
    (1)single linkage:


    single.png

    (2)complete linkage:


    complete.png

    (3)average linkage:
    average.png

    image.png

    公式.png

3 与kmeans对比

  • 与kmeans对比,kmeans是平面化的结果,没有分层聚类的层次化的结构。
  • 如何选择:


    选择.png

4 连通性

image.png
  • 连通性约束就是控制邻居的数量来实现的。

代码:


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)
output_1_0.png
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)
output_2_0.png
# 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)
output_3_0.png

分层聚类中连通性约束

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)
output_9_0.png
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)
output_11_0.png
# 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)
output_12_0.png

你可能感兴趣的:(15、分层聚类(与kmeans对比)以及连通性、)