我们如何衡量分类数据之间的相似性距离?

How can we measure the similarity distance between categorical data ?

我们如何衡量分类数据之间的相似性距离?

示例: 性别:男,女 数值:[0 - 100]、[200 - 300] 字符串:专业人士、初学者等...

提前致谢。

有多种方法可以做到这一点。最简单的方法之一如下。

1) 为每个 属性 分配数值,以便尽可能匹配 属性 背后的含义。如果可以测量 属性,则将 属性 值从低到高排序很重要。如果不可能并且 属性 是分类的(如性别、职业等),只需为每个可能的值分配数字。

P1 - Gender
-------------------
0 - Male
1 - Female

P2 - Experience
-----------
0 - Beginner
5 - Average
10 - Professional

P3 - Age
-----------
[0 - 100]

P4 - Body height, cm
-----------
[50 - 250]

2) 对于每个概念,找到比例因子和偏移量,以便所有 属性 值都落在相同的选择范围内,比如 [0-100]

Sx = 100 / (Px max - Px min)
Ox = -Px min

在提供的示例中,您将获得:

S1 = 100
O1 = 0

S2 = 10
O2 = 0

S3 = 1
O3 = 0

S4 = 0.5
O4 = -50

3) 现在您可以创建一个包含所有 属性 值的向量。

V = (S1 * P1 + O1, S2 * P2 + O2, S3 * P3 + O3, S4 * P4 + O4)

在提供的示例中为:

V = (100 * P1, 10 * P2, P3, 0.5 * P4 - 50)

4) 现在您可以通过一个减去另一个来比较两个向量 V1 和 V2。结果向量的长度将表明它们有多么不同。

delta = |V1 - V2|

通过减去每个维度来减去向量。矢量长度可以计算为矢量维度平方和的平方根。

假设我们有 3 个人:

John
P1 = 0 (male)
P2 = 0 (beginner)
P3 = 20 (20 years old)
P4 = 190 (body height is 190 cm)

Kevin
P1 = 0 (male)
P2 = 10 (professional)
P3 = 25 (25 years old)
P4 = 186 (body height is 186 cm)

Lea
P1 = 1 (female)
P2 = 10 (professional)
P3 = 40 (40 years old)
P4 = 178 (body height is 178 cm)

向量为:

J = (100 * 0, 10 * 0, 20, 0.5 * 190 - 50) = (0, 0, 20, 45)
K = (100 * 0, 10 * 10, 25, 0.5 * 186 - 50) = (0, 100, 25, 43)
L = (100 * 1, 10 * 10, 40, 0.5 * 178 - 50) = (100, 100, 40, 39)

要确定我们需要减去向量:

delta JK = |J - K| =
= |(0 - 0, 0 - 100, 20 - 25, 45 - 43)| = 
= |(0, -100, -5, 2)| =
= SQRT(0 ^ 2 + (-100) ^ 2 + (-5) ^ 2 + 2 ^ 2) = 
= SQRT(10000 + 25 + 4) = 
= 100,14

delta KL = |K - L| = 
= |(0 - 100, 100 - 100, 25 - 40, 43 - 39)| = 
= |(-100, 0, -15, 4)| =
= SQRT((-100) ^ 2 + 0 ^ 2 + (-15) ^ 2 + 4 ^ 2) =
= SQRT(10000 + 225 + 16) =
= 101,20

delta LJ = |L - J| = 
= |(100 - 0, 100 - 0, 40 - 20, 39 - 45)| = 
= |(100, 100, 20, -6)| =
= SQRT(100 ^ 2 + 100 ^ 2 + (20) ^ 2 + (-6) ^ 2) =
= SQRT(10000 + 10000 + 400 + 36) =
= 142,95

从这里可以看出,John 和 Kevin 比其他人更相似,因为 delta 更小。

有许多方法可用于查找分类数据之间的相似性。以下论文对这些措施进行了简要讨论。

https://conservancy.umn.edu/bitstream/handle/11299/215736/07-022.pdf?sequence=1&isAllowed=y

如果您尝试在 R 中执行此操作,有一个名为 'nomclust' 的程序包,其中包含所有这些相似性度量。

希望对您有所帮助!

如果您使用的是 python,则有一个最新的库可帮助您根据 Eskin、重叠、IOF、OF、Lin、Lin1 等相似性度量找到邻近矩阵。 获得邻近矩阵后,我们可以使用层次聚类分析进行聚类。

将此 link 检查到名为 "Categorical_similarity_measures" 的库: https://pypi.org/project/Categorical-similarity-measures/0.4/

想一想,我们也可以应用两个变量之间的欧氏距离来求漂移值。如果为 0,则没有漂移,否则称为相似。但是在计算之前应该对向量进行排序和相同的长度。