Построение демонстрационного набора данных

Интересный набор данных для тестирования алгоритмов числового прогнозирования должен обладать несколькими свойствами, которые усложняли бы выработку прогноза. Если посмотреть телевизор, то можно придти к выводу, что чем больше, тем лучше; подобные задачи проще решать традиционными статистическими методами. Поэтому было бы более любопытно изучить такой набор данных, где цена не просто возрастает пропорционально размеру или количеству характеристик. В этом разделе мы создадим набор данных о ценах на вина, основанный на простой искусственной модели. Цена зависит от сочетания рейтинга и возраста вина. В модели предполагается, что у вина имеется оптимальный возраст, который больше для хороших вин и очень близок к году производства – для плохих. У вина с высоким рейтингом высокая начальная цена, которая возрастает до достижения оптимального возраста, а низкорейтинговое вино изначально стоит дешево и со временем только дешевеет.

Для моделирования этой задачи создайте файл numpredict.py и включите в него функцию wineprice: from random import random,randint import math

def wineprice(rating,age): peak_age=rating-50

# Вычислить цену в зависимости от рейтинга

price=rating/2

if age>peak_age:

#      Оптимальный возраст пройден, через 5 лет испортится price=price*(5-(age-peak_age))

else:

#      Увеличивать до пятикратной начальной цены по мере

#      приближения к оптимальному возрасту price=price*(5*((age+1)/peak_age))

if price<0: price=0 return price

Понадобится также функция построения набора данных о ценах на вина. Следующая функция генерирует набор из 200 бутылок вина и вычисляет их цены на основе построенной модели. Затем она случайным образом прибавляет или вычитает 20%, чтобы учесть такие факторы, как налогообложение и местные вариации цен, а также еще немного затруднить прогнозирование числовых значений. Добавьте функцию wineset1 в файл numpredict.py:

def wineset1( ): rows=[]

for i in range(300):

#     Случайным образом выбрать рейтинг и возраст rating=random( )*50+50

age=random( )*50

#      Вычислить эталонную цену price=wineprice(rating,age)

#     Добавить шум price*=(random( )*0.4+0.8)

#      Включить в набор данных rows.append({‘input’:(rating,age),

‘result’:price})

return rows

Запустите интерпретатор Python, проверьте цены на некоторые вины и сгенерируйте новый набор данных: $ python

>>> import numpredict

>>> numpredict.wineprice(95.0,3.0)

21.111111111111114

>>> numpredict.wineprice(95.0,8.0)

47.5

>>> numpredict.wineprice(99.0,1.0)

10.102040816326529

>>> data=numpredict.wineset1( )

>>> data[0]

{‘input’: (63.602840187200407, 21.574120872184949), ‘result’: 34.565257353086487} >>> data[1]

{‘input’: (74.994980945756794, 48.052051269308649), ‘result’: 0.0} В этом наборе вторая бутылка слишком старая и вино в ней уже выдохлось, а в первой как раз созрело. Наличие зависимостей между переменными делает этот набор данных вполне подходящим для тестирования алгоритмов.

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