机器学习算法--python实现用SciPy进行全连接的凝聚层次聚类算法

本文介绍了全连接的凝聚层次聚类算法,通过Scipy库实现,步骤包括计算样本间的欧氏距离矩阵,使用'complete'方法合并最近的集群,并可视化层次聚类树。通过随机生成的样本数据展示了算法的具体操作和结果。
摘要由CSDN通过智能技术生成

现研究另一种基于原型的聚类算法-全连接的凝聚层次聚类算法。其中三个概念分别代表:
层次聚类:它允许绘制树状图(二进制层次聚类的可视化);不需要预先指定集群数目。
凝聚聚类:首先从每个集群包括单个样本开始,合并最接近的集群,直到只剩下一个集群为止。
全连接方法:计算两个集群中最不相似的成员之间的距离,然后合并两个集群即比较最不相似的成员然后合并。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.spatial.distance import pdist, squareform
from scipy.cluster.hierarchy import linkage
from scipy.cluster.hierarchy import dendrogram

# 随机生成样本
np.random.seed(123)
variables = ['X', 'Y', 'Z']
labels = ['ID_0', 'ID_1', 'ID_2', 'ID_3', 'ID_4']

X = np.random.random_sample([5, 3])*10
df = pd.DataFrame(X, columns=variables, index=labels)
print(df)

# 用SciPy的spatial.distance子模块的pdist函数计算距离矩阵作为层次聚类算法的输入
row_dist = pd.DataFrame(squareform(pdist(df, metric='euclidean')),  # 欧氏距离
                        columns=labels,
                        index=labels)
print(row_dist)

# 调用SciPy中的cluster.hiera-rchy子模块的linkage函数来应用全连接凝聚方法处理集群,
# 处理结果将返回在所谓的连接矩阵中。
# print(help(linkage))  # 查看方法
row_clusters = linkage(pdist(df, metric='euclidean'),
                       method='complete', metric='euclidean')  # 全连接+欧氏距离,返回值:连接矩阵
'''
连接矩阵:
连接矩阵由若干行组成,其中每行代表一个合并。
第一列和第二列代表每个集群中相似度最低的成员,第三列报告这些成员之间的距离。
最后一列返回每个集群成员的个数
'''
print(pd.DataFrame(row_clusters,
             columns=['row label 1', 'row label 2',
                      'distance', 'no. of items in clust.'],
             index=['cluster %d' % (i + 1)
                    for i in range(row_clusters.shape[0])]))

# 层次聚类树状图
row_dendr = dendrogram(row_clusters,
                       labels=labels,
                       # make dendrogram black (part 2/2)
                       # color_threshold=np.inf
                       )
plt.tight_layout()
plt.ylabel('Euclidean distance')
#plt.savefig('images/11_11.png', dpi=300,
#            bbox_inches='tight')
# plt.show()

# 把树状图附加到热度图
fig = plt.figure(figsize=(8, 8), facecolor='white')  # facecolor:背景颜色
# add_axes为新增子区域,该区域可以座落在figure内任意位置,且该区域可任意设置大小
# 可以用来做一些子图,图中图
axd = fig.add_axes([0.09, 0.1, 0.2, 0.6])
row_dendr2 = dendrogram(row_clusters, orientation='left')  # orientation:指定方向
df_rowclust = df.iloc[row_dendr2['leaves'][::-1]]

# 根据排序后的DataFrame构建热度图
# 热度图中行的顺序反映了树状图中样本的聚类情况
# 热度图中每个样本的颜色编码和特征为数据集做很好的概括
axm = fig.add_axes([0.23, 0.1, 0.6, 0.6])  # x-pos, y-pos, width, height
'''interpolation:使用的插值方法
   cmap:hot_r,其中_r的意思是就是按照颜色越深,数值越大,
   如果想数值越大,颜色越浅,只需要去掉_r,直接为hot就行。
   同时这个hot是热图配色的其中一个主题,主题色参数可选:
        hot 从黑平滑过度到红、橙色和黄色的背景色,然后到白色。
        cool 包含青绿色和品红色的阴影色。从青绿色平滑变化到品红色。
        gray 返回线性灰度色图。
        bone 具有较高的蓝色成分的灰度色图。该色图用于对灰度图添加电子的视图。
        white 全白的单色色图。 
        spring 包含品红和黄的阴影颜色。 
        summer 包含绿和黄的阴影颜色。
        autumn 从红色平滑变化到橙色,然后到黄色。 
        winter 包含蓝和绿的阴影色。
'''
cax = axm.matshow(df_rowclust, interpolation='nearest', cmap='hot_r')

# 去除坐标轴的间隔标记和隐藏坐标轴的轴线来美化修树状图
axd.set_xticks([])
axd.set_yticks([])
# 隐藏树状图边框
for i in axd.spines.values():
    i.set_visible(False)
# 添加颜色条
fig.colorbar(cax)
axm.set_xticklabels([''] + list(df_rowclust.columns))
axm.set_yticklabels([''] + list(df_rowclust.index))
#plt.savefig('images/11_12.png', dpi=300)
plt.show()
print(axd.spines.values())

运行结果:
X Y Z
ID_0 6.964692 2.861393 2.268515
ID_1 5.513148 7.194690 4.231065
ID_2 9.807642 6.848297 4.809319
ID_3 3.921175 3.431780 7.290497
ID_4 4.385722 0.596779 3.980443
ID_0 ID_1 ID_2 ID_3 ID_4
ID_0 0.000000 4.973534 5.516653 5.899885 3.835396
ID_1 4.973534 0.000000 4.347073 5.104311 6.698233
ID_2 5.516653 4.347073 0.000000 7.244262 8.316594
ID_3 5.899885 5.104311 7.244262 0.000000 4.382864
ID_4 3.835396 6.698233 8.316594 4.382864 0.000000
row label 1 row label 2 distance no. of items in clust.
cluster 1 0.0 4.0 3.835396 2.0
cluster 2 1.0 2.0 4.347073 2.0
cluster 3 3.0 5.0 5.899885 3.0
cluster 4 6.0 7.0 8.316594 5.0

odict_values([<matplotlib.spines.Spine object at 0x00000138B5584DF0>, <matplotlib.spines.Spine object at 0x00000138B5584EE0>, <matplotlib.spines.Spine object at 0x00000138B5584FD0>, <matplotlib.spines.Spine object at 0x00000138B559B100>])

运行结果图:
在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 层次聚类是一种无监督学习算法,它可以将数据集中的样本分成具有相似性的若干个簇。以下是使用Python实现层次聚类算法的示例代码: ``` import numpy as np from scipy.spatial.distance import pdist from scipy.cluster.hierarchy import dendrogram, linkage # 生成一个样本数据集 X = np.array([[1, 2], [1.5, 1.8], [5, 8], [8, 8], [1, 0.6], [9, 11]]) # 计算距离矩阵 dist_matrix = pdist(X) # 使用“ward”方法进行层次聚类 Z = linkage(dist_matrix, 'ward') # 生成树状图 dendrogram(Z) # 显示树状图 import matplotlib.pyplot as plt plt.show() ``` 在上面的代码中,我们首先生成了一个样本数据集,然后使用`pdist`函数计算距离矩阵。接着,我们使用`linkage`函数使用“ward”方法进行层次聚类。最后,我们使用`dendrogram`函数生成树状图并使用`matplotlib`库显示出来。 需要注意的是,由于层次聚类算法的时间复杂度较高,因此对于大规模数据集的应用,可能需要使用其他更加高效的算法。 ### 回答2: 层次聚类是一种聚类算法,其主要目标是将数据样本分成不同的组或类。它的实现方式在Python中可以使用scikit-learn或者其他机器学习库来完成。 在Python中,一个常用的层次聚类算法实现方法是使用scikit-learn库中的AgglomerativeClustering类。该类需要指定聚类的参数,例如聚类的数量或者距离度量方式。下面是一个简单的示例代码: ```python from sklearn.cluster import AgglomerativeClustering import numpy as np # 生成示例数据 X = np.array([[1, 2], [1.5, 1.8], [5, 8], [8, 8], [1, 0.6], [9, 11]]) # 定义层次聚类模型并拟合数据 model = AgglomerativeClustering(n_clusters=2) model.fit(X) # 输出每个数据点所属的聚类编号 print(model.labels_) ``` 在上面的代码中,首先导入必要的库,然后生成示例数据X。接下来定义一个AgglomerativeClustering对象,并指定聚类的数量为2。然后调用fit函数拟合数据。 最后输出每个数据点所属的聚类编号。这里将输出一个长度为6的数组,代表每个数据点属于哪个聚类。 以上是层次聚类算法Python中的一种实现方式。你可以根据自己的需求选择其他合适的聚类算法和库,根据数据的特点进行调整、优化和评估。 ### 回答3: 层次聚类算法(Hierarchical Clustering)是一种基于距离的聚类算法,通过逐步合并样本或聚类,构建一个树状结构,最终将所有样本或聚类划分为不同的簇。在Python中,可以使用scikit-learn库中的AgglomerativeClustering来实现层次聚类算法。 步骤如下: 1. 导入必要的库: ``` from sklearn.cluster import AgglomerativeClustering ``` 2. 准备数据: ``` X = [[1, 2], [3, 4], [1, 4], [2, 2], [3, 3]] ``` 3. 创建层次聚类对象: ``` agg_clustering = AgglomerativeClustering(n_clusters=2) ``` 4. 进行聚类: ``` labels = agg_clustering.fit_predict(X) ``` 5. 输出结果: ``` print(labels) ``` 这样就可以得到每个样本所属的簇的标签。层次聚类算法基于距离计算,通过不断合并样本或聚类,构建出一个树状结构。在这个树状结构中,可以根据需要选择合适的层次作为最终的聚类结果。 总结一下,层次聚类算法是一种基于距离的聚类算法,通过逐步合并样本或聚类,构建一个树状结构,将所有样本或聚类划分为不同的簇。在Python中,可以使用scikit-learn库中的AgglomerativeClustering来实现算法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值