python从字典数据计算距离矩阵

时间:2014-03-03 02:53:21

标签: python cluster-analysis distance linkage pdist

我想从字典数据计算距离矩阵,如下所示:

y = {"a": ndarray1, "b": ndarry2, "c": ndarry3}

每个键的值(“a”,“b”,“c”)是不同大小的np.ndarry。我有一个dist()函数可以计算y["a"]y["b"]dist(y["a"], y["b"])之间的距离。

这样得到的距离矩阵将是:

+----------------------------------------------------------------+
|                a        b                        c             |
+----------------------------------------------------------------+
| a  | 0        mydist(ndarrya1, ndarray)  mydist(ndarray1, ndarray3) |
| b  |          0                        mydist(ndarray2, ndarray3) |
| c  |                                   0                        |
+----------------------------------------------------------------+

我已尝试使用scipy.spatial.distance.pdist pdist(y, mydist),但收到的错误是:

[X] = _copy_arrays_if_base_present([_convert_to_double(X)])
  File "/usr/local/lib/python2.7/dist-packages/scipy/spatial/distance.py", line 113, in _convert_to_double
X = X.astype(np.double)
TypeError: float() argument must be a string or a number

有人能告诉我如何自己实施这个pdist吗?我想使用pdist结果进行进一步的层次聚类。

1 个答案:

答案 0 :(得分:1)

你问题的第一部分非常清楚。第二部分我不知道你在问什么。为什么你需要重新实现scipy.spatial.distance.pdist,我认为你已经有dist()函数来计算成对距离。

要获得成对距离,当您已经有dist()函数来计算它时:

In [69]:
D={'a':some_value,'b':some_value,'c':some_value}
In [70]:
import itertools
In [71]:
list(itertools.combinations(D,2))
Out[71]:
[('a', 'c'), ('a', 'b'), ('c', 'b')]

In [72]: #this is what you need:
[dist(*map(D.get, item)) for item in itertools.combinations(D,2)]