Ваша единственная опция, кажется, клиентская проверка, потому что сторона сервера означает, что файл был уже загружен. Также тип MIME обычно диктует расширение файла.
используют Платформу JavaScript как jQuery для перегрузки onsubmit события формы. Тогда проверьте расширение. Это ограничит большинство попыток. Однако, если человек изменит изображение на дополнительный XLS тогда, то у Вас будет проблема.
я не знаю, является ли это опцией для Вас, но Вы имеете больше клиентского контроля при использовании чего-то как Silverlight или Flash для загрузки. Можно рассмотреть использование одной из этих технологий для процесса загрузки.
В вашем результате нет ничего плохого. Вы пытаетесь провести линию через 3 точки. Во втором случае у вас есть все три точки с одинаковыми координатами, т.е. фактически одна точка. Вы не можете сказать, коррелируют ли эти точки или антикоррелируют, потому что вы можете провести бесконечное количество линий через одну точку ( den
в вашем коде равно нулю).
Если вы посмотрите корреляцию Пирсона в википедии , вы увидите, что формула использует разницу между каждым элементом в серии и средним значением серии. Когда все элементы в серии одинаковые, вы получаете деление на ноль, так что ваш расчет не удастся.
Если это немного яснее, вы можете использовать этот код:
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 для определения правильного ответа - хороший способ проверить большинство расчетов. В этом случае вы бы использовали коррелят
.
Корреляция не подразумевает причинной связи. Пришлось это сказать. Вам необходимо развить понимание статистики корреляции. Корреляция может быть между -1 и 1, а значение 0 попадает в этот диапазон и является вполне разумным результатом. Корреляция 0 означает, что нет статистически значимой связи между двумя переменными. Не забывайте не проводить статистику с менее чем 30 образцами.
Алгоритм дает правильный результат. 0 означает, что между ними нет корреляции (или, по крайней мере, вы не можете сказать, исходя из того, что вам известно).
Как правило (в зависимости от того, в какой области вы применяете этот алгоритм) вы можете рассматривать все между -0,9