python - 一个如何通过不同而不是相似来聚类?使用反欧几里得距离是否可以接受?
问题描述
我试图通过它们的不同程度而不是它们的相似程度来对一组产品进行聚类。也就是说,如果 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)
结果似乎以图形方式工作,集群图将不同的项目分组在一起,但我想确认使用类似欧几里得距离的倒数的东西是合适的。
如果是,您是否知道任何使用类似方法的文献?
如果没有,是否有任何适合此类分析的指标?本质上,我正在寻找一个度量,它将为最不相似的向量分配较低的距离。
解决方案
通过不同进行聚类没有任何意义。如果a
和b
高度相似,并且b
和c
高度相似,那么a
和c
至少非常相似,但是如果a
和b
高度不相似,并且b
和c
高度不相似,这并不能告诉我们a
和有多相似或不相似c
。它们可能是相同的。
您的聚类“指标”从根本上被破坏了。不满足三角不等式;不能保证dist(a, c) <= dist(a, b) + dist(b, c)
。
聚类在这里是错误的方法。
推荐阅读
- android - Android HERE SDK lite:将此处徽标放置到另一个位置
- java - 如果计步器传感器不可用,如何在 Android Studio 中实现计步器
- vb.net - 2个程序之间的交互
- c# - 在 WinDBG/SOS.DLL 中:如何一次将 !DumpDomain 列出的所有模块/程序集保存到磁盘?
- javascript - 如何添加两个javascript对象
- python - 使用集合论在 Python 中查找形状区域
- unity3d - 为什么场景摄像机在播放时会改变位置和旋转
- html - 在 Shiny 中使用 renderDataTable 扩展列的宽度
- reactjs - React / Redux为什么不是按调用顺序触发的thunk
- python - 正则表达式 - 计算最大数量的短串联重复