Задать вопрос
  • Как реализовать рекомендательную систему по формуле Байеса?

    barmaley_exe
    @barmaley_exe
    Видимо, речь идёт о наивном Байесовском классификаторе.

    Во-первых, поставим проблему чуть иначе: вместо рекомендациях следует говорить о классификации на 2 класса (нравится или не нравится).

    Далее, наивный Байесовский классификатор основывается на 2 идеях: собственно, Теорема Байеса и условная независимость признаков объектов.

    Пусть P(like|x) — вероятность того, что данному пользователю понравится объект x, описывающийся характеристиками x1, ..., xn. Эти характеристики могут быть совершенно произвольными, не обязательно одного "типа". Вопрос лишь в том, какое вы зададите на них распределение. Очевидно, что если вероятность P(like|x) > 1/2, то вероятность негативной оценки будет меньше, а значит, нужно предсказывать "нравится". Таким образом, нашей задачей является оценить вероятности P(like|x) и P(dislike|x) (которая, в свою очередь равна 1-P(like|x), поскольку сумма вероятностей равна 1) и выбрать наибольшую.

    Тут самое время применить теорему Байеса:

    P(like|x) = P(x|like) P(like) / P(x) и P(dislike|x) = P(x|dislike) P(dislike) / P(x)

    Примечательным фактом является то, что знаменатель мы можем проигнорировать, ведь он один и тот же для P(like|x) и P(dislike|x), а нас интересует только соотношение между этими числами, а не они сами. Тогда сравнивать мы будем P(x|like) P(like) и P(x|dislike) P(dislike). В данном случае P(like) выражает наши априорные знания о том, насколько вероятно, что объект понравится пользователю. Если таких знаний нет, можно смело брать 1/2.
    P(x|like), в свою очередь, описывает, насколько вероятно встретить такой объект в классе понравившихся. Вся наивность рассматриваемого классификатора заключается именно в моделировании этого распределения.

    Поскольку вероятность P(x|like) может зависеть от x самым причудливым и произвольным образом, нам нужно сделать какое-то предположение. В случае наивного Байесовского классификатора этим предположением выступает ничем не подкреплённая гипотеза условной независимости признаков объекта при заданном классе, то есть: P(x|like) = P1(x1|like) ... Pn(xn|like). Здесь Pk — произвольное распределение, оно может быть как дискретным (цвет или тип, в Вашем случае), так и "непрерывным" (клиренс). Данные распределения должны быть выбраны разработчиком классификатора. Обычно они содержат какие-то параметры, которые мы в дальнейшем настроим по данным с помощью метода максимального правдоподобия. Для многих распределений оценки можно выписать аналитически. Например, для дискретных признаков можно посчитать эмпирическую частоту значения (плюс сглаживание для тех объектов, которые пользователь ни разу не видел), а для нормального распределения посчитать выборочное среднее и дисперсию.

    Резюмируя, ответы на Ваши вопросы:

    1. Формула Байеса имеет такое же отношение к Байесовскому классификатору, какое дерево к столу. Да, формула используется, но это ещё не всё.

    2. Про известные подходы ничего не скажу, но на ум приходит следующее: при классификации можно сравнивать не произведение вероятностей, а его логарифм (благодаря его монотонности) log(P1(x1|like) ... Pn(xn|like)) = log(P1(x1|like)) + ... + log(Pn(xn|like)). Чем больше эта сумма — тем больше вероятность лайка. Можно попробовать взвесить эти слагаемые.

    3. На отдельные признаки можно задавать произвольные распределения, например, нормальное для численных значений.

    Теперь о проблемах: вышеописанный подход хорош, но обладает существенным недостатком: если применять её ко всем пользователям без разбору, то получится модель среднего пользователя, которое будет рекомендовать всем одно и то же. Фишка же рекомендательной системы заключается в персонализации. С другой стороны, если строить по байесовскому классификатору на пользователя, скорее всего, Вам не хватит данных для получения каких-либо значимых результатов. Со второй проблемой можно бороться, если принять во внимание существование похожих пользователей: Если Алиса заинтересовалась объектами {A, B, C, D}, а Борису понравились {B, C, D, E}, то наивный Байес либо усреднит их со всеми остальными (представим, что существует 1000 пользователей, заинтересовавшихся объектом P. Тогда его "вес" будет существенно больше, но только лишь благодаря его популярности, а ведь для нахождения наиболее популярных объектов хватит и простой сортировки), либо построит для обоих по собственному классификатору, даже не подозревая о том, что эти пользователи похожи. Одним из подходов, учитывающих это, является коллаборативная фильтрация, наиболее активно используемая в задачах рекомендации.
    Ответ написан
    Комментировать
  • Как сделать так, чтобы ключи в объекте шли по очереди даже после удаления?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Есть такая штука - массив называется. Попробуйте как-нибудь.
    Ответ написан
    4 комментария
  • Что делать, когда умеешь программировать, но нет идей?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Открываешь upwork, ищешь подробно описанные заказы, реализуешь их.
    Ответ написан
    Комментировать
  • Асинхронный генератор и обещание массив?

    @StockholmSyndrome
    обратите внимание, что в setTimeout нужно передавать resolve, а не результат её вызова
    const promiseList = [
      new Promise(resolve => setTimeout(resolve, 200, 15)),
      new Promise(resolve => setTimeout(resolve, 600, 17)),
      new Promise(resolve => setTimeout(resolve, 500, 42))
    ];


    async function* promiseGenerator(arrPromise) {
      const result = []; 
      const push = (val) => result.push(val);
    
      const promises = arrPromise.map((promise) => promise.then(push));
      await Promise.all(promises); 
    
      for (let i = result.length - 1; i >= 0; --i) {
        yield result[i];
      }
    }
    Ответ написан
    1 комментарий
  • Как сделать web страницу с генератором картинки?

    это можно сделать на Canvas
    у него есть экспорт картинки в виде dataURL
    Ответ написан
    Комментировать
  • Как определить переменную в цикле?

    MalkovVladimir73
    @MalkovVladimir73
    Fullstack (node + vue.js)
    По моему мнению вам следует использовать объект и обращаться к его свойствам.
    Ну а ваш пример можно сделать рабочим примерно так:
    function example() {
      for (let i = 1; i <= 3; i++) {
        this['zp' + i] = prompt('Введите зарплату '+ [i]+ ' сотрудника');
      }
    
      console.log(zp1, zp2, zp3);
    }
    
    example();
    Ответ написан
    Комментировать
  • Как проверить, что у массивов есть одинаковые элементы?

    @dimoff66
    Кратко о себе: Я есть
    Или...
    new Set([...arr1, ...arr2]).size < arr1.length + arr2.length


    Или

    arr1.find(v => arr2.includes(v))

    Если массивы отсортированы, то самый быстрый код будет следующий (букв много но операций будет максимум сумма длинн массива)

    function arrayHaveMatches(arr1, arr2) {
        const arrays = [arr1, arr2]
        const indexes = [0, 0]
        let currArray = arr2[0] < arr1[0]
        let val2 = arrays[!currArray][0]
    
        while (indexes[currArray] < arrays[currArray].length) {
          const val1 = arrays[currArray][indexes[currArray]]
          if (val1 === val2) {
            return true
          } else if (val1 > val2) {
            currArray = !currArray
            val2 = val1
          }
          indexes[currArray] ++
        }
        
        return false
      }
    Ответ написан
    2 комментария
  • Как вложить элементы массива друг в друга начиная с конца?

    0xD34F
    @0xD34F Куратор тега JavaScript
    array.reduceRight((acc, n) => ({ ...n, children: [ ...n.children, acc ] }), { ...obj })
    Ответ написан
    1 комментарий
  • Как закрыть XMLHttpRequest от общего доступа?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    В дополнение к Сергей Соколов могу подсказать следующий этап: защита от кражи сессии. Это делается путем нумерации запросов. То есть каждый запрос передается число, которое на 1 больше предыдущего. Так что даже если кто-то украдет сессию и сможет ее использовать, у пользователя она протухнет и вы сможете показать ему ошибки рассинхронизации. И уже сам пользователь начнет искать злоумышленника.

    Хотя если сам пользователь является злоумышленником, причем умным и упёртым, то понадобится дальше наращивать защиту. Но это уже война снаряда и брони, а она, как известно, вечная, и выигрывает тот, у кого больше ресурсов и терпения.
    Ответ написан
    Комментировать
  • Как защитить переменную js?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    Если вам нужно защитить данные в javascript коде от постороннего вмешательства, то вам не нужно эти данные размещать в javascript коде.
    Ответ написан
    Комментировать
  • Как быстро засыпать чтобы было больше времени на изучение программирования?

    anton_reut
    @anton_reut
    Начинающий веб-разработчик
    Вот так: https://www.adme.ru/zhizn-nauka/kak-zasnut-za-2-mi...
    Ну или заняться сексом с любимой девушкой, после хорошего секса отрубаешься моментально.
    Ответ написан
    5 комментариев
  • Как создать массив со случайными числами без повторений?

    const array = Array.from({ length: 20 }, (v, i) =>
      Math.floor(Math.random() * (10 - 1) + 1 ));
    const set = new Set(array);
    const result = [...set].slice(0, 5);
    console.log(result);


    или так
    const array = Array.from({ length: 10 }, (v, i) => i)
      .sort((a, b) => 0.5 - Math.random())
      .slice(0, 5);
    console.log(array);
    Ответ написан
    Комментировать
  • Где отслеживать IT-мероприятия Москвы?

    kores
    @kores
    Помог ответ? Отметь решением!
    https://ict2go.ru/events/?region=4&event_type=&eve... Сразу с фильтрами на москву, точно все не успеешь пройти, там их завались!)
    Ответ написан
    Комментировать
  • Как сократить код, используя тернарный оператор?

    return (answer => answer % 1 ? -1 : answer)(value / n);

    Или со сжатием:

    return(a=>a%1?-1:a)(value/n)

    Но лучше оставьте, как есть.
    Ответ написан
    Комментировать
  • Как правильно сравнить десятичные числа в JS?

    SagePtr
    @SagePtr
    Еда - это святое
    Math.abs(x - y) <= 0.01 к примеру
    Ответ написан
    2 комментария
  • Как правильно сравнить десятичные числа в JS?

    @dimoff66
    Кратко о себе: Я есть
    Определяем количество знаков после запятой и разницу между числами умножаем
    и округляем до целого (все эти операции, чтобы избавиться от js-ных неточностей)
    Если целое не больше единицы, значит равно.

    Если количество знаков после запятой определяется по первому переданному числу, то код следующий

    const compare= (v, v2) => {
       const parts = String(v).split('.')
       const pow = parts.length > 1 ? parts.pop().length : 0     
       return Math.round(Math.abs(v - v2) * Math.pow(10, pow)) <= 1
    }
    
    console.log(compare(7.98, 7.99)) // true
    console.log(compare(7.98, 7.97)) // true
    console.log(compare(7.98, 8)) // false
    console.log(compare(0.1, 0.15)) // true


    если по числу с наибольшим количеством знаков после запятой, то такой

    const compare= (v, v2) => {
       const parts = [v, v2].map(v => String(v).split('.'))
       const pow = Math.max(...parts.map(v => v.length > 1 ? v.pop().length : 0))
       return Math.round(Math.abs(v - v2) * Math.pow(10, pow)) <= 1
    }
    
    console.log(compare(7.98, 7.99)) // true
    console.log(compare(7.98, 7.97)) // true
    console.log(compare(7.98, 8)) // false
    console.log(compare(0.1, 0.15)) // false
    Ответ написан
    4 комментария
  • Почему зависает сайт при свободной памяти и процессоре?

    2ord
    @2ord
    Нечего гадать. Нужна информация по мониторингу параметров ОС.
    Чтобы узнать подробнее, нужно иметь историю событий. Программа atop умеет вести учет процессов и ресурсов, позволяя позже проиграть историю, выяснив причину проблемы.
    https://haydenjames.io/use-atop-linux-server-perfo...
    https://haydenjames.io/linux-server-performance-di...

    Как диагностировать зависание php-fpm процессов?
    Ответ написан
    8 комментариев
  • Как создать связный список из массива?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Перебираем массив от конца к началу, на каждом шаге создаём узел связного списка - в качестве значения используется текущий элемент массива, а следующим элементом списка будет выступать узел, полученный на предыдущем шаге:

    const createList = arr => arr.reduceRight((acc, n) => ({ val: n, next: acc }), null);
    
    const list = createList([ 1, 2, 3, 4 ]);
    Ответ написан
    6 комментариев
  • Какие лимиты на редактиование/добавление товаров в группу вк?

    fwlone
    @fwlone
    ^^
    3. Ограничения и рекомендации
    3.1. Частотные ограничения
    К методам API ВКонтакте (за исключением методов из секций secure и ads) с ключом доступа пользователя или сервисным ключом доступа можно обращаться не чаще 3 раз в секунду. Для ключа доступа сообщества ограничение составляет 20 запросов в секунду. Если логика Вашего приложения подразумевает вызов нескольких методов подряд, имеет смысл обратить внимание на метод execute. Он позволяет совершить до 25 обращений к разным методам в рамках одного запроса.

    Для методов секции ads действуют собственные ограничения, ознакомиться с ними Вы можете на этой странице.

    Максимальное число обращений к методам секции secure зависит от числа пользователей, установивших приложение. Если приложение установило меньше 10 000 человек, то можно совершать 5 запросов в секунду, до 100 000 — 8 запросов, до 1 000 000 — 20 запросов, больше 1 млн. — 35 запросов в секунду.

    Если Вы превысите частотное ограничение, сервер вернет ошибку с кодом 6: "Too many requests per second.".

    3.2. Количественные ограничения
    Помимо ограничений на частоту обращений, существуют и количественные ограничения на вызов однотипных методов. По понятным причинам, мы не предоставляем информацию о точных лимитах.

    После превышения количественного лимита доступ к конкретному методу может требовать ввода капчи (см. captcha_error), а также может быть временно ограничен (в таком случае сервер не возвращает ответ на вызов конкретного метода, но без проблем обрабатывает любые другие запросы).
    Ответ написан
    1 комментарий