python实现层次聚类的方法


Posted in Python onNovember 01, 2021

层次聚类算法

顾名思义,层次聚类就是一层一层的进行聚类,可以由上向下把大的类别(cluster)分割,叫作分裂法;也可以由下向上对小的类别进行聚合,叫作凝聚法;但是一般用的比较多的是由下向上的凝聚方法。

分裂法:

分裂法指的是初始时将所有的样本归为一个类簇,然后依据某种准则进行逐渐的分裂,直到达到某种条件或者达到设定的分类数目。用算法描述:
输入:样本集合D,聚类数目或者某个条件(一般是样本距离的阈值,这样就可不设置聚类数目)
输出:聚类结果

1.将样本集中的所有的样本归为一个类簇;
repeat:
    2.在同一个类簇(计为c)中计算两两样本之间的距离,找出距离最远的两个样本a,b;
    3.将样本a,b分配到不同的类簇c1和c2中;
    4.计算原类簇(c)中剩余的其他样本点和a,b的距离,若是dis(a)<dis(b),则将样本点归到c1中,否则归到c2中;
util: 达到聚类的数目或者达到设定的条件

凝聚法:

凝聚法指的是初始时将每个样本点当做一个类簇,所以原始类簇的大小等于样本点的个数,然后依据某种准则合并这些初始的类簇,直到达到某种条件或者达到设定的分类数目。用算法描述:
输入:样本集合D,聚类数目或者某个条件(一般是样本距离的阈值,这样就可不设置聚类数目)
输出:聚类结果

 1.将样本集中的所有的样本点都当做一个独立的类簇;
   repeat:
        2.计算两两类簇之间的距离(后边会做介绍),找到距离最小的两个类簇c1和c2;
        3.合并类簇c1和c2为一个类簇;
   util: 达到聚类的数目或者达到设定的条件

例图:

python实现层次聚类的方法

欧式距离的计算公式

python实现层次聚类的方法

类簇间距离的计算方法有许多种:
(1)就是取两个类中距离最近的两个样本的距离作为这两个集合的距离,也就是说,最近两个样本之间的距离越小,这两个类之间的相似度就越大
(2)取两个集合中距离最远的两个点的距离作为两个集合的距离
(3)把两个集合中的点两两的距离全部放在一起求一个平均值,相对也能得到合适一点的结果。
e.g.下面是计算组合数据点(A,F)到(B,C)的距离,这里分别计算了(A,F)和(B,C)两两间距离的均值。

python实现层次聚类的方法

(4)取两两距离的中值,与取均值相比更加能够解除个别偏离样本对结果的干扰。
(5)求每个集合的中心点(就是将集合中的所有元素的对应维度相加然后再除以元素个数得到的一个向量),然后用中心点代替集合再去就集合间的距离

实现

接下来以世界银行样本数据集进行简单实现。该数据集以标准格式存储在名为WBClust2013.csv的CSV格式的文件中。其有80行数据和14个变量。数据来源

python实现层次聚类的方法

为了使得结果可视化更加方便,我将最后一栏人口数据删除了。并且在实现层次聚类之后加入PCA降维与原始结果进行对比。

from scipy.cluster.hierarchy import linkage, dendrogram, fcluster
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np


data = pd.read_csv('data/WBClust2013.csv')
data.pop('Pop')
# data.pop('RuralWater')
# data.pop('CellPhone')
# data.pop('LifeExp')
data = data[:20]
country = list(data['Country'])
data.pop('Country')

# 以下代码为仅使用层次聚类

plt.figure(figsize=(9, 7))
plt.title("original data")
mergings = linkage(data, method='average')
# print(mergings)
dendrogram(mergings, labels=country, leaf_rotation=45, leaf_font_size=8)
plt.show()
Z = linkage(data, method='average')
print(Z)
cluster_assignments = fcluster(Z, t=3.0, criterion='maxclust')
print(cluster_assignments)
for i in range(1, 4):
    print('cluster', i, ':')
    num = 1
    for index, value in enumerate(cluster_assignments):
        if value == i:
            if num % 5 == 0:
                print()
            num += 1
            print(country[index], end='  ')
    print()

# 以下代码为加入PCA进行对比
class myPCA():

    def __init__(self, X, d=2):
        self.X = X
        self.d = d

    def mean_center(self, data):
        """
        去中心化
        :param data: data sets
        :return:
        """
        n, m = data.shape
        for i in range(m):
            aver = np.sum(self.X[:, i])/n
            x = np.tile(aver, (1, n))
            self.X[:, i] = self.X[:, i]-x

    def runPCA(self):

        # 计算协方差矩阵,得到特征值,特征向量
        S = np.dot(self.X.T, self.X)
        S_val, S_victors = np.linalg.eig(S)
        index = np.argsort(-S_val)[0:self.d]
        Y = S_victors[:, index]
        # 得到输出样本集
        Y = np.dot(self.X, Y)
        return Y

# data_for_pca = np.array(data)
# pcaObject=myPCA(data_for_pca,d=2)
# pcaObject.mean_center(data_for_pca)
# res=pcaObject.runPCA()

# plt.figure(figsize=(9, 7))
# plt.title("after pca")
# mergings = linkage(res,method='average')
# print(mergings)
# dendrogram(mergings,labels=country,leaf_rotation=45,leaf_font_size=8)
# plt.show()
# Z = linkage(res, method='average')
# print(Z)
# cluster_assignments = fcluster(Z, t=3.0, criterion='maxclust')
# print(cluster_assignments)
# for i in range(1,4):
#     print('cluster', i, ':')
#     num = 1
#     for index, value in enumerate(cluster_assignments):
#         if value == i:
#             if num % 5 ==0:
#                 print()
#             num+=1
#             print(country[index],end='  ')
#     print()

两次分类结果都是一样的:

cluster 1 :
China  United States  Indonesia  Brazil  
Russian Federation  Japan  Mexico  Philippines  Vietnam  
Egypt, Arab Rep.  Germany  Turkey  Thailand  France  
United Kingdom  
cluster 2 :
India  Pakistan  Nigeria  Bangladesh  
cluster 3 :
Ethiopia

通过树状图对结果进行可视化

原始树状图:

python实现层次聚类的方法

PCA降维后的结果:

python实现层次聚类的方法

到此这篇关于python实现层次聚类的文章就介绍到这了,更多相关python层次聚类内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python ljust rjust center输出
Sep 06 Python
利用Python演示数型数据结构的教程
Apr 03 Python
Python使用迭代器打印螺旋矩阵的思路及代码示例
Jul 02 Python
Python使用分布式锁的代码演示示例
Jul 30 Python
python消除序列的重复值并保持顺序不变的实例
Nov 08 Python
python3.x+pyqt5实现主窗口状态栏里(嵌入)显示进度条功能
Jul 04 Python
python-序列解包(对可迭代元素的快速取值方法)
Aug 24 Python
python将邻接矩阵输出成图的实现
Nov 21 Python
Pytorch Tensor基本数学运算详解
Dec 30 Python
python集合删除多种方法详解
Feb 10 Python
python GUI库图形界面开发之PyQt5下拉列表框控件QComboBox详细使用方法与实例
Feb 27 Python
详解python对象之间的交互
Sep 29 Python
Python list列表删除元素的4种方法
Nov 01 #Python
Python面向对象编程之类的概念
Nov 01 #Python
python代码实现扫码关注公众号登录的实战
python编程实现清理微信重复缓存文件
Nov 01 #Python
python调用ffmpeg命令行工具便捷操作视频示例实现过程
Nov 01 #Python
Python字典的基础操作
Nov 01 #Python
Python集合的基础操作
Nov 01 #Python
You might like
linux iconv方法的使用
2011/10/01 PHP
PHP删除目录及目录下所有文件的方法详解
2013/06/06 PHP
PHP结合jQuery插件ajaxFileUpload实现异步上传文件实例
2020/08/17 PHP
javascript addBookmark 加入收藏 多浏览器兼容
2009/08/15 Javascript
使用JQUERY Tabs插件宿主IFRAMES
2010/01/01 Javascript
WEB 浏览器兼容 推荐收藏
2010/05/14 Javascript
基于Jquery的将DropDownlist的选中值赋给label的实现代码
2011/05/06 Javascript
推荐30个新鲜出炉的精美 jQuery 效果
2012/03/26 Javascript
JS滚轮事件onmousewheel使用介绍
2013/11/01 Javascript
javascript操纵OGNL标签示例代码
2014/06/16 Javascript
JavaScript多图片上传案例
2015/09/28 Javascript
jquery简单倒计时实现方法
2015/12/18 Javascript
JS获取当前页面名称的简单实例
2016/08/19 Javascript
Vue.js绑定HTML class数组语法错误的原因分析
2016/10/19 Javascript
Yarn的安装与使用详细介绍
2016/10/25 Javascript
js document.getElementsByClassName的使用介绍与自定义函数
2016/11/25 Javascript
js实现小窗口拖拽效果
2016/12/03 Javascript
Webpack实现按需打包Lodash的几种方法详解
2017/05/08 Javascript
vue2.0实现分页组件的实例代码
2017/06/22 Javascript
详解NodeJs项目 CentOs linux服务器线上部署
2019/09/16 NodeJs
在Vue中获取自定义属性方法:data-id的实例
2020/09/09 Javascript
[04:40]2016国际邀请赛中国区预选赛全程TOP10镜头集锦
2016/07/01 DOTA
python中as用法实例分析
2015/04/30 Python
介绍Python的Urllib库的一些高级用法
2015/04/30 Python
Python实现文件内容批量追加的方法示例
2017/08/29 Python
解决Python2.7读写文件中的中文乱码问题
2018/04/12 Python
python各类经纬度转换的实例代码
2019/08/08 Python
使用Python制作一个数据预处理小工具(多种操作一键完成)
2021/02/07 Python
html svg生成环形进度条的实现方法
2019/09/23 HTML / CSS
贝嫂喜欢的婴儿品牌,个性化的婴儿礼物:My 1st Years
2017/11/19 全球购物
意大利顶级奢侈品电商:LUISAVIAROMA(支持中文)
2020/05/26 全球购物
集中采购方案
2014/06/10 职场文书
学风建设演讲稿
2014/09/12 职场文书
教务处干事工作总结
2015/08/14 职场文书
二年级作文之动物作文
2019/11/13 职场文书
2020年基层司法所建设情况调研报告
2019/11/30 职场文书