Графическое представление вероятностей

Чтобы не гадать, какие диапазоны апробировать, можно создать графическое представление плотности распределения вероятности. Для построения графиков существует отличная библиотека matplotlib, которую можно скачать с сайта http://matplotlib.sourceforge.net.

Инструкции по установке имеются на сайте, а дополнительную информацию о библиотеке matplotlib вы найдете в приложении А. У этой библиотеки масса возможностей, из которых нам в этой статье понадобится совсем немного. После установки попробуйте создать простой график в интерактивном сеансе:

>>> from pylab import * >>> a=array([1,2,3,4]) >>> b=array([4,2,3,1]) >>> plot(a,b) >>> show( )

>>> t1=arange(0.0,10.0,0.1) >>> plot(t1,sin(t1))

[<matplotlib.lines.Line2D instance at 0x00ED9300>] >>> show( )

В результате должен получиться график, изображенный на рис. 8.9. Функция arange создает список чисел в виде массива примерно так же, как это делает функция range. В данном случае мы рисуем синусоиду на отрезке от 0 до 10.

Рис. 8.9. Простое применение библиотеки matplotlib

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

Чтобы создать набор данных для построения графика кумулятивной вероятности, нужно лишь пробежаться по диапазону цен, вызывая функцию probguess со значением 0 в качестве нижней границы и заданной ценой – в качестве верхней. Результаты следует передать функции plot, которая нарисует график. Добавьте функцию cumulativegraph в файл numpredict.py:

def cumulativegraph(data,vec1,high,k=5,weightf=gaussian): t1=arange(0.0,high,0.1)

cprob=array([probguess(data,vec1,0,v,k,weightf) for v in t1])

plot(t1,cprob)

show( )

Теперь вызовите эту функцию в интерактивном сеансе для построения графика:

>>> reload(numpredict)

<module ‘numpredict’ from ‘numpredict.py’> >>> numpredict.cumulativegraph(data,(1,1),6)

График будет выглядеть примерно так, как показано на рис. 8.10. Как и следовало ожидать, в начальной точке кумулятивная вероятность равна 0, а в конечной – 1. Но интересно, как именно возрастает график. Вероятность остается равной 0 примерно до цены $50, потом, очень быстро возрастая, выходит на плато на уровне 0,6 при цене $110, где снова совершает скачок. Таким образом, глядя на график, мы понимаем, что вероятности группируются в районе цен $60 и $110, поскольку именно в этих точках наблюдаются скачки кумулятивной вероятности. Заранее располагая этой информацией, вы можете рассчитывать вероятности без гадания на кофейной гуще.

Рис. 8.10. График кумулятивной вероятности

Другой вариант – нанести на график фактические вероятности в различных точках по оси цен. Это сложнее, так как вероятность, что цена случайно выбранного образца точно совпадет с заданной, очень мала. Кривая на графике будет равна 0 почти всюду с резкими пиками в спрогнозированных ценах. Вместо этого необходим способ комбинирования вероятностей по некоторым диапазонам.

Решить эту задачу можно, например, предположив, что вероятность в каждой точке есть взвешенное среднее вероятностей в окружающих точках, как во взвешенном алгоритме kNN.

Чтобы продемонстрировать эту идею на практике, добавьте функцию probabilitygraph в файл numpredict.py:

def probabilitygraph(data,vec1,high,k=5,weightf=gaussian,ss=5.0):

#       Подготовить диапазон цен t1=arange(0.0,high,0.1)

#       Вычислить вероятности для всего диапазона probs=[probguess(data,vec1,v,v+0.1,k,weightf) for v in t1]

#       Сгладить их, применив гауссову функцию к соседним вероятностям smoothed=[]

for i in range(len(probs)): sv=0.0

for j in range(0,len(probs)): dist=abs(i-j)*0.1 weight=gaussian(dist,sigma=ss) sv+=weight*probs[j] smoothed.append(sv) smoothed=array(smoothed)

plot(t1,smoothed) show( )

Эта функция создает диапазон от 0 до high, а затем вычисляет вероятности в каждой точке. Поскольку результирующая кривая обычно оказывается зубчатой, то функция пробегает по всему массиву и создает

Рис. 8.11. График плотности распределения вероятности

сглаженный массив, складывая близкие вероятности. Каждая точка на сглаженной кривой – это взвешенная с помощью гауссовой функции сумма соседей. Параметр ss определяет степень сглаживания. Вызовите эту функцию в интерактивном сеансе:

>>> reload(numpredict)

<module ‘numpredict’ from ‘numpredict.py’> >>> numpredict.probabilitygraph(data,(1,1),6)

Должен получиться примерно такой график, как на рис. 8.11. На этом графике еще проще увидеть, в каких точках группируются результаты. Попробуйте различные значения параметра ss и посмотрите, как изменяются результаты. Из этого распределения вероятностей ясно видно, что, прогнозируя стоимость бутылки вина, вы упускаете из виду ключевую информацию о том, что одни люди делают более удачные покупки, чем другие. В некоторых случаях удается определить, что это за информация, а иногда вы просто понимаете, что нужно походить по магазинам и поискать более низкую цену.

Вы можете следить за любыми ответами на эту запись через 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