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
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一年前需要用聚类算法时,自己从一些sklearn文档和博客粗略整理了一些相关的知识,记录在电子笔记里备忘,现在发到...
    wong11阅读 44,679评论 0 19
  • 无监督学习(Unsupervised learning):训练样本的标记信息是未知的,目标是为了揭露训练样本的内在...
    王阿根阅读 45,309评论 5 17
  • (一)什么是聚类 聚类,将相似的事物聚集在一起,将不相似的事物划分到不同的类别的过程。是将复杂数据简化为少数类别的...
    11的雾阅读 22,157评论 0 8
  • 一. git仓库添加协作者 进入某远端仓库setting–>collaborators–>search and a...
    南三号阅读 3,701评论 0 2
  • 舒缓:至少还能周转一下,这个月出门,好好赚钱, 感赏:在这样大家出不了门的情况下,我还有老公陪我玩牌,哄着我开心 ...
    谭舒鸿阅读 734评论 0 0