聚类算法相关:

聚类算法(一)——DBSCAN

聚类算法(二)—— 优缺点对比

聚类算法(三)—— 评测方法1

聚类算法(三)—— 评测方法2

聚类算法(三)—— 评测方法3(代码)

聚类算法(四)—— 基于词语相似度的聚类算法(含代码)

聚类算法(五)——层次聚类 linkage (含代码)

聚类算法(六)——谱聚类 (含代码)

聚类算法(七)—— Kmeans

一 原理

基本工作原理
给定要聚类的N的对象以及N*N的距离矩阵(或者是相似性矩阵), 层次式聚类方法的基本步骤(参看S.C. Johnson in 1967)如下:
1.     将每个对象归为一类, 共得到N类, 每类仅包含一个对象. 类与类之间的距离就是它们所包含的对象之间的距离.

2.     找到最接近的两个类并合并成一类, 于是总的类数少了一个.
3.     重新计算新的类与所有旧类之间的距离.
4.     重复第2步和第3步, 直到最后合并成一个类为止(此类包含了N个对象).
根据步骤3的不同, 可将层次式聚类方法分为几类: single-linkage, complete-linkage 以及 average-linkage 聚类方法等.

single-linkage 聚类法(也称 connectedness 或 minimum 方法):

类间距离等于两类对象之间的最小距离,若用相似度衡量,则是各类中的任一对象与另一类中任一对象的最大相似度。

complete-linkage 聚类法 (也称 diameter 或 maximum 方法):

组间距离等于两组对象之间的最大距离。

average-linkage 聚类法:

组间距离等于两组对象之间的平均距离。

average-link 聚类的一个变种是R. D'Andrade (1978) 的UCLUS方法, 它使用的是median距离, 在受异常数据对象的影响方面, 它要比平均距离表现更佳一些.

参考: http://blog.sciencenet.cn/blog-1271266-858703.html

二 函数原型

 scipy.cluster.hierarchy.linkage(y, method='single', metric='euclidean', optimal_ordering=False)

参考自: https://blog.csdn.net/Tan_HandSome/article/details/79371076?utm_source=blogxgwz9

1.1 method 

主要是 method 这个参数

  • method = ‘single’

d(u,v) = min(dist(u[i],u[j]))

对于u中所有点i和v中所有点j。这被称为最近邻点算法。

  • method = 'complete'

d(u,v) = max(dist(u[i],u[j]))

对于u中所有点i和v中所有点j。这被称为最近邻点算法。

  • method = 'average'

|u|,|v|是聚类u和v中元素的的个数,这被称为UPGMA算法(非加权组平均)法。

  • method = 'weighted'

            d(u,v) = (dist(s,v) + dist(t,v))/2

u是由s和t形成的,而v是森林中剩余的聚类簇,这被称为WPGMA(加权分组平均)法。

  • method = 'centroid'

Cs和Ct分别为聚类簇s和t的聚类中心,当s和t形成一个新的聚类簇时,聚类中心centroid会在s和t上重新计算。这段聚类就变成了u的质心和剩下聚类簇v的质心之间的欧式距离。这杯称为UPGMC算法(采用质心的无加权paire-group方法)。

  • method = 'median'

当两个聚类簇s和t组合成一个新的聚类簇u时,s和t的质心的均值称为u的质心。这被称为WPGMC算法。

  • method = 'ward' (沃德方差最小化算法)

新的输入d(u,v)通过下式计算得出,

u是s和t组成的新的聚类,v是森林中未使用的聚类。T = |v|+|s|+|t|,|*|是聚类簇中观测值的个数。

注意:当最小距离在一个森林中成对存在时,即有多个最小距离的时候,具体的实现要看MATLAB的版本(因为这个函数是从matlab里面copy过来的)。

1.2参数:

y:nump.ndarry。是一个压缩距离的平面上三角矩阵。或者n*m的观测值。压缩距离矩阵的所有元素必须是有限的,没有NaNs或infs。

method:str,可选。

metric:str或function,可选。在y维观测向量的情况下使用该参数,苟泽忽略。参照有效距离度量列表的pdist函数,还可以使用自定义距离函数。

optimal_ordering:bool。若为true,linkage矩阵则被重新排序,以便连续叶子间距最小。当数据可视化时,这将使得树结构更为直观。默认为false,因为数据集非常大时,执行此操作计算量将非常大。

三 代码

简单版


from scipy.cluster.hierarchy import dendrogram, linkage,fcluster
from matplotlib import pyplot as plt
X = [[i] for i in [2, 8, 0, 4, 1, 9, 9, 0]]
# X = [[1,2],[3,2],[4,4],[1,2],[1,3]]
Z = linkage(X, 'ward')
f = fcluster(Z,4,'distance')
fig = plt.figure(figsize=(5, 3))
dn = dendrogram(Z)

复杂一点的,对于词语聚类,采用word2vec 聚类(也可以采用fasttext的句子向量) 参见:聚类算法(四)—— 基于词语相似度的聚类算法(含代码)

from scipy.spatial.distance import pdist
from scipy.cluster.hierarchy import dendrogram,linkage, fcluster
import os
import pickle
import numpy

采用词向量计算

keywords = [] # 这里列上想要聚类的词语或句子
embedding_file = '' # embedding 模型文件
embedding_model2 = Embedding(embedding_file, 200, type='w2v')
vec = [embedding_model2.get_word_embedding(x) for x in keywords]  # get_word_embedding 参见聚类算法(四) 或者直接替换为自己的词向量算法,或特征向量arr = numpy.array(vec)
dist = pdist(arr, metric='cosine')row_clusters = linkage(dist, method ='median')  # centroid、median、ward只能定义在欧氏距离计算中。如果预先将y计算的距离传进来,那么要确保是用欧式距离计算的,否则将会导致错误的计算结果

上面代码也可以替换为TfidfVectorizer

import jieba.posseg as pseg
from sklearn.feature_extraction.text import TfidfVectorizer
from scipy.spatial.distance import pdist
import os
import picklecv = TfidfVectorizer(binary=False, decode_error='ignore')
vec = cv.fit_transform(feature) # feature 为文本切词后的list
arr = vec.toarray()
dist = pdist(arr, metric=metric)
row_clusters = linkage(dist, method=method)

结果处理

data = {"file_names_list": keywords, "row_clusters": row_clusters, "dist": dist}
result = get_cluster_result(data, 0.5)
count = 1
for item in result:for e in item['file_names']:print("{}\t{}\t{}\t{}".format(e, count, item["max_value"], len(item["file_names"])))count += 1

结果格式转化函数


def get_cluster_result(data, threshold):file_names_list = data["file_names_list"]row_clusters = data["row_clusters"]dist = data["dist"]max_value = 0for row in row_clusters:if row[2] > max_value:max_value = row[2]labels = fcluster(row_clusters, t=threshold * max_value, criterion="distance")cluster_dict = dict()for i in range(len(file_names_list)):if labels[i] not in cluster_dict:cluster_dict[labels[i]] = []cluster_dict[labels[i]].append({"file_name": file_names_list[i], "index": i})k = 0m = len(file_names_list)ij2index = dict()for i in range(0, m):for j in range(i + 1, m):ij2index["i:{}j:{}".format(i, j)] = kk += 1result = []for key, value in cluster_dict.items():index = []file_names = []max_value = 0for item in value:index.append(item["index"])file_names.append(item["file_name"])if len(index) > 1:for i in range(len(index)):for j in range(i+1, len(index)):temp = dist[ij2index["i:{}j:{}".format(index[i], index[j])]]if temp > max_value:max_value = tempresult.append({"file_names": file_names, "max_value": 1-max_value})else:result.append({"file_names": file_names, "max_value": 1})result.sort(key=lambda o: -len(o["file_names"]))return result

聚类算法(五)——层次聚类 linkage (含代码)相关推荐

  1. 聚类算法之层次聚类算法和应用举例

    聚类算法之层次聚类算法和应用举例 1.假设有N个待聚类的样本,对于层次聚类来说,步骤: 1.(初始化)把每个样本归为一类,计算每两个类之间的距离,也就是样本与样本之间的相似度: 2.寻找各个类之间最近 ...

  2. 【聚类算法】层次聚类算法

    目录 定义 样例 算法 Single Linkage Complete Linkage Average Linkage Centroid Linkage Ward 总结 定义 这个算法可以分为两部分理 ...

  3. 聚类算法_层次聚类_密度聚类(dbscan,meanshift)_划分聚类(Kmeans)详解

    注: 两整天的成果,谬误之处勿喷 1 聚类概述 样本 没有训练的样本 没有标注的样本 1.1 相似度度量 1.1.1 距离相似度度量 距离度量 dist(oi,oj)dist(o_{i},o_{j}) ...

  4. 12.聚类算法之层次聚类

    起步 层次聚类(hierarchical clustering)是聚类算法中的一种,通过计算不同类别的相似度组成新的类创建一个层次的嵌套的树. 基本结构如图所示: 层次聚类算法介绍 假设有n个待聚类的 ...

  5. 聚类算法之层次聚类方法

    目录 AGNES算法 DIANA算法 类间距离的不同定义 层次聚类算法的优缺点 层次聚类方法对给定的数据集进行层次的分解,直到满足某种条件为止.具体又可分为:凝聚的层次聚类AGNES算法和分裂的层次聚 ...

  6. 聚类算法:凝聚层次聚类

    凝聚层次聚类: 所谓凝聚的,指的是该算法初始时,将每个点作为一个簇,每一步合并两个最接近的簇.另外即使到最后,对于噪音点或是离群点也往往还是各占一簇的,除非过度合并.对于这里的"最接近&qu ...

  7. 层次聚类python实现_聚类算法之层次聚类(Python实现)

    起步 层次聚类( Hierarchical Clustering )是聚类算法的一种,通过计算不同类别的相似度类创建一个有层次的嵌套的树. 层次聚类算法介绍 假设有 n 个待聚类的样本,对于层次聚类算 ...

  8. 【机器学习】聚类算法:层次聚类、K-means聚类

    聚类算法实践(一)--层次聚类.K-means聚类 摘要: 所谓聚类,就是将相似的事物聚集在一 起,而将不相似的事物划分到不同的类别的过程,是数据分析之中十分重要的一种手段.比如古典生物学之中,人们通 ...

  9. 【一起入门MachineLearning】中科院机器学习第*课-聚类算法:层次聚类

    专栏介绍:本栏目为 "2021秋季中国科学院大学周晓飞老师的机器学习" 课程记录,不仅仅是课程笔记噢- 如果感兴趣的话,就和我一起入门Machine Learning吧

  10. 模式识别:C-means(K-means)聚类算法与分级聚类(层次聚类)算法

    C均值聚类算法与分级聚类算法的聚类分析 一.实验目的 理解聚类的整体思想,了解聚类的一般方法: 掌握 C-means与分级聚类算法算法思想及原理,并能够熟练运用这些算法进行聚类分析: 能够分析二者的优 ...

最新文章

  1. 什么才是真正的程序员?
  2. boost::multiprecision模块debug_adaptor相关的测试程序
  3. Jmock 原理简单说明
  4. API函数MessageBox的参数与返回值
  5. 线性代数与电路学、信号与系统的关系、微分方程--学习笔记
  6. 【报告分享】2021年Z世代“潮力量”洞察报告.pdf(附下载链接)
  7. python小测验3_python基础小测试
  8. 堪比“震网”:罗克韦尔PLC严重漏洞可导致攻击者在系统中植入恶意代码
  9. java操作hbase使用hbase-client2依赖
  10. android 如何判断是否有网络,Android中判断网络连接是否可用的方法总结
  11. delphi 2010 mysql_Delphi 2010和MySQL
  12. endnotex9切换中文_EndNoteX9常用方法汇总
  13. 苹果7plus元件分布图_苹果iPhone7Plus元件分布图+电路原理图+位置图PDF
  14. Device Tree(五)移植DM9000,并挂载NFS
  15. Pr:用 Au 协作处理音频
  16. 将iGoogle-Style新标签页添加到Chrome
  17. Java 7 - TWR 和 多异常捕获 示例
  18. java雀圣麻将游戏_《梦幻麻将馆9雀圣争霸》全攻略
  19. java 及 js 格式化金额 三位一撇(逗号)
  20. 【20211008】为什么分布式服务框架越来越火

热门文章

  1. Java 使用ZipOutputStream 进行打包操作
  2. 本征半导体的导电机制 空穴的概念
  3. read,readline 函数和 write 函数
  4. 使用ngrok进行域名映射
  5. python中的%用法
  6. 在Linux命令行终端中写python代码的简单操作
  7. AtCoder Beginner Contest 167 D Teleporter 找周期
  8. window.print()打印指定页面内容
  9. Dagger2是什么鬼
  10. 线性代数之 向量空间几何学(1)仿射