Как мы можем измерить расстояние сходства между категориальными данными?

Как мы можем измерить расстояние сходства между категориальными данными?

Пример: Пол: Мужской, Женский Числовые значения: [0–100], [200–300] Строки: Профессионалы, новички и т. д.,...

Заранее спасибо.


person staticx    schedule 21.04.2015    source источник


Ответы (4)


Есть разные способы сделать это. Один из самых простых будет следующим.

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

Из этого вы можете видеть, что Джон и Кевин больше похожи, чем кто-либо другой, поскольку дельта меньше.

person Kaspars Ozols    schedule 21.04.2015
comment
Я думаю, что формулу коэффициента масштабирования следует применять так: Sx * (Px + Ox) - person Saeed Mohtasham; 20.02.2018
comment
Эта часть очень неверна. Если это невозможно, и свойство является категоричным (например, пол, профессия и т. д.), просто присвойте номер каждому возможному значению. Если это номинальное значение, присвоение числовой переменной добавляет к нему вес, который никогда не является истинным. Лучше сделайте одно горячее кодирование. - person Sourajyoti MDeadart Datta; 03.06.2020

Существует ряд мер для поиска сходства между категориальными данными. В следующем документе кратко рассматриваются эти меры.

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

Если вы пытаетесь сделать это в R, есть пакет под названием nomclust, в котором есть все эти меры сходства.

Надеюсь это поможет!

person Anand Mohan    schedule 24.02.2019
comment
Нет случайно рабочей ссылки на эту статью? - person hoffee; 20.12.2020
comment
Любой пакет в питоне? - person Mohith7548; 09.02.2021

Если вы используете python, есть последняя библиотека, которая помогает найти матрицу близости на основе мер подобия, таких как Eskin, перекрытие, IOF, OF, Lin, Lin1 и т. д. После получения матрицы близости мы можем продолжить кластеризацию, используя Hierarchical Кластерный анализ.

Проверьте эту ссылку на библиотеку под названием «Categorical_similarity_measures»: https://pypi.org/project/Categorical-similarity-measures/0.4/

person Ajay Mukund    schedule 16.03.2020

Просто мысль: мы также можем применить евклидово расстояние между двумя переменными, чтобы найти значение дрейфа. Если он равен 0, то нет дрейфа или вызова как подобного. Но перед вычислением вектор должен быть отсортирован и иметь одинаковую длину.

person kannandreams    schedule 20.04.2021