Оценка плотности распределения вероятности

Вместо того чтобы вычислять средневзвешенное соседей и получать оценку в виде одного числа, в данном случае интересно знать вероятность того, что образец попадает в некоторую ценовую категорию. Для 20-летнего вина с рейтингом 99% искомая функция должна была бы сообщить, что с вероятностью 50% цена окажется в диапазоне от $40 до $80 и с вероятностью 50% – в диапазоне от $80 до $100.

Для этого нужна функция, которая возвращает значение от 0 до 1, представляющее вероятность. Сначала она вычисляет веса соседей в заданном диапазоне, а затем – веса всех соседей. Вероятность равна сумме весов соседей в заданном диапазоне, поделенной на сумму всех весов. Назовите новую функцию probguess и добавьте ее в файл numpredict.py: def probguess(data,vec1,low,high,k=5,weightf=gaussian): dlist=getdistances(data,vec1) nweight=0.0 tweight=0.0

for i in range(k): dist=dlist[i][0] idx=dlist[i][1] weight=weightf(dist) v=data[idx][‘result’]

# Данная точка попадает в диапазон? if v>=low and v<=high: nweight+=weight tweight+=weight if tweight==0: return 0

#    Вероятность равна сумме весов в заданном диапазоне,

#    поделенной на сумму всех весов return nweight/tweight

Как и в алгоритме kNN, эта функция сортирует данные по убыванию расстояния от vec1 и вычисляет веса ближайших соседей. Затем она вычисляет сумму весов всех соседей – tweight. Кроме того, она проверяется, попадает ли цена соседа в заданный диапазон (от low до high); если да, то вес прибавляется к переменной nweight. Вероятность того, что цена vec1 окажется между low и high, равна частному от деления nweight на tweight. Протестируем эту функцию на нашем наборе данных:

>>> reload(numpredict)

<module ‘numpredict’ from ‘numpredict.py’> >>> numpredict.probguess(data,[99,20],40,80)

0.62305988451497296

>>> numpredict.probguess(data,[99,20],80,120)

0.37694011548502687

>>> numpredict.probguess(data,[99,20],120,1000)

0.0

>>> numpredict.probguess(data,[99,20],30,120)

1.0

Функция дает хорошие результаты. Для диапазонов, далеко выходящих за пределы реальных цен, вероятность равна 0, а для диапазонов, полностью перекрывающих возможные цены, она близка к 1. Разбивая диапазон цен на небольшие участки, можно определить, какие из них наиболее вероятны. Однако, чтобы получить ясное представление о структуре данных, вы должны подобрать и ввести набор диапазонов. В следующем разделе мы увидим, как получить полную картину распределения вероятностей.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100