一、构造数据

#根据rating和age评估价格
def wineprice(rating,age):peak_age=rating-50price=rating/2if age>peak_age:price=price*(5-(age-peak_age))#过了峰值年,价值降低else:price=price*(5*(age+1)/peak_age)#临近峰值年,价值增高if price<0:price=0return price#构造数据集合:输入——rating,age;输出——price
def wineset1():rows=[]for i in range(300):rating=random()*50+50age=random()*50price=wineprice(rating,age)price*=(random()*0.4+0.8)rows.append({'input':(rating,age),'result':price})return rows#构造数据集合:输入——rating,age,aisle,bottlesize;输出——price
def wineset2():rows=[]for i in range(300):rating=random()*50+50age=random()*50aisle=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})return rows

二、距离评估

#为了使距离度量更有说服力,将数据根据不同维度的影响力进行收缩或者扩张处理
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 enclidean(v1,v2):d=0.0for i in range(len(v1)):d+=(v1[i]-v2[i])**2return sqrt(d)#数据集data中每条记录按照和vec1的欧氏距离从小到大排序
def getdistances(data,vec1):distancelist=[]for i in range(len(data)):vec2=data[i]['input']distancelist.append((enclidean(vec1,vec2),i))distancelist.sort()return distancelist

三、K近邻预测

#k近邻预测价格
def knnestimate(data,vec1,k=5):dlist=getdistances(data,vec1)avg=0.0for i in range(k):idx=dlist[i][1]avg+=data[idx]['result']avg=avg/kreturn avg#三种方法为k个近邻项的影响设置权值,保证距离被预测的对象越远,影响越小#反函数,对距离很近和很远比较敏感,尤其是对很近的"噪音数据"
def inverseweight(dist,num=1.0,const=0.1):return num/(dist+const)#递减的一次函数,容易造成影响全为0
def subtractweight(dist,const=1.0):if dist>const:return 0else:return const-dist#膜拜高斯大神!!!!!!
def gaussian(dist,sigma=10.0):return math.e**(-dist**2/(2*sigma**2))#加入距离影响权值的k近邻预测算法
def weightedknn(data,vec1,k=5,weightf=gaussian):dlist=getdistances(data,vec1)avg=0.0totalweight=0.0for i in range(k):dist=dlist[i][0]idx=dlist[i][1]weight=weightf(dist)avg+=weight*data[idx]['result']totalweight+=weightavg=avg/totalweightreturn avg

四、交叉验证

#划分数据集为测试数据集合和训练数据集合
def dividedata(data,test=0.05):trainset=[]testset=[]for row in data:if random()<test:testset.append(row)else:trainset.append(row)return trainset,testset#用训练集合训练预测,用测试集合计算偏差
def testalgorithm(algf,trainset,testset):error=0.0for row in testset:guess=algf(trainset,row['input'])error+=(row['result']-guess)**2return error/len(testset)#交叉验证,随机验证N次求取平均值
def crossvalidate(algf,data,trials=100,test=0.05):error=0.0for i in range(trials):trainset,testset=dividedata(data,test)error+=testalgorithm(algf,trainset,testset)return error/trials#k=3或者1的k近邻预测算法
def knn3(d,v):return knnestimate(d,v,k=3)
def knn1(d,v):return knnestimate(d,v,k=1)
def wknn3(d,v):return weightedknn(d,v,k=3)
def wknn1(d,v):return weightedknn(d,v,k=1)

五、测试

data=wineset2()
data=rescale(data,[10,10,0,0.5])
print(crossvalidate(weightedknn,data))
print(crossvalidate(wknn3,data))
print(crossvalidate(wknn1,data))

输出

7553.2723966454005
6079.271962207396
7672.686618173495

可以看出k过大、过小的预测结果偏差都比较大,因为k较小容易出现过拟合,k较大容易受无关数据影响。

六、优化

回来补上

K近邻算法应用——价格预测相关推荐

  1. 【TensorFlow实现机器学习方法】KNN(K近邻算法)实现预测房屋价格(tensorflow、matplotlib、numpy、pandas)

    一.前言 机器学习KNN算法(K近邻算法)的总体理论很简单不在这里赘述了. 二.数据集准备 这里使用比较古老的数据集,是房屋预测的数据集 下载地址 https://archive.ics.uci.ed ...

  2. 【机器学习入门】(1) K近邻算法:原理、实例应用(红酒分类预测)附python完整代码及数据集

    各位同学好,今天我向大家介绍一下python机器学习中的K近邻算法.内容有:K近邻算法的原理解析:实战案例--红酒分类预测.红酒数据集.完整代码在文章最下面. 案例简介:有178个红酒样本,每一款红酒 ...

  3. k近邻算法原理c语言,实验二 K-近邻算法及应用

    作业信息 一.[实验目的] 理解K-近邻算法原理,能实现算法K近邻算法: 掌握常见的距离度量方法: 掌握K近邻树实现算法: 针对特定应用场景及数据,能应用K近邻解决实际问题. 二.[实验内容] 实现曼 ...

  4. 机器学习:k近邻算法(KNN)介绍

    k近邻算法是一种最简单最经典的机器学习算法之一.该算法的原理为:当对测试样本进行分类时,首先通过扫描训练样本集,找到与该测试样本最相似的k个训练样本,根据这个样本的类别进行投票确定测试样本的类别.也可 ...

  5. 机器学习:K近邻算法(K-NN)

    K近邻(K-Nearest Neighbor, KNN)是一种最经典和最简单的有监督学习方法之一,它非常有效而且易于掌握. 1 K近邻算法概述 一个样本与数据集中的k个样本最相似, 如果这k个样本中的 ...

  6. 【Machine Learning】TensorFlow实现K近邻算法预测房屋价格

    1前言 机器学习KNN算法(K近邻算法)的总体理论很简单不在这里赘述了. 这篇文章主要问题在于如果利用tensorflow深度学习框架来实现KNN完成预测问题,而不是分类问题,这篇文章中涉及很多维度和 ...

  7. 一文搞懂K近邻算法(KNN),附带多个实现案例

    简介:本文作者为 CSDN 博客作者董安勇,江苏泰州人,现就读于昆明理工大学电子与通信工程专业硕士,目前主要学习机器学习,深度学习以及大数据,主要使用python.Java编程语言.平时喜欢看书,打篮 ...

  8. K近邻算法:以同类相吸解决分类问题!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:游璐颖,福州大学,Datawhale成员 前言 KNN(k-nea ...

  9. k近邻算法之 k值的选择

    k近邻算法之 k值的选择 举例说明: K值过小:  [过拟合] ​ 容易受到异常点的影响   [如:美人鱼本身就是喜剧片,假如统计的时候记为动作片,则对预测值的影响太大] k值过大:  [欠拟合] ​ ...

最新文章

  1. CentOS Linux解决Device eth0 does not seem to be present及设置固定ip
  2. [CQOI2014]和谐矩阵
  3. 牛逼哄哄的SLAM技术即将颠覆哪些领域
  4. C#-文件操作类 Directory 109
  5. 【算法】常用的排序方法
  6. python函数的 全局变量与局部变量
  7. 编程题【System类】计算一千万个数添加到集合的时间
  8. 电工产品的电磁兼容要求
  9. php输入一个字符串 输出所有组合,C++_C语言实现输入一个字符串后打印出该字符串中字符的所有排列,本文实例讲述了C语言实现输入 - phpStudy...
  10. Qos测试浅析 20090323
  11. Matlab遗传算法大纲
  12. LPVOID和PVOID的区别是什么
  13. android 小米pad 调试,小米平板2 开启USB调试模式
  14. C++中deprecated笔记
  15. 程序员跳槽时,如何正确做好职业规划?
  16. 干货!怎么写满意度调查报告?
  17. 【Java8 环境安装】Java1.8JDK环境安装jdk-8u361-windows-x64
  18. 小字辈(左子右兄加强版)
  19. C语言_指针动态内存分布
  20. Supplier使用

热门文章

  1. java 时区 edt_JAVA TimeZone发行EDT对EST
  2. Nature子刊:中大骆观正组在RNA修饰方法学领域取得重要进展
  3. 关于C语言define的边缘效应
  4. 【电脑问题解决】戴尔游匣7559 16年 顶配 4k触摸屏 960m显卡 4k屏幕分辨率下使用卡顿(非使用4K分辨率进行游戏)
  5. redhat还能坚持多久--红帽的“帽子戏法”
  6. html单元格上下拆分代码,在HTML / CSS中如何垂直拆分表格单元格(特殊版本)
  7. 自适应巡航控制系统——ACC
  8. 关于许嵩很有意境的歌词
  9. Android强制在主线程进行网络请求
  10. 各种有用的东西、黑科技、技巧