- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在 pandas 中有一个很大的 (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 | 1.0 | 0.996627003263 | -0.172683935315 | -0.33319698831 | -0.0562591684255 | -0.0306820050477 | -0.0657065745626 | -0.0457836647012 |
| 3 | 0.733077703346 | -0.16898620433 | 0.996627003263 | 1.0 | -0.153606414649 | -0.321562257834 | -0.0465540370732 | -0.0224318843281 | -0.0586629098513 | -0.0417237678539 |
| 4 | -0.177380436347 | -0.0460674481563 | -0.172683935315 | -0.153606414649 | 1.0 | 0.0148395123941 | 0.191615549534 | 0.289211355855 | 0.28799868259 | 0.291523969899 |
| 5 | -0.268022641963 | 0.0994673318696 | -0.33319698831 | -0.321562257834 | 0.0148395123941 | 1.0 | 0.205432455075 | 0.445668299971 | 0.454982398693 | 0.427323555674 |
| 6 | 0.0642473239514 | 0.137137216943 | -0.0562591684255 | -0.0465540370732 | 0.191615549534 | 0.205432455075 | 1.0 | 0.674329392219 | 0.727261969241 | 0.67891326835 |
| 7 | -0.0136866435594 | 0.061999118034 | -0.0306820050477 | -0.0224318843281 | 0.289211355855 | 0.445668299971 | 0.674329392219 | 1.0 | 0.980543049288 | 0.939548790275 |
| 8 | -0.025596700815 | 0.0944808695878 | -0.0657065745626 | -0.0586629098513 | 0.28799868259 | 0.454982398693 | 0.727261969241 | 0.980543049288 | 1.0 | 0.930281915882 |
| 9 | -0.00385065532308 | 0.0229095105328 | -0.0457836647012 | -0.0417237678539 | 0.291523969899 | 0.427323555674 | 0.67891326835 | 0.939548790275 | 0.930281915882 | 1.0 |
+---+-------------------+------------------+------------------+------------------+------------------+-----------------+------------------+------------------+------------------+-------------------+
为简单起见,此处截断。
如果我计算链接,然后使用以下代码绘制树状图:
from scipy.cluster.hierarchy import dendrogram, linkage
Z = linkage(result_df.corr(),'average')
plt.figure()
fig, axes = plt.subplots(1, 1, figsize=(20, 20))
axes.tick_params(axis='both', which='major', labelsize=15)
dendrogram(Z=Z, labels=result_df_null_cols.columns,
leaf_rotation=90., ax=axes,
color_threshold=2.)
我的问题是关于 y 轴的。在我见过的所有示例中,Y 轴都位于 0,2 之间 - 我已将其解释为 (1-corr)
。在我的结果中,边界要高得多。 0 是高度相关的项目 (1-1 = 0)
,2 是低相关项目的截止点 (1 - -1 = 2)
。
我找到了 following answer 但 it does not agree with this answer 和 referenced lecture notes here 。
无论如何 - 希望有人可以澄清哪个来源是正确的,并帮助传播有关该主题的一些知识。
最佳答案
用于 linkage()
的度量是欧氏距离,参见 here而不是实际值。因此,它可以超过 2,这完全取决于我们使用的距离度量的类型。
这支持了 this 中提到的要点回答。
1) The y-axis is a measure of closeness of either individual data points or clusters.
然后,这些距离用于计算树,在每对簇之间使用以下计算。
在您提到的示例中,
即使各个值不超过(-1, +1)
,我们也会得到以下树状图。
from scipy.spatial import distance
distance.pdist(df, 'euclidean')
原因是大小为 45 的距离数组(10 C 2
- 每对列;顺序解释为 here)将具有以下值:
array([1.546726 , 0.79914141, 0.79426728, 2.24085106, 2.50838998,
2.22772899, 2.52578923, 2.55978527, 2.51553289, 2.11329023,
2.10501739, 1.66536963, 1.6303103 , 1.71821177, 2.04386712,
2.03917033, 2.03614219, 0.0280283 , 2.33440388, 2.68373496,
2.43771817, 2.68351612, 2.73148741, 2.66843754, 2.31758222,
2.67031469, 2.4206485 , 2.66539997, 2.7134241 , 2.65058045,
1.44756593, 1.39699605, 1.55063416, 1.56324546, 1.52001219,
1.32204039, 1.30206957, 1.29596715, 1.2895916 , 0.65145881,
0.62242858, 0.6283212 , 0.08642582, 0.11145739, 0.14420816])
如果我们构建一个具有均匀距离的随机值矩阵。 (-1, 1)
大小为 (160, 160)
,树状图将类似于此!
因此,您的问题的解决方案是,
您需要将相关值转换为某种形式的距离度量。
我们可以使用相同的 squareform()建议在 other answer .这是一种管道胶带方法,可实现距离测量的两个方面。它必须是零 [在相同的两点之间] 并且对于任何两点都是非负数。这可以通过从一个中减去每个 corr 值来实现。
我们可以直接使用distance.pdist
函数,并将相关性作为度量。实现可用 here .请记住转换数据框,因为我们需要每一列而不是行之间的相关性。
理解解决方案的示例:
size = (10000,1)
col1 = np.random.randint(0,100,size) # base column
col2 = col1 * 0.9 + np.random.normal(0,2,size) # huge corr with small noise
col3 = col1 * 0.1 + np.random.normal(0,100,size) # uncorrelated column
col4 = col1 * (-0.5) + np.random.normal(0,1,size) # negatively corr
data = np.hstack((col1,col2,col3,col4))
df = pd.DataFrame(data , columns=list('ABCD'))
df.corr()
A B C D
A 1.000000 0.997042 0.029078 -0.997614
B 0.997042 1.000000 0.029233 -0.994677
C 0.029078 0.029233 1.000000 -0.028421
D -0.997614 -0.994677 -0.028421 1.000000
#pdist_values = distance.squareform(1 - df.corr().values )
pdist_values = distance.pdist(df.T, 'correlation')
z = linkage(pdist_values, method='average')
dendrogram(z, labels=df.columns)
关于python - 树状图 y 轴标记困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54815631/
我正在处理一组标记为 160 个组的 173k 点。我想通过合并最接近的(到 9 或 10 个组)来减少组/集群的数量。我搜索过 sklearn 或类似的库,但没有成功。 我猜它只是通过 knn 聚类
我有一个扁平数字列表,这些数字逻辑上以 3 为一组,其中每个三元组是 (number, __ignored, flag[0 or 1]),例如: [7,56,1, 8,0,0, 2,0,0, 6,1,
我正在使用 pipenv 来管理我的包。我想编写一个 python 脚本来调用另一个使用不同虚拟环境(VE)的 python 脚本。 如何运行使用 VE1 的 python 脚本 1 并调用另一个 p
假设我有一个文件 script.py 位于 path = "foo/bar/script.py"。我正在寻找一种在 Python 中通过函数 execute_script() 从我的主要 Python
这听起来像是谜语或笑话,但实际上我还没有找到这个问题的答案。 问题到底是什么? 我想运行 2 个脚本。在第一个脚本中,我调用另一个脚本,但我希望它们继续并行,而不是在两个单独的线程中。主要是我不希望第
我有一个带有 python 2.5.5 的软件。我想发送一个命令,该命令将在 python 2.7.5 中启动一个脚本,然后继续执行该脚本。 我试过用 #!python2.7.5 和http://re
我在 python 命令行(使用 python 2.7)中,并尝试运行 Python 脚本。我的操作系统是 Windows 7。我已将我的目录设置为包含我所有脚本的文件夹,使用: os.chdir("
剧透:部分解决(见最后)。 以下是使用 Python 嵌入的代码示例: #include int main(int argc, char** argv) { Py_SetPythonHome
假设我有以下列表,对应于及时的股票价格: prices = [1, 3, 7, 10, 9, 8, 5, 3, 6, 8, 12, 9, 6, 10, 13, 8, 4, 11] 我想确定以下总体上最
所以我试图在选择某个单选按钮时更改此框架的背景。 我的框架位于一个类中,并且单选按钮的功能位于该类之外。 (这样我就可以在所有其他框架上调用它们。) 问题是每当我选择单选按钮时都会出现以下错误: co
我正在尝试将字符串与 python 中的正则表达式进行比较,如下所示, #!/usr/bin/env python3 import re str1 = "Expecting property name
考虑以下原型(prototype) Boost.Python 模块,该模块从单独的 C++ 头文件中引入类“D”。 /* file: a/b.cpp */ BOOST_PYTHON_MODULE(c)
如何编写一个程序来“识别函数调用的行号?” python 检查模块提供了定位行号的选项,但是, def di(): return inspect.currentframe().f_back.f_l
我已经使用 macports 安装了 Python 2.7,并且由于我的 $PATH 变量,这就是我输入 $ python 时得到的变量。然而,virtualenv 默认使用 Python 2.6,除
我只想问如何加快 python 上的 re.search 速度。 我有一个很长的字符串行,长度为 176861(即带有一些符号的字母数字字符),我使用此函数测试了该行以进行研究: def getExe
list1= [u'%app%%General%%Council%', u'%people%', u'%people%%Regional%%Council%%Mandate%', u'%ppp%%Ge
这个问题在这里已经有了答案: Is it Pythonic to use list comprehensions for just side effects? (7 个答案) 关闭 4 个月前。 告
我想用 Python 将两个列表组合成一个列表,方法如下: a = [1,1,1,2,2,2,3,3,3,3] b= ["Sun", "is", "bright", "June","and" ,"Ju
我正在运行带有最新 Boost 发行版 (1.55.0) 的 Mac OS X 10.8.4 (Darwin 12.4.0)。我正在按照说明 here构建包含在我的发行版中的教程 Boost-Pyth
学习 Python,我正在尝试制作一个没有任何第 3 方库的网络抓取工具,这样过程对我来说并没有简化,而且我知道我在做什么。我浏览了一些在线资源,但所有这些都让我对某些事情感到困惑。 html 看起来
我是一名优秀的程序员,十分优秀!