Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Вивчайте Косинусна Схожість та Кореляція Пірсона | Системи колаборативної фільтрації та поведінкового зіставлення
Аналіз кошика покупок і системи рекомендацій

Косинусна Схожість та Кореляція Пірсона

Свайпніть щоб показати меню

Косинусна схожість

Косинусна схожість — це метрика, яка кількісно визначає схожість між двома векторами шляхом вимірювання косинуса кута між ними. Математично визначається як:

Cosine Similarity = i=1nAiBii=1nAi2i=1nBi2\frac {\sum_{i=1}^{n} A_i B_i} {\sqrt{\sum_{i=1}^{n} A_i^2} \cdot \sqrt{\sum_{i=1}^{n} B_i^2}}

де A і B — це вектори користувачів або об'єктів. Геометрично косинусна схожість відображає, наскільки два вектори спрямовані в одному напрямку, незалежно від їхньої величини. Значення 1 означає, що вектори спрямовані в одному напрямку (максимальна схожість), 0 — вони ортогональні (відсутність схожості), а -1 — спрямовані у протилежні сторони. У поведінковому зіставленні косинусна схожість корисна, коли важливий саме патерн вподобань, а не їх абсолютні значення, наприклад, при порівнянні користувачів, які оцінюють об'єкти за різними шкалами.

Кореляція Пірсона

Кореляція Пірсона вимірює лінійну залежність між двома векторами, враховуючи як напрям, так і середнє значення даних. Формула:

Pearson Correlation=i=1n(AiAˉ)(BiBˉ)i=1n(AiAˉ)2i=1n(BiBˉ)2\text{Pearson Correlation} = \frac{\sum_{i=1}^{n} (A_i - \bar{A})(B_i - \bar{B})}{\sqrt{\sum_{i=1}^{n} (A_i - \bar{A})^2} \cdot \sqrt{\sum_{i=1}^{n} (B_i - \bar{B})^2}}

де Aˉ\bar{A} і Bˉ\bar{B} — середні значення векторів A і B. Кореляція Пірсона змінюється від -1 (ідеальний негативний лінійний зв'язок) до 1 (ідеальний позитивний лінійний зв'язок), при 0 — відсутність лінійної залежності. Ця метрика особливо корисна, коли потрібно порівнювати користувачів або об'єкти після усунення індивідуальних упереджень, наприклад, коли один користувач має тенденцію оцінювати все вище або нижче за іншого.

Порівняння

Косинусна схожість
expand arrow
  • Орієнтується на напрям векторів і ігнорує їх середнє значення та величину;
  • Добрий вибір для розріджених даних, де багато оцінок відсутні або дорівнюють нулю, але може переоцінювати схожість, якщо користувачі мають систематично різні шкали оцінювання.
Кореляція Пірсона
expand arrow
  • Віднімає середню оцінку з кожного вектора, що робить її стійкою до відмінностей у шкалі або базових вподобаннях;
  • Краще підходить, коли потрібно враховувати упередження користувача або об'єкта, але може не враховувати нелінійні зв'язки.

Приклад: Обчислення обох метрик

Припустимо, у вас є два користувачі, які оцінили чотири товари. Їхні оцінки:

  • Користувач 1: [4, 0, 3, 5]
  • Користувач 2: [5, 1, 2, 4]

Можна обчислити як косинусну схожість, так і кореляцію Пірсона для цих векторів, щоб порівняти їхню поведінкову схожість.

12345678910111213141516171819
import 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. Яку метрику слід обрати, якщо потрібно порівняти користувачів, які оцінюють об'єкти за дуже різними шкалами (наприклад, один користувач завжди ставить високі оцінки, а інший — низькі)?

question mark

Яка основна відмінність між косинусною схожістю та кореляцією Пірсона при порівнянні векторів користувачів?

Виберіть правильну відповідь

question mark

Яку метрику слід обрати, якщо потрібно порівняти користувачів, які оцінюють об'єкти за дуже різними шкалами (наприклад, один користувач завжди ставить високі оцінки, а інший — низькі)?

Виберіть правильну відповідь

Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 3. Розділ 2

Запитати АІ

expand

Запитати АІ

ChatGPT

Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат

Секція 3. Розділ 2
some-alt