我想在聚类中的两个点之间有一个相似性的度量。这样计算出来的相似性是否可以作为两个数据点之间相似性的可接受度量?
假设我有两个向量:向量 A 和向量 B
,它们位于同一个聚类中。我已经训练了一个聚类,标记为model
,然后model.computeCost()
计算输入点与相应聚类中心之间的平方距离。
(我使用的是Apache Spark MLlib)
val costA = model.computeCost(A)val costB = model.computeCost(B)val dissimilarity = |cost(A)-cost(B)|
差异性,即数值越高,它们之间的差异就越大。
回答:
如果你只是在问这是否是一个有效的度量,那么答案是几乎是,如果.computeCost
是确定性的,那么它是一个有效的伪度量。
为了简化,我将f(A) := model.computeCost(A)
和d(A, B) := |f(A)-f(B)|
表示为简化符号
简短证明:d
是对某个函数的图像应用的L1,因此它本身是一个伪度量,如果f
是单射(一般来说,你的不是)。
较长的证明:
d(A,B) >= 0
是的,因为|f(A) - f(B)| >= 0
d(A,B) = d(B,A)
是的,因为|f(A) - f(B)| = |f(B) - f(A)|
d(A,B) = 0
当且仅当A=B
,不是,这就是为什么它是伪度量,因为你可以有很多A != B
使得f(A) = f(B)
d(A,B) + d(B,C) <= d(A,C)
,是的,直接从绝对值的相同不等式得出。
如果你在问它是否适用于你的问题,那么答案是可能的,取决于问题。没有对你的问题和数据进行分析,就无法回答这个问题。如上所示,这是一个有效的伪度量,因此从数学角度来看,它将测量一些行为良好的东西。它是否适用于你的特定情况完全是另一回事。好的一面是,大多数适用于度量的算法也适用于伪度量。唯一的区别是,你只是将具有相同图像的点“粘合在一起”(f(A)=f(B)
),如果这不是你问题中的问题——那么你可以将这种伪度量应用于任何基于度量的推理中,而不会有任何问题。在实践中,这意味着如果你的f
是
计算输入点与相应聚类中心之间的平方距离之和
这意味着这实际上是到最近中心的距离(当你考虑单个点时,不涉及求和)。这将意味着,两个位于两个不同聚类中的点在它们离各自聚类中心的距离相同时被认为是相同的。因此,你的度量捕捉到的是“点与其各自聚类之间的关系有多不同”。这是一种定义明确的间接差异计算方式,但你在应用之前必须完全了解正在发生的事情(因为它会产生特定的后果)。