python - 如何通过不相似性而不是相似性进行聚类?使用反欧几里德距离可以接受吗?

标签 python pandas dataframe seaborn hierarchical-clustering

我试图根据一组产品的不同程度而不是相似程度来对它们进行聚类。 也就是说,如果产品 1 在第 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)

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

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

如果没有,是否有适合此类分析的指标? 本质上,我正在寻找一种度量,可以为最不相似的向量分配较小的距离。

最佳答案

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

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

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

关于python - 如何通过不相似性而不是相似性进行聚类?使用反欧几里德距离可以接受吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55960851/

相关文章:

python - Pandas 方差和标准差结果与手动计算不同

Python 默认参数评估

python - 要列出的 Pandas DataFrame 列

python - Pyspark:将列值与另一个值进行比较

python - 根据 Pandas 数据框规则创建新列

python - 我怎样才能在 sublime 中自动完成 python 库

python - 在 MacOS Sierra 上安装 Pillow

python - Pandas 多索引切片下属级别范围的最佳方法

python - 填充 Pandas 中缺失的 bool 行

r - 插入缺失的年份以完成 data.frame