我正在使用scipy-cluster为某些数据生成层次聚类.作为应用程序的最后一步,我调用dendrogram函数绘制聚类.我使用内置的Python 2.6.1和这个matplotlib包在Mac OS X Snow Leopard上运行.程序运行正常,但最后Rocket Ship图标(据我所知,这是python中GUI应用程序的启动程序)显示并立即消失而不做任何事情.没有显示任何内容.如果我在通话后添加'raw_input',它就会永久地在停靠栏中上下跳动.如果我从终端运行matplotlib的简单示例应用程序,它运行正常.有没有人有这方面的经验?
我正试图从R中的树状图中提取出一个我cut在某个高度的分类.这cutree在一个hclust对象上很容易做到,但我无法弄清楚如何在一个dendrogram对象上做到这一点.
此外,我不能只使用原始hclust中的集群,因为(令人沮丧地),类cutree的编号与类的编号不同cut.
hc <- hclust(dist(USArrests), "ave")
classification<-cutree(hc,h=70)
dend1 <- as.dendrogram(hc)
dend2 <- cut(dend1, h = 70)
str(dend2$lower[[1]]) #group 1 here is not the same as
classification[classification==1] #group 1 here
Run Code Online (Sandbox Code Playgroud)
有没有办法让分类相互映射,或者从dendrogram对象中提取较低的分支成员资格(可能有一些巧妙的使用dendrapply?),格式更像是cutree给出的?
树形图是与层次聚类算法一起使用的数据结构,其在树的不同"高度"处对聚类进行分组 - 其中高度对应于聚类之间的距离度量.
在从某些输入数据集创建树形图之后,通常还需要确定"切割"树状图的位置,这意味着选择高度使得仅低于该高度的聚类被认为是有意义的.
在剪切树状图的高度并不总是很清楚,但是存在一些算法,例如DynamicTreeCut算法,它试图以编程方式从树形图中选择有意义的聚类.
看到:
https://stats.stackexchange.com/questions/3685/where-to-cut-a-dendrogram
所以我一直在阅读DynamicTreeCut算法,以及该算法的Java实现.从逐步分解正在发生的事情的角度来看,我理解算法是如何工作的以及它在做什么.但是,我无法理解这个算法是如何做任何有意义的事情的.我想我在这里缺少一些关键概念.
通常,该算法在树形图上迭代"高度序列".我不确定,但我认为"高度序列"只是指树状图沿Y轴的值,即簇连接发生的各种高度.如果是这种情况,我们可以假设"高度序列"按升序排序.
然后算法要求获取"参考高度",l并从输入"高度序列"中的每个高度减去它.这为您提供了高度序列中D每个高度h[i]与参考高度之间差异()的向量l.
然后算法尝试找到"转换点" - 它们是差异向量中的点,其中D[i] > 0和D[i+1] < 0.换句话说,差异向量中的点,其中差值从正变为负.
就在这里,我完全迷失了.我不明白这些过渡点是如何有意义的.首先,我的理解是输入高度序列H只是树形图Y轴上的值.因此,高度序列H应按升序排列.因此,如何在差异向量中找到一个从正向过渡到负向的点?
例如:
假设我们的输入高度序列H是{1, 1.5, 2, 2.5, 3, 7, 9},我们的参考值l是平均高度(将是3.7).因此,如果我们D通过l从每个高度中减去来创建差异向量H,我们就会得到{-2.7, -2.2, -1.7, -1.2, -0.7, 3.3, 5.3}.很明显,这里没有过渡点,也没有过,因为差异向量中没有点D[i] …
algorithm cluster-analysis hierarchical-clustering dendrogram unsupervised-learning
我已经找到了几个关于如何创建这些确切的层次结构的示例(至少我相信它们是这样的),如下所示stackoverflow.com/questions/2982929/哪个很好用,几乎可以执行我正在寻找的内容.
[编辑]这是保罗代码的简化版本,现在应该更容易让某人帮助将其转换为径向集群而不是当前的集群形状

import scipy
import pylab
import scipy.cluster.hierarchy as sch
def fix_verts(ax, orient=1):
for coll in ax.collections:
for pth in coll.get_paths():
vert = pth.vertices
vert[1:3,orient] = scipy.average(vert[1:3,orient])
# Generate random features and distance matrix.
x = scipy.rand(40)
D = scipy.zeros([40,40])
for i in range(40):
for j in range(40):
D[i,j] = abs(x[i] - x[j])
fig = pylab.figure(figsize=(8,8))
# Compute and plot the dendrogram.
ax2 = fig.add_axes([0.3,0.71,0.6,0.2])
Y = sch.linkage(D, method='single')
Z2 = sch.dendrogram(Y)
ax2.set_xticks([])
ax2.set_yticks([])
fix_verts(ax2,0)
fig.savefig('test.png') …Run Code Online (Sandbox Code Playgroud) 给定树状图(如树状图示例(源)),如何在边缘上放置标签?绘制边的Javascript代码看起来像下一行:
var link = vis.selectAll("path.link")
.data(cluster.links(nodes))
.enter().append("path")
.attr("class", "link")
.attr("d", diagonal);
Run Code Online (Sandbox Code Playgroud) 我正在使用dendextend在R中绘制Tanglegrams.我想知道是否有可能使用多个子图par(mfrow = c(2,2))?
我似乎无法弄明白.
谢谢
library(dendextend)
dend15 <- c(1:5) %>% dist %>% hclust(method = "average") %>% as.dendrogram
dend15 <- dend15 %>% set("labels_to_char")
dend51 <- dend15 %>% set("labels", as.character(5:1)) %>% match_order_by_labels(dend15)
dends_15_51 <- dendlist(dend15, dend51)
par(mfrow = c(2,2))
tanglegram(dends_15_51)
tanglegram(dends_15_51)
tanglegram(dends_15_51)
tanglegram(dends_15_51)
Run Code Online (Sandbox Code Playgroud) 我(106x106)在熊猫中有一个大型相关矩阵,其结构如下:
+---+-------------------+------------------+------------------+------------------+------------------+-----------------+------------------+------------------+------------------+-------------------+
| | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
+---+-------------------+------------------+------------------+------------------+------------------+-----------------+------------------+------------------+------------------+-------------------+
| 0 | 1.0 | 0.465539925807 | 0.736955649673 | 0.733077703346 | -0.177380436347 | -0.268022641963 | 0.0642473239514 | -0.0136866435594 | -0.025596700815 | -0.00385065532308 |
| 1 | 0.465539925807 | 1.0 | -0.173472213691 | -0.16898620433 | -0.0460674481563 | 0.0994673318696 | 0.137137216943 | 0.061999118034 | 0.0944808695878 | 0.0229095105328 |
| 2 | 0.736955649673 | -0.173472213691 | …Run Code Online (Sandbox Code Playgroud) 我想编写代码来在python中绘制树形图.有一个简单的方法来实现它.
我编写的代码可以识别点数据集中的聚类,并希望生成一个树形图,显示每次迭代生成的聚类数量
例如,当我在这个数据集上运行我的代码时,第一次迭代得到1个集群

和第二次迭代的2个聚类

所以我想制作能够展示这一点的东西.但不知道从哪里开始

每个点都有一个'label'属性,该属性是每次迭代后该点所在的每个簇的列表.
也就是说,在这个例子中,一些点标签属于[0,0],而其他点是[0,1].所以,如果我使用scipy树形图,我将如何从这到连接格式
我对d3.js(以及一般的SVG)很新,我想做一些简单的事情:带有角度连接器的树/树形图.
我从这里蚕食了d3的例子:http ://mbostock.github.com/d3/ex/cluster.html我想让它更像这里的protovis示例:
我在这里开始:http://jsbin.com/ugacud/2/edit#javascript,html,我认为这是以下代码片段的错误:
var diagonal = d3.svg.diagonal()
.projection(function(d) { return [d.y, d.x]; });
Run Code Online (Sandbox Code Playgroud)
然而,没有明显的替代品,我可以使用d3.svg.line,但我不知道如何正确地集成它,理想情况下我想要一个弯头连接器....虽然我想知道我是否使用了错误的库,因为我见过的很多d3例子都是用引力来制作物体图而不是树.
是否有任何相当直接的方法在r中放置两个"背对背"的树状图?两个树形图包含相同的对象,但是以稍微不同的方式聚类.我需要强调树形图的不同之处.就像使用soilDB软件包所做的那样,但可能更少涉及土壤科学的定位?

能够对树状图进行排列以最大化物体之间的直线数量(见上文)会很棒,因为这会强调树形图之间的任何差异.
有任何想法吗?
dendrogram ×10
python ×4
r ×3
d3.js ×2
dendextend ×2
javascript ×2
plot ×2
scipy ×2
algorithm ×1
edge ×1
ggplot2 ×1
label ×1
macos ×1
matplotlib ×1
numpy ×1
scikit-learn ×1
svg ×1