# -*- coding: UTF-8 -*-
from random import random ,randint
import math
def wineprice(rating,age):
peak_age = rating - 50
#根据等级来计算价格
price = rating/2
if age > peak_age:
# 经过峰值年之后,后继5年内品质将会变差
price = price*(5-(age - peak_age))
else:
# 价格在接近峰值年时会增加到原值的5倍
price = price*(5*((age+1)/peak_age))
if price < 0: price = 0
return price
def 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 rows
# 定义两个向量的相似度为欧氏距离
def euclidean(v1,v2):
d = 0.0
for i in range(len(v1)):
a = v1[i]
b = v2[i]
d += pow(a-b, 2)
return math.sqrt(d)  
# 获取要预测的向量vec1与数据集data中所有元素的距离
def getdistances(data,vec1):
distancelist = []
for i in range(len(data)):
vec2 = data[i]['input']
distancelist.append((euclidean(vec1, vec2),i))
distancelist.sort()
return distancelist
# knn函数,对列表的前k项结果求了平均值
def knnestimate(data,vec1,k=5):
# 得到经过排序的距离值
dlist = getdistances(data, vec1)
avg = 0.0
#对前K项结果求平均值
for i in range(k):
idx = dlist[i][1]
avg += data[idx]['result']
avg = avg/k
return avg  
#反函数 将距离转换为权重
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 / sigma**2)
# 加权KNN算法,根据距离对K个近邻加权,权值乘以对应的价格作累加最后除以权值之和
# 参数weightf是函数,指示使用哪一种权值衰减方式
# 试验得出,k=3时 误差最小
def weightedKnn(data, vec1, k=3, weightf = gaussian):
dlist = getdistances(data, vec1)
result = 0.0
weight = 0.0
for i in range(k):
price = data[dlist[i][1]]['result'] # 价格
result += price * weightf(dlist[i][0]) # 距离加权,累加价格和
weight += weightf(dlist[i][0])         # 统计权值和
return result / weight
#交叉验证
# 1 随机划分数据集,test指定了测试集所占的比例
# 典型的情况下,测试集只会包含一小部分数据,大概是所有数据的5%,剩下的95%都是训练集
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  
# 2 对测试集进行预测算出误差,针对测试集中的每一项内容调用算法,返回误差
#  其中参数algf是一个函数,可以是 knnestimate,weightedknn或者其他计算价格的函数
def testalgorithm(algf, trainset, testset):
error = 0.0
for row in testset:
# 对测试集的每一项数据都进行预测
guess = algf(trainset, row['input'])
# 对预测结果与正确结果进行做差,得出误差
error += (row['result'] - guess) **2 
return error / len(testset)     
# 3 交叉验证 多次调用dividedata函数对数据进行随机划分,并计算误差,取所有随机划分的均值
def crossvalidate(algf, data, trials = 100, test = 0.05):
error = 0.0
#trials 代表随机划分的次数
for i in range(trials):
trainset,testset = dividedata(data, test)
#100多次的交叉验证之后,对累计的误差求平均值
error += testalgorithm(algf, trainset, testset)
return error / trials
#重新生成数据集,加入干扰变量
def wineset2():
rows = []
for i in range(300):
rating = random() * 50 + 50
age = random() * 50
aisle = float(randint(1,20))
bottleszie = [375.0, 750.0, 1500.0, 3000.0][randint(0, 3)]
price = wineprice(rating, age)
price *= (bottleszie / 750)
price*=(random()*0.9+0.2)
rows.append({'input': (rating, age, aisle, bottleszie), 'result': price})
return rows
# 缩放,参数scale的长度与训练数据特征的长度相同. 每个参数乘以训练数据中的特征以达到缩放特征的目的
def rescale(data, scale):
scaledata = []
for row in data:
scaled = [scale[i] * row['input'][i] for i in range(len(scale))]
scaledata.append({'input': scaled, 'result': row['result']})
return scaledata
# 构造 优化搜索算法 的代价函数
def createcostfunction(algf, data):
def costf(scale):
sdata = rescale(data, scale)
return crossvalidate(algf, data)
return costf
if __name__ == '__main__':
#构造数据
data = wineset1() 
print data
print getdistances(data, (99.0,5.0))
#价格预测
print '----------------------------------k-最近邻算法---------------------------------------'
print knnestimate(data, (99.0,5.0))
print '----------------------------------加权 k-最近邻算法---------------------------------------'
# 优化knnestimate函数,对不同距离的近邻进行距离加权
print weightedKnn(data, (99.0,5.0))
# 交叉验证
print '----------------------------------交叉验证,误差均值---------------------------------------'
print crossvalidate(weightedKnn, data)

机器学习---knn之价格预测相关推荐

  1. 【计算机专业毕设之基于机器学习的大葱价格预测可视化分析-哔哩哔哩】 https://b23.tv/GLkWcjb

    [计算机专业毕设之基于机器学习的大葱价格预测可视化分析-哔哩哔哩] https://b23.tv/GLkWcjb https://b23.tv/GLkWcjb

  2. 使用机器学习预测天气_使用机器学习的二手车价格预测

    使用机器学习预测天气 You can reach all Python scripts relative to this on my GitHub page. If you are intereste ...

  3. 基于机器学习的二手车价格预测及应用实现(预测系统实现)

    1.摘要 随着中国汽车工业的迅速发展,国内的汽车数量也在迅速增长.新车销售市场已经逐渐饱和,而二手车交易市场正在兴起.但是,由于中国的二手车市场尚未成熟,与发达国家相比仍存在较大差距.其中一个重要原因 ...

  4. 机器学习KNN算法实践:预测城市空气质量

    出品:Python数据之道 作者:叶庭云 整理:Lemon 机器学习KNN算法实践 预测城市空气质量 「Python数据之道」导读: 之前在公众号上分享过 "图解KNN算法" 的内 ...

  5. 利用机器学习方法对猪肉价格预测

    基于机器学习对猪肉价格预测 猪肉价格预测 问题背景 导入数据 一.支持向量机 二.随机森林 三. MLP神经网络 猪肉价格预测 支持向量机回归 随机森林回归 MLP神经网络回归 问题背景 " ...

  6. 满帮如何将机器学习应用于车货匹配和公路干线价格预测?

    http://www.infoq.com/cn/articles/ml-dl-highway-price 物流的战火,从来都是"非传统"的竞争者从"非传统"的角 ...

  7. 机器学习项目实战(五) 住房价格预测

    机器学习项目实战系列   住房价格预测 目录 机器学习项目实战系列   住房价格预测 一.概述 二.分析数据 1.数据导入 2.基础统计运算 3.特征观察 4.建立模型 5.分析模型表现 (1)学习曲 ...

  8. 《机器学习实战》8.4 线性回归之乐高玩具套件二手交易价格预测

    <机器学习实战>8.4 线性回归之乐高玩具套件二手交易价格预测 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多人工智能.机器学习干货 csdn:https: ...

  9. 实践 | 运满满如何将机器学习应用于车货匹配和公路干线价格预测?

    作者|罗竞佳 编辑 | Debra AI 前线导读:物流的战火,从来都是"非传统"的竞争者从"非传统"的角度切入的. 更多干货内容请关注微信公众号"A ...

最新文章

  1. [文摘20090203]巴菲特-等到知更鸟报春,那春天就快结束了
  2. ORACLE not available如何解决
  3. Linux server配置安装Java,Tomcat服务器
  4. 160 - 2 Afkayas.1
  5. php h5微信公众号支付接口,微信公众号H5支付接口调用方法
  6. 如何在程序中画出实际大小为7CM半径的圆
  7. 使用axis2 services.xml 发布web service
  8. 【Shell 脚本】Mysql 定时备份
  9. 系统分析师真题__专项:计算机系统与配置 2
  10. CAPL编程语言简介
  11. MP4文件格式详解——元数据moov(一)mvhd box
  12. 订单拆单,电商开发时 经常遇到的问题
  13. 小米首页二级菜单栏实现原理
  14. http状态码-504
  15. 单片机优雅的开发Clion环境搭建
  16. OEM的意思是什么?(收藏)
  17. 基于金融大数据的特征提取与趋势预测系统(一)2021-06-30
  18. Vue整合SpringBoot项目实战之Vue+Element-Ui搭建前端项目
  19. 栈的应用——表达式求值
  20. 共价有机骨架材料 COF-LZU1 CAS:1242082-12-7的合成方法

热门文章

  1. Eclipse helios 上编写arduino程序并进行烧录
  2. C#:System.Data.Common命名空间(数据库抽象工厂的使用)
  3. 无法停止‘通用卷’设备的解决方法
  4. ECharts - 嵌套环形图
  5. C# 入门之 Hello World
  6. GPIO8种方式小总结
  7. 从1.5k到18k, 一个程序员的5年成长之路(分享)
  8. [C++ STL] 常用算法总结
  9. Power BI新主页将使内容的导航和发现变得轻而易举!
  10. bzoj3895: 取石子(博弈论,记忆化搜索)