使用kNN算法预测价格

来源:互联网 发布:stata 债券数据 编辑:程序博客网 时间:2024/05/17 02:22
# -*- coding: cp936 -*-#使用kNN预测价格from random import random,randintimport mathdef wineprice(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 pricedef 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 rowsdef euclidean(v1,v2):    d=0.0    for i in range(len(v1)):        d+=(v1[i]-v2[i])**2    return math.sqrt(d)def getdistances(data,vec1):    distancelist=[]    for i in range(len(data)):        vec2=data[i]['input']        distancelist.append((euclidean(vec1,vec2),i))    distancelist.sort()    return distancelistdef knnestimate(data,vec1,k=5):    dlist=getdistances(data,vec1)    avg=0.0    for i in range(k):        idx=dlist[i][1]        avg+=data[idx]['result']    avg=avg/k    return avgdef gaussian(dist,sigma=10.0):    return math.e**(-dist**2/(2*sigma**2))def weightedknn(data,vec1,k=5,weightf=gaussian):    dlist=getdistances(data,vec1)    avg=0.0    totalweight=0.0    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

0 1
原创粉丝点击