首页 > 解决方案 > 一个如何通过不同而不是相似来聚类?使用反欧几里得距离是否可以接受?

问题描述

我试图通过它们的不同程度而不是它们的相似程度来对一组产品进行聚类。也就是说,如果 Product1 在第 1 周销售而在第 2 周没有销售,我想将它与在第 1 周没有销售但在第 2 周销售的产品配对。

作为最终产品,我想展示一个 seaborn clustermap 来说明产品之间的反比关系。

我试图使用欧几里得距离的倒数作为我的聚类度量,而不是欧几里得距离。来完成这个任务。

下面的示例代码:

import numpy as np
import seaborn as sns
import pandas as pd

np.random.seed(0)
a = np.random.randint(2,size=(5,10))

示例数据框,五种产品,包含 10 个“周”的数据。1 = 销售,0 = 无销售

df = pd.DataFrame(a, 
                  index='Product1 Product2 Product3 Product4 Product5'.split(),
                  columns=np.arange(1,11))

定义距离度量,欧几里得距离的倒数:

invEucl = lambda u, v: 1 / np.sqrt(((u-v)**2).sum())

比较集群图,欧几里得与逆:

sns.clustermap(df,col_cluster=False)

sns.clustermap(df,
               col_cluster=False,
              metric=invEucl)

结果似乎以图形方式工作,集群图将不同的项目分组在一起,但我想确认使用类似欧几里得距离的倒数的东西是合适的。

如果是,您是否知道任何使用类似方法的文献?

如果没有,是否有任何适合此类分析的指标?本质上,我正在寻找一个度量,它将为最不相似的向量分配较低的距离。

标签: pythonpandasdataframeseabornhierarchical-clustering

解决方案


通过不同进行聚类没有任何意义。如果ab高度相似,并且bc高度相似,那么ac至少非常相似,但是如果ab高度不相似,并且bc高度不相似,这并不能告诉我们a和有多相似或不相似c。它们可能是相同的。

您的聚类“指标”从根本上被破坏了。不满足三角不等式;不能保证dist(a, c) <= dist(a, b) + dist(b, c)

聚类在这里是错误的方法。


推荐阅读