K近邻算法应用——价格预测
一、构造数据
#根据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近邻算法应用——价格预测相关推荐
- 【TensorFlow实现机器学习方法】KNN(K近邻算法)实现预测房屋价格(tensorflow、matplotlib、numpy、pandas)
一.前言 机器学习KNN算法(K近邻算法)的总体理论很简单不在这里赘述了. 二.数据集准备 这里使用比较古老的数据集,是房屋预测的数据集 下载地址 https://archive.ics.uci.ed ...
- 【机器学习入门】(1) K近邻算法:原理、实例应用(红酒分类预测)附python完整代码及数据集
各位同学好,今天我向大家介绍一下python机器学习中的K近邻算法.内容有:K近邻算法的原理解析:实战案例--红酒分类预测.红酒数据集.完整代码在文章最下面. 案例简介:有178个红酒样本,每一款红酒 ...
- k近邻算法原理c语言,实验二 K-近邻算法及应用
作业信息 一.[实验目的] 理解K-近邻算法原理,能实现算法K近邻算法: 掌握常见的距离度量方法: 掌握K近邻树实现算法: 针对特定应用场景及数据,能应用K近邻解决实际问题. 二.[实验内容] 实现曼 ...
- 机器学习:k近邻算法(KNN)介绍
k近邻算法是一种最简单最经典的机器学习算法之一.该算法的原理为:当对测试样本进行分类时,首先通过扫描训练样本集,找到与该测试样本最相似的k个训练样本,根据这个样本的类别进行投票确定测试样本的类别.也可 ...
- 机器学习:K近邻算法(K-NN)
K近邻(K-Nearest Neighbor, KNN)是一种最经典和最简单的有监督学习方法之一,它非常有效而且易于掌握. 1 K近邻算法概述 一个样本与数据集中的k个样本最相似, 如果这k个样本中的 ...
- 【Machine Learning】TensorFlow实现K近邻算法预测房屋价格
1前言 机器学习KNN算法(K近邻算法)的总体理论很简单不在这里赘述了. 这篇文章主要问题在于如果利用tensorflow深度学习框架来实现KNN完成预测问题,而不是分类问题,这篇文章中涉及很多维度和 ...
- 一文搞懂K近邻算法(KNN),附带多个实现案例
简介:本文作者为 CSDN 博客作者董安勇,江苏泰州人,现就读于昆明理工大学电子与通信工程专业硕士,目前主要学习机器学习,深度学习以及大数据,主要使用python.Java编程语言.平时喜欢看书,打篮 ...
- K近邻算法:以同类相吸解决分类问题!
↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:游璐颖,福州大学,Datawhale成员 前言 KNN(k-nea ...
- k近邻算法之 k值的选择
k近邻算法之 k值的选择 举例说明: K值过小: [过拟合] 容易受到异常点的影响 [如:美人鱼本身就是喜剧片,假如统计的时候记为动作片,则对预测值的影响太大] k值过大: [欠拟合] ...
最新文章
- CentOS Linux解决Device eth0 does not seem to be present及设置固定ip
- [CQOI2014]和谐矩阵
- 牛逼哄哄的SLAM技术即将颠覆哪些领域
- C#-文件操作类 Directory 109
- 【算法】常用的排序方法
- python函数的 全局变量与局部变量
- 编程题【System类】计算一千万个数添加到集合的时间
- 电工产品的电磁兼容要求
- php输入一个字符串 输出所有组合,C++_C语言实现输入一个字符串后打印出该字符串中字符的所有排列,本文实例讲述了C语言实现输入 - phpStudy...
- Qos测试浅析 20090323
- Matlab遗传算法大纲
- LPVOID和PVOID的区别是什么
- android 小米pad 调试,小米平板2 开启USB调试模式
- C++中deprecated笔记
- 程序员跳槽时,如何正确做好职业规划?
- 干货!怎么写满意度调查报告?
- 【Java8 环境安装】Java1.8JDK环境安装jdk-8u361-windows-x64
- 小字辈(左子右兄加强版)
- C语言_指针动态内存分布
- Supplier使用
热门文章
- java 时区 edt_JAVA TimeZone发行EDT对EST
- Nature子刊:中大骆观正组在RNA修饰方法学领域取得重要进展
- 关于C语言define的边缘效应
- 【电脑问题解决】戴尔游匣7559 16年 顶配 4k触摸屏 960m显卡 4k屏幕分辨率下使用卡顿(非使用4K分辨率进行游戏)
- redhat还能坚持多久--红帽的“帽子戏法”
- html单元格上下拆分代码,在HTML / CSS中如何垂直拆分表格单元格(特殊版本)
- 自适应巡航控制系统——ACC
- 关于许嵩很有意境的歌词
- Android强制在主线程进行网络请求
- 各种有用的东西、黑科技、技巧