对对象使用 scipy 层次聚类
Using scipy hierarchical clustering with objects
我有一个对象列表,以及对象之间的距离度量。我可以使用 scipy 的层次聚类来聚类对象吗(fclust1 似乎只接受浮点数向量)?
或者,如果这在 scipy 中是不可能的,是否有其他 python 库可以做到这一点?
示例:
class MyObject(object):
def __init__(self):
self.vec1 = [random.choice(range(100)) for i in range(1000)]
self.vec2 = [random.choice(range(100)) for i in range(1000)]
def my_distance_metric(a1, a2):
return some scalar function of a1.vec1, a1.vec2, a2.vec1, a2.vec2
objects = [MyObject() for in in range(1000)]
fclust1.cluster(objects, metric = my_distance_metric)
谢谢。
您可以计算对象的压缩距离矩阵并将其传递给 scipy.cluster.hierarchy.linkage
to compute the linkage matrix. Then pass the linkage matrix to, say, scipy.cluster.hierarchy.fcluster
or scipy.cluster.hierarchy.dendrogram
。
例如,
from scipy.cluster.hierarchy import linkage, dendrogram
n = len(objects)
condensed_dist = [my_distance_metric(objects[j], objects[k])
for j in range(n)
for k in range(j+1, n)]
Z = linkage(condensed_dist)
dendrogram(Z)
我有一个对象列表,以及对象之间的距离度量。我可以使用 scipy 的层次聚类来聚类对象吗(fclust1 似乎只接受浮点数向量)?
或者,如果这在 scipy 中是不可能的,是否有其他 python 库可以做到这一点?
示例:
class MyObject(object):
def __init__(self):
self.vec1 = [random.choice(range(100)) for i in range(1000)]
self.vec2 = [random.choice(range(100)) for i in range(1000)]
def my_distance_metric(a1, a2):
return some scalar function of a1.vec1, a1.vec2, a2.vec1, a2.vec2
objects = [MyObject() for in in range(1000)]
fclust1.cluster(objects, metric = my_distance_metric)
谢谢。
您可以计算对象的压缩距离矩阵并将其传递给 scipy.cluster.hierarchy.linkage
to compute the linkage matrix. Then pass the linkage matrix to, say, scipy.cluster.hierarchy.fcluster
or scipy.cluster.hierarchy.dendrogram
。
例如,
from scipy.cluster.hierarchy import linkage, dendrogram
n = len(objects)
condensed_dist = [my_distance_metric(objects[j], objects[k])
for j in range(n)
for k in range(j+1, n)]
Z = linkage(condensed_dist)
dendrogram(Z)