我想从字典数据计算距离矩阵,如下所示:
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结果进行进一步的层次聚类。
答案 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)]