Что не так с pearson алгоритмом от “Программирования Коллективного разума”?

Ваша единственная опция, кажется, клиентская проверка, потому что сторона сервера означает, что файл был уже загружен. Также тип MIME обычно диктует расширение файла.

используют Платформу JavaScript как jQuery для перегрузки onsubmit события формы. Тогда проверьте расширение. Это ограничит большинство попыток. Однако, если человек изменит изображение на дополнительный XLS тогда, то у Вас будет проблема.

я не знаю, является ли это опцией для Вас, но Вы имеете больше клиентского контроля при использовании чего-то как Silverlight или Flash для загрузки. Можно рассмотреть использование одной из этих технологий для процесса загрузки.

5
задан Community 23 May 2017 в 11:51
поделиться

4 ответа

В вашем результате нет ничего плохого. Вы пытаетесь провести линию через 3 точки. Во втором случае у вас есть все три точки с одинаковыми координатами, т.е. фактически одна точка. Вы не можете сказать, коррелируют ли эти точки или антикоррелируют, потому что вы можете провести бесконечное количество линий через одну точку ( den в вашем коде равно нулю).

11
ответ дан 18 December 2019 в 13:15
поделиться

Если вы посмотрите корреляцию Пирсона в википедии , вы увидите, что формула использует разницу между каждым элементом в серии и средним значением серии. Когда все элементы в серии одинаковые, вы получаете деление на ноль, так что ваш расчет не удастся.

Если это немного яснее, вы можете использовать этот код:

def simplified_sim_pearson(p1, p2):
    n = len(p1)
    assert (n != 0)
    sum1 = sum(p1)
    sum2 = sum(p2)
    m1 = float(sum1) / n
    m2 = float(sum2) / n
    p1mean = [(x - m1) for x in p1]
    p2mean = [(y - m2) for y in p2]
    numerator = sum(x * y for x, y in zip(p1mean, p2mean))
    denominator = math.sqrt(sum(x * x for x in p1mean) * sum(y * y for y in p2mean))
    return numerator / denominator if denominator else 0

def sim_pearson(prefs,p1,p2):
    p1 = prefs[p1]
    p2 = prefs[p2]
    si = set(p1.keys()).intersection(set(p2.keys()))
    p1_x = [p1[k] for k in sorted(si)]
    p2_x = [p2[k] for k in sorted(si)]
    return simplified_sim_pearson(p1_x, p2_x)



critics = {
    'user1':{
        'item1': 3,
        'item2': 5,
        'item3': 5,
        },
    'user2':{
        'item1': 4,
        'item2': 5,
        'item3': 5,
        }
}
critics2 = {
    'user1':{
        'item1': 5,
        'item2': 5,
        'item3': 5,
        },
    'user2':{
        'item1': 5,
        'item2': 5,
        'item3': 5,
        }
}
critics3 = {
    'user1':{
        'item1': 1,
        'item2': 3,
        'item3': 5,
        },
    'user2':{
        'item1': 5,
        'item2': 3,
        'item3': 1,
        }
}

print sim_pearson(critics, 'user1', 'user2', )
print sim_pearson(critics2, 'user1', 'user2', )
print sim_pearson(critics3, 'user1', 'user2', )

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

3
ответ дан 18 December 2019 в 13:15
поделиться

Корреляция не подразумевает причинной связи. Пришлось это сказать. Вам необходимо развить понимание статистики корреляции. Корреляция может быть между -1 и 1, а значение 0 попадает в этот диапазон и является вполне разумным результатом. Корреляция 0 означает, что нет статистически значимой связи между двумя переменными. Не забывайте не проводить статистику с менее чем 30 образцами.

0
ответ дан 18 December 2019 в 13:15
поделиться

Алгоритм дает правильный результат. 0 означает, что между ними нет корреляции (или, по крайней мере, вы не можете сказать, исходя из того, что вам известно).

Как правило (в зависимости от того, в какой области вы применяете этот алгоритм) вы можете рассматривать все между -0,9

0
ответ дан 18 December 2019 в 13:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: