我有一个距离矩阵N*N M,其中M_ij是之间的距离object_i和object_j.正如预期的那样,它采用以下形式:
/ 0 M_01 M_02 ... M_0n\
| M_10 0 M_12 ... M_1n |
| M_20 M_21 0 ... M2_n |
| ... |
\ M_n0 M_n2 M_n2 ... 0 /
Run Code Online (Sandbox Code Playgroud)
现在我希望用层次聚类来聚类这些n个对象.Python有一个这样的实现scipy.cluster.hierarchy.linkage(y, method='single', metric='euclidean').
它的文件说:
y必须是{n\choose 2}大小的向量,其中n是在距离矩阵中配对的原始观测数.
y:ndarray
精简或冗余距离矩阵.压缩距离矩阵是包含距离矩阵的上三角形的平面阵列.这是pdist返回的形式.或者,n维的m个观察向量的集合可以作为m×n阵列传递.
我对此描述感到困惑y.我可以直接M输入我的输入y吗?
更新
@ hongbo-zhu-cn 在GitHub上提出了这个问题.这正是我所关心的.但是,作为GitHub的新手,我不知道它是如何工作的,因此不知道如何处理这个问题.
我试图理解如何操纵层次结构集群,但文档太......技术性?......我无法理解它是如何工作的.
是否有任何教程可以帮助我开始,逐步解释一些简单的任务?
假设我有以下数据集:
a = np.array([[0, 0 ],
[1, 0 ],
[0, 1 ],
[1, 1 ],
[0.5, 0 ],
[0, 0.5],
[0.5, 0.5],
[2, 2 ],
[2, 3 ],
[3, 2 ],
[3, 3 ]])
Run Code Online (Sandbox Code Playgroud)
我可以轻松地完成层次结构聚类并绘制树形图:
z = linkage(a)
d = dendrogram(z)
Run Code Online (Sandbox Code Playgroud)
[0,1,2,4,5,6]树状图中有元素的那个?我有一组(2k - 4k)的小字符串(3-6个字符),我想将它们聚类.由于我使用字符串,以前的答案关于如何进行聚类(尤其是字符串聚类)?,告诉我,Levenshtein距离很适合用作弦乐的距离函数.此外,由于我事先并不知道群集的数量,因此分层聚类是要走的路而不是k-means.
虽然我以抽象的形式得到问题,但我不知道实际做什么的简单方法.例如,MATLAB或R是使用自定义函数(Levenshtein距离)实际实现层次聚类的更好选择.对于这两种软件,人们可以很容易地找到Levenshtein距离实现.聚类部分似乎更难.例如,MATLAB中的聚类文本计算所有字符串的距离数组,但我无法理解如何使用距离数组来实际获得聚类.你能不能向大家们展示如何在MATLAB或R中使用自定义函数实现层次聚类的方法?
matlab r cluster-analysis hierarchical-clustering levenshtein-distance
我比较R中树状图,一个与创建热图的两个方面made4的heatplot,一个用gplots的heatmap.2.适当的结果取决于分析,但我试图理解为什么默认值是如此不同,以及如何让两个函数给出相同的结果(或高度相似的结果),以便我理解所有'blackbox'参数进入这个.
这是示例数据和包:
require(gplots)
# made4 from bioconductor
require(made4)
data(khan)
data <- as.matrix(khan$train[1:30,])
Run Code Online (Sandbox Code Playgroud)
使用heatmap.2对数据进行聚类得出:
heatmap.2(data, trace="none")
Run Code Online (Sandbox Code Playgroud)

使用heatplot给出:
heatplot(data)
Run Code Online (Sandbox Code Playgroud)

最初的结果和缩放非常不同.heatplot在这种情况下,结果看起来更合理,所以我想了解要用heatmap.2它来做同样的参数,因为heatmap.2我有其他优点/功能我想使用,因为我想了解缺少的成分.
heatplot使用具有相关距离的平均链接,以便我们可以将其输入heatmap.2以确保使用类似的聚类(基于:https://stat.ethz.ch/pipermail/bioconductor/2010-August/034757.html)
dist.pear <- function(x) as.dist(1-cor(t(x)))
hclust.ave <- function(x) hclust(x, method="average")
heatmap.2(data, trace="none", distfun=dist.pear, hclustfun=hclust.ave)
Run Code Online (Sandbox Code Playgroud)
导致:

这使得行侧树状图看起来更相似但是列仍然不同,因此比例也是如此.看来,heatplot默认情况下,以某种方式缩放列,默认情况下heatmap.2不会这样做.如果我向heatmap.2添加行缩放,我得到:
heatmap.2(data, trace="none", distfun=dist.pear, hclustfun=hclust.ave,scale="row")
Run Code Online (Sandbox Code Playgroud)

它仍然不相同但更接近.我怎样才能重现heatplot结果heatmap.2?有什么区别?
edit2:看起来关键的区别在于使用以下方法重新heatplot调整行和列的数据:
if (dualScale) {
print(paste("Data (original) range: …Run Code Online (Sandbox Code Playgroud) r cluster-analysis hierarchical-clustering heatmap bioconductor
我的目标是根据单词与文本文档集相似的方式对单词进行聚类.我计算了每对单词之间的Jaccard相似度.换句话说,我有一个稀疏的距离矩阵.任何人都可以指向任何以距离矩阵为输入的聚类算法(可能还有Python中的库)吗?我也事先不知道簇的数量.我只想聚集这些单词并获得哪些单词聚集在一起.
python hierarchical-clustering cluster-computing scikit-learn
是否有任何算法可以帮助进行分层聚类?谷歌的map-reduce只有一个k-clustering的例子.在分层聚类的情况下,我不确定如何在节点之间划分工作.我找到的其他资源是:http://issues.apache.org/jira/browse/MAHOUT-19 但是,使用哪种算法并不明显.
通常当我做树形图和热图时,我使用距离矩阵并做一堆SciPy东西.我想尝试Seaborn但Seaborn想要我的数据是矩形的(行=样本,cols =属性,而不是距离矩阵)?
我本质上想seaborn用作后端来计算我的树形图并将其粘贴到我的热图上.这可能吗?如果没有,这可能是未来的特色.
也许有我可以调整的参数,所以它可以采用距离矩阵而不是矩形矩阵?
这是用法:
seaborn.clustermap¶
seaborn.clustermap(data, pivot_kws=None, method='average', metric='euclidean',
z_score=None, standard_scale=None, figsize=None, cbar_kws=None, row_cluster=True,
col_cluster=True, row_linkage=None, col_linkage=None, row_colors=None,
col_colors=None, mask=None, **kwargs)
Run Code Online (Sandbox Code Playgroud)
我的代码如下:
from sklearn.datasets import load_iris
iris = load_iris()
X, y = iris.data, iris.target
DF = pd.DataFrame(X, index = ["iris_%d" % (i) for i in range(X.shape[0])], columns = iris.feature_names)
Run Code Online (Sandbox Code Playgroud)
我不认为我的方法在下面是正确的,因为我给它一个预先计算的距离矩阵,而不是它要求的矩形数据矩阵.没有关于如何使用相关/距离矩阵的示例,clustermap但有https://stanford.edu/~mwaskom/software/seaborn/examples/network_correlations.html,但排序没有与普通sns.heatmap功能集群.
DF_corr = DF.T.corr()
DF_dism = 1 - DF_corr
sns.clustermap(DF_dism)
Run Code Online (Sandbox Code Playgroud)
这是一个真正的问题,一般适用于标记项目(是的,这也适用于StackOverflow,不,这不是关于StackOverflow的问题).
整个标记问题有助于聚类类似的项目,无论它们是什么项目(笑话,博客帖子,所以问题等).但是,(通常但不严格)是标签的层次结构,这意味着某些标签也暗示其他标签.使用一个熟悉的例子,"c#"so标签也暗示".net"; 另一个例子,在笑话数据库中,"blondes"标签暗示"嘲弄"标签,类似于"爱尔兰"或"belge"或"加拿大"等,取决于笑话的国家来源.
你是如何在项目中处理这个问题的?我将提供一个答案,描述我在两个不同的情况下使用的两种不同的方法(实际上,相同的机制,但在两个不同的环境中实现),但我不仅对类似机制感兴趣,而且对您对层次结构问题的看法感兴趣.
任何人都可以指向一个可以聚类约100万个对象的层次聚类工具(最好是在python中)吗?我试过hcluster,还有橘子.
hcluster18k物体有问题.Orange能够在几秒钟内聚集18k个对象,但失败了100k对象(饱和内存并最终崩溃).
我在Ubuntu 11.10上运行64位Xeon CPU(2.53GHz)和8GB RAM + 3GB交换.
python cluster-analysis machine-learning hierarchical-clustering data-mining
这是我在下面得到的图,但我希望它看起来像截断的树状图,astrodendro如下所示:
还有一个从一个非常酷的树状图看本文,我想在重新创建matplotlib.
下面是生成iris带有噪声变量的数据集并绘制树形图的代码matplotlib.
有谁知道如何:(1)截断分支,如示例图中; 和/或(2)使用astrodendro自定义链接矩阵和标签?
import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
import astrodendro
from scipy.cluster.hierarchy import dendrogram, linkage
from scipy.spatial import distance
def iris_data(noise=None, palette="hls", desat=1):
# Iris dataset
X = pd.DataFrame(load_iris().data,
index = [*map(lambda x:f"iris_{x}", range(150))],
columns = [*map(lambda x: x.split(" (cm)")[0].replace(" ","_"), load_iris().feature_names)])
y = pd.Series(load_iris().target,
index = X.index,
name = "Species")
c = map_colors(y, mode=1, palette=palette, desat=desat)#y.map(lambda …Run Code Online (Sandbox Code Playgroud) python ×6
heatmap ×2
matplotlib ×2
r ×2
scipy ×2
algorithm ×1
bioconductor ×1
data-mining ×1
dendrogram ×1
matlab ×1
plot ×1
scikit-learn ×1
seaborn ×1
tagging ×1
tags ×1