1

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

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

每个键(“a”、“b”、“c”)的值是一个不同大小的 np.ndarry。我有一个dist()函数可以计算y["a"]y["b"]through之间的距离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.pdistpdist(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 结果进行进一步的层次聚类。

4

1 回答 1

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)]
于 2014-03-03T03:37:01.187 回答