Pull to refresh
56
9
Subscribers
Send message
Спасибо Андорро за организацию: на этот раз персонал был значительно шустрее.
Зачем такие сложности? можно проще:

Не обязательно…
Некоторые любят заниматься
— «обычным, русским, кухонным нытьем»
и занесением в личное тело
от одного года до семи лет
Андорро, ты хотел чтобы побольше людей приходило, но если объявлять встречи за день это явно сократит их количество, многие уже могли что-либо запланировать
Хотел в отчет предыдущей встречи запостить, но видимо не дождусь:



и на эту тоже приду
В предыдущем топике автора я уже поднимал вопрос странности косинусной метрики:
Мои данные
__Id_|__Косинусная метрика_|_Евклидово расстояние
(11382, (0.9945617655513243, 6.0))
(25881, (0.9946889722415817, 10.44030650891055))
(32657, (0.9948579893001871, 4.58257569495584))
(11642, (0.9949290831814581, 4.898979485566356))
(29796, (0.9950464316093013, 5.656854249492381))
(31417, (0.9951124675317691, 6.782329983125268))
(40530, (0.9952102629001573, 4.58257569495584))
(8311, (0.9952136477352348, 5.830951894845301))
(37772, (0.995641393209143, 4.47213595499958))
(11087, (0.9964597867088298, 4.795831523312719))
(9641, (0.996734136199907, 3.7416573867739413))
(9651, (0.9969863072847556, 30.04995840263344))
(22462, (0.9972173920027746, 3.3166247903554))
(6309, (0.9999999999999999, 0.0))

Почему-то появился объект 9651(третий с конца) хотя у него оценки сильно разнятся
Автор ответил:
По поводу использования метрик: предположим, у нас есть три вектора (10, 10, 1), (1, 1, 0) и (0, 0, 1). Согласно евклидовому расстоянию наиболее близки вектора 2 и 3, а по косинусной метрике — 1 и 2, что более корректно.
Выбор метрики обусловлен конкретной задачей

я так и не понял почему это более коректно

я не сделал ни одного математического действия
я ошибся во второй группе, там Иван и Давид(у Алекса и Давида вообще нет пересечений)
все остальные числа из статьи:
схожесть группы №1 = 0.51
схожесть группы №2 = 0.06
спасибо за статью, я все ещё пишу свой рекомендательный сервис и решил поспрашивать

Давайте рассмотрим Алекса, Ивана и Давида
Группа №1: у Алекса и Ивана одно пересечение №1, оценки 5 и 4 соответственно
Группа №2: у Алекса и Давида одно пересечение №6, оценки 1 и 2 соответственно

Первой группе обоим нравится один фильм, а второй обоим один фильм не нравится

Косинусная мера считает, что Группа №1 в десять раз более схожая, чем Группа №2
Мне кажется, что тут явная логическая ошибка… Как бы вы могли прокомментировать данное поведение(если можно с живыми примерами)?

в третьей версии так и есть для строк:
>>> 'fff' > 2
Traceback (most recent call last):
File "<pyshell#6>", line 1, in 'fff' > 2
TypeError: unorderable types: str() > int()

а вообще это обычное приведение типов, не в этом ничего страшного
«Марк Лутц. Изучаем Python, 4-е издание»
не самая лучшая книга по программированию — слишком много повторов и воды, но лучше книги я не нашел

Сейчас идет переход с 2 на 3 версию питона и приходится запоминать много нюансов в обоих

В любом случае Питон захватывает и это окупает любые трудности на его изучение
почитав Макконнелла думаю:
(Читаемый синтаксис) ∈ (качество ПО)

но в Питоне также можно наделать генераторов, цепочки вызовов и так далее, потому что он слабо ограничивает программиста и там уже все может получиться сложнее чем должно бы быть
нет, в Питоне нет приватных методов и свойств из коробки(можно попробовать переписать метод __getattr или __call). __ защищает от возможности переопределения методов.
а я сыграл один раз в Стартап и мое поведение в других играх сразу поменялось, теперь я часто ищу коллективные решения
спасибо, я так сделал потому что на википедии сказано:
where Ixy is the set of items rated by both user x and user y
возможно у них ошибка

Попробую с полной длиной, тогда разница с евклидовым расстоянием будет яснее
миссклик
код
def getSimilarity(userA, userB):
    if len(userA) < len(userB):
        lessList = userA
        moreList = userB
    else:
        lessList = userB
        moreList = userA
    mulSum = 0
    quadSum1 = 0
    quadSum2 = 0
    count = 0
    for key, val1 in lessList.items():
        if key in moreList:
            val1 = int(val1)
            val2 = int(moreList[key])
            mulSum += val1 * val2
            quadSum1 += val1 * val1
            quadSum2 += val2 * val2
            count += 1
    res = 0
    if mulSum and count > 20:
        res = mulSum / (math.sqrt(quadSum1) * math.sqrt(quadSum2))
    return res


Главный вопрос зачем пользоваться косинусной метрикой, если Евклидово расстояние показывает тоже самое?
попробовал косинусную метрику:
для пользователя 6309
__Id_|__Косинусная метрика_|_Евклидово расстояние
(11382, (0.9945617655513243, 6.0))
(25881, (0.9946889722415817, 10.44030650891055))
(32657, (0.9948579893001871, 4.58257569495584))
(11642, (0.9949290831814581, 4.898979485566356))
(29796, (0.9950464316093013, 5.656854249492381))
(31417, (0.9951124675317691, 6.782329983125268))
(40530, (0.9952102629001573, 4.58257569495584))
(8311, (0.9952136477352348, 5.830951894845301))
(37772, (0.995641393209143, 4.47213595499958))
(11087, (0.9964597867088298, 4.795831523312719))
(9641, (0.996734136199907, 3.7416573867739413))
(9651, (0.9969863072847556, 30.04995840263344))
(22462, (0.9972173920027746, 3.3166247903554))
(6309, (0.9999999999999999, 0.0))

Почему-то появился объект 9651(третий с конца) хотя у него оценки сильно разнятся
возможно я ошибся в коде:
да, пользователей порядка 500к
спасибо, то что нужно
спасибо за статью
хочу узнать ваше мнение по следующему вопросу:
делаю небольшой свой рекомендательный сервис, в статье на Википедии одним из алгоритмов для этого является kNN

Первоначальную разбивку на группы собираюсь делать методом к-средних, тк нет первоначальных групп
Чем лучше определять принадлежность к данной группе? Методом kNN или Расстоянием до центра элипсойда, который получается при k-means? или я делаю какую-то ерунду?

Information

Rating
Does not participate
Registered
Activity