Косинусна Схожість та Кореляція Пірсона
Свайпніть щоб показати меню
Косинусна схожість
Косинусна схожість — це метрика, яка кількісно визначає схожість між двома векторами шляхом вимірювання косинуса кута між ними. Математично визначається як:
Cosine Similarity = ∑i=1nAi2⋅∑i=1nBi2∑i=1nAiBi
де A і B — це вектори користувачів або об'єктів. Геометрично косинусна схожість відображає, наскільки два вектори спрямовані в одному напрямку, незалежно від їхньої величини. Значення 1 означає, що вектори спрямовані в одному напрямку (максимальна схожість), 0 — вони ортогональні (відсутність схожості), а -1 — спрямовані у протилежні сторони. У поведінковому зіставленні косинусна схожість корисна, коли важливий саме патерн вподобань, а не їх абсолютні значення, наприклад, при порівнянні користувачів, які оцінюють об'єкти за різними шкалами.
Кореляція Пірсона
Кореляція Пірсона вимірює лінійну залежність між двома векторами, враховуючи як напрям, так і середнє значення даних. Формула:
Pearson Correlation=∑i=1n(Ai−Aˉ)2⋅∑i=1n(Bi−Bˉ)2∑i=1n(Ai−Aˉ)(Bi−Bˉ)
де Aˉ і Bˉ — середні значення векторів A і B. Кореляція Пірсона змінюється від -1 (ідеальний негативний лінійний зв'язок) до 1 (ідеальний позитивний лінійний зв'язок), при 0 — відсутність лінійної залежності. Ця метрика особливо корисна, коли потрібно порівнювати користувачів або об'єкти після усунення індивідуальних упереджень, наприклад, коли один користувач має тенденцію оцінювати все вище або нижче за іншого.
Порівняння
- Орієнтується на напрям векторів і ігнорує їх середнє значення та величину;
- Добрий вибір для розріджених даних, де багато оцінок відсутні або дорівнюють нулю, але може переоцінювати схожість, якщо користувачі мають систематично різні шкали оцінювання.
- Віднімає середню оцінку з кожного вектора, що робить її стійкою до відмінностей у шкалі або базових вподобаннях;
- Краще підходить, коли потрібно враховувати упередження користувача або об'єкта, але може не враховувати нелінійні зв'язки.
Приклад: Обчислення обох метрик
Припустимо, у вас є два користувачі, які оцінили чотири товари. Їхні оцінки:
- Користувач 1:
[4, 0, 3, 5] - Користувач 2:
[5, 1, 2, 4]
Можна обчислити як косинусну схожість, так і кореляцію Пірсона для цих векторів, щоб порівняти їхню поведінкову схожість.
12345678910111213141516171819import numpy as np # User ratings user1 = np.array([4, 0, 3, 5]) user2 = np.array([5, 1, 2, 4]) # Cosine similarity def cosine_similarity(a, b): dot_product = np.dot(a, b) norm_a = np.linalg.norm(a) norm_b = np.linalg.norm(b) return dot_product / (norm_a * norm_b) cos_sim = cosine_similarity(user1, user2) print(f"Cosine Similarity: {cos_sim:.4f}") # Pearson correlation pearson_corr = np.corrcoef(user1, user2)[0, 1] print(f"Pearson Correlation: {pearson_corr:.4f}")
Пояснення коду по кроках
Оголошення масивів оцінок користувачів
user1 = np.array([4, 0, 3, 5]);user2 = np.array([5, 1, 2, 4]);
Створюються два масиви NumPy, кожен з яких представляє оцінки користувача для чотирьох товарів. Ці масиви — це вектори користувачів.
Оголошення функції косинусної схожості
def cosine_similarity(a, b):
dot_product = np.dot(a, b)
norm_a = np.linalg.norm(a)
norm_b = np.linalg.norm(b)
return dot_product / (norm_a * norm_b)
- Обчислення скалярного добутку:
dot_product = np.dot(a, b);
Множить відповідні елементи двох векторів і підсумовує їх. Це вимірює, наскільки вектори спрямовані в одному напрямку. - Обчислення норм:
norm_a = np.linalg.norm(a);norm_b = np.linalg.norm(b);
Обчислює довжину (модуль) кожного вектора користувача. Норма — це квадратний корінь із суми квадратів елементів вектора. - Обчислення схожості:
return dot_product / (norm_a * norm_b);
Ділить скалярний добуток на добуток двох норм. Результат — це косинус кута між двома векторами, що показує їхню схожість.
Обчислення косинусної схожості та виведення результату
cos_sim = cosine_similarity(user1, user2);
print(f"Cosine Similarity: {cos_sim:.4f}");
Викликається функція для обчислення косинусної схожості між векторами користувачів, після чого результат виводиться з точністю до чотирьох знаків після коми.
Обчислення кореляції Пірсона та виведення результату
pearson_corr = np.corrcoef(user1, user2)[0, 1];
print(f"Pearson Correlation: {pearson_corr:.4f}");
Використовується np.corrcoef для обчислення матриці кореляції Пірсона для двох векторів користувачів. Значення у позиції [0, 1] показує кореляцію між user1 та user2. Виведення цього значення демонструє, наскільки сильно шаблони оцінювання користувачів лінійно пов’язані після усунення впливу середнього значення оцінок.
1. Яка основна відмінність між косинусною схожістю та кореляцією Пірсона при порівнянні векторів користувачів?
2. Яку метрику слід обрати, якщо потрібно порівняти користувачів, які оцінюють об'єкти за дуже різними шкалами (наприклад, один користувач завжди ставить високі оцінки, а інший — низькі)?
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат