Как мы можем измерить расстояние сходства между категориальными данными?
Пример: Пол: Мужской, Женский Числовые значения: [0–100], [200–300] Строки: Профессионалы, новички и т. д.,...
Заранее спасибо.
Как мы можем измерить расстояние сходства между категориальными данными?
Пример: Пол: Мужской, Женский Числовые значения: [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
Из этого вы можете видеть, что Джон и Кевин больше похожи, чем кто-либо другой, поскольку дельта меньше.
Существует ряд мер для поиска сходства между категориальными данными. В следующем документе кратко рассматриваются эти меры.
https://conservancy.umn.edu/bitstream/handle/11299/215736/07-022.pdf?sequence=1&isAllowed=y
Если вы пытаетесь сделать это в R, есть пакет под названием nomclust, в котором есть все эти меры сходства.
Надеюсь это поможет!
Если вы используете python, есть последняя библиотека, которая помогает найти матрицу близости на основе мер подобия, таких как Eskin, перекрытие, IOF, OF, Lin, Lin1 и т. д. После получения матрицы близости мы можем продолжить кластеризацию, используя Hierarchical Кластерный анализ.
Проверьте эту ссылку на библиотеку под названием «Categorical_similarity_measures»: https://pypi.org/project/Categorical-similarity-measures/0.4/
Просто мысль: мы также можем применить евклидово расстояние между двумя переменными, чтобы найти значение дрейфа. Если он равен 0, то нет дрейфа или вызова как подобного. Но перед вычислением вектор должен быть отсортирован и иметь одинаковую длину.