【データマイニング】コストモデル
3916 ワード
ベイズ分類,決定ツリー,ベクトルマシンは,複数の異なる要因に基づく数値データを予測するのに最適ではない.
データセットの構築
類似度の定義
本論文ではratingとpriceをベクトルとして類似度を計算する
k-Nearest Neighbors
k-nearest neighbors(kNN):似たようなitemのセットを見つけることで、それらの平均価格をあなたのItem価格の推測とします.kNNで述べたkはitemの数であり,平均を計算して最終結果を得るために用いられる.kが1であれば、最近の隣人を選んで、その価格を使うことを意味します.隣人を選択しすぎると、推定値の精度が低下します.
重み付きNeighborsによるkNNアルゴリズムの補完は,距離に基づいて重みを決定する.itemが似ているほど、距離が小さくなり、距離を重みに変換する方法が必要になります.
いせいたいへんすう
データセットの構築
#!/usr/bin/python
from random import random,randint
import math
# , , , peak age
# , ,
#
def wineprice(rating,age):#rating ,age
peak_age=rating - 50#
price = rating/2 #
if age > peak_age:
price = price * (5 - (age - peak_age))
else:
price = price * (5 *(age+1)/peak_age)
if price < 0:price =0
return price
#
def genwineset():
rows=[]
for i in range(300):
rating = random()*50+50
age=radom()*50
price=wineprice(rating,age)
#
price*=random()*0.4+0.8
rows.append({'input':(rating,age),'result':price})
return rows
類似度の定義
本論文ではratingとpriceをベクトルとして類似度を計算する
#
def euclidean(v1,v2):
d=0.0
for i in range(len(v1)):
d+=(v1[i]-v2[i])**2
return math.sqrt(d)
k-Nearest Neighbors
k-nearest neighbors(kNN):似たようなitemのセットを見つけることで、それらの平均価格をあなたのItem価格の推測とします.kNNで述べたkはitemの数であり,平均を計算して最終結果を得るために用いられる.kが1であれば、最近の隣人を選んで、その価格を使うことを意味します.隣人を選択しすぎると、推定値の精度が低下します.
# v1
def getdistances(data,vec1):
distancelist=[]
for i in range(len(data)):
vec2=data[i]['input']
distancelist.append((euclidean(vec1,vec2),i))
distancelist.sort
#kNN
def knnestimate(data,vec1,k=3):
#
dlist=getdistances(data,vec1)
avg=0.0
# Take the average of the top k results
for i in range(k):
idx=dlist[i][1]
avg+=data[idx]['result']
avg=avg/k
return avg
重み付きNeighborsによるkNNアルゴリズムの補完は,距離に基づいて重みを決定する.itemが似ているほど、距離が小さくなり、距離を重みに変換する方法が必要になります.
# ,dist , item,
def inverseweight(dist,num=1.0,const=0.1):
return num/(dist+const)
#
def subtractweight(dist,const=1.0):
if dist>const:
return 0
else:
return const-dist
#
def gaussian(dist,sigma=10.0):
return math.e**(-dist**2/(2*sigma**2))
# kNN
def weightedknn(data,vec1,k=5,weightf=gaussian):
# Get distances
dlist=getdistances(data,vec1)
avg=0.0
totalweight=0.0
# Get weighted average
for i in range(k):
dist=dlist[i][0]
idx=dlist[i][1]
weight=weightf(dist)
avg+=weight*data[idx]['result']
totalweight+=weight#
avg=avg/totalweight#
return avg
いせいたいへんすう
# ,
def wineset2():
rows=[]
for i in range(300):
rating=random()*50+50
age=random()*50
aisle=float(randint(1,20))
bottlesize=[375.0,750.0,1500.0,3000.0][randint(0,3)]
price=wineprice(rating,age)
price*=(bottlesize/750)
price*=(random()*0.9+0.2)
rows.append({'input':(rating,age,aisle,bottlesize),
'result':price})
# scale , , scale
def rescale(data,scale):
scaleddata=[]
for row in data:
scaled=[scale[i]*row['input'][i] for i in range(len(scale))]
scaleddata.append({'input':scaled,'result':row['result']})
return scaleddata
def wineset3():# , price , ,
rows=genwineset()
for row in rows:
if random()<0.5:
# Wine was bought at a discount store
row['result']*=0.6
return rows