【データマイニング】コストモデル

3916 ワード

ベイズ分類,決定ツリー,ベクトルマシンは,複数の異なる要因に基づく数値データを予測するのに最適ではない.
データセットの構築
#!/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