K近邻模型、KNN算法1-构建预测模型

案例

假设你已经清洗好了一份同类型的商品信息和价格数据,如果给一个同品类全新的商品,你如何给它定价或预测它的价格?

比如,这个商品是红酒。你已经获取到了一批红酒的评级、生产年份、瓶装大小等红酒属性数据,以及对应的红酒价格。现在请根据这个样本数据对一瓶红酒进行价格预测、价格区间概率预测。

思路逻辑图

Python代码

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#@Time: 2019-11-18 07:07
#@Author: gaollimport time
import random
from random import randint
import math
import numpy as np
import matplotlib.pyplot as plt#定义距离函数.
def euclidean(v1,v2):d = 0.0for i in range(len(v1)):d+=(v1[i]-v2[i])**2return math.sqrt(d)#计算距离。KNN算法距离计算完保存起来,使用时无需再计算
def getdistances(data,vec1,distance=euclidean):distancelist = []for i in range(len(data)):vec2=data[i]['input']d = distance(vec1,vec2)distancelist.append((d,i))distancelist.sort()return distancelist#定义权重公式
#反函数
def inverseweight(dist,num=1.0,const=0.1):return num/(dist+const)
#减法函数
def substractweight(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函数,根据前k项估计,加权knn
def createweightedknn(k,weighf=gaussian):def weightedknn(data,vec1):#按照距离值经过排序的列表dlist = getdistances(data,vec1)avg = 0total_weight = 0.0for i in range(k):(dist,id) = dlist[i]weight = weighf(dist)avg+=data[id]['result']*weighttotal_weight += weightavg = avg/total_weightreturn avgreturn weightedknn#交叉验证--拆分测试集和训练集
def dividedata(data,test=0.05):trainset = []testset = []for row in data:if random.random()<test:testset.append(row)else:trainset.append(row)return trainset,testset#定义评估函数。此处使用误差平方和函数
def testalgorithm(algf,trainset,testset):error =0for row in testset:vec = row['input']guess = algf(trainset,vec)error += (guess - row['result'])**2return error#交叉验证
def crossvalidate(algf,data,trials=100,test=0.05):error = 0for i in range(trials):trainset,testset = dividedata(data,test)error += testalgorithm(algf,trainset,testset)if error ==0:return 0return error/trials#数据各列按一定比例放缩
def rescale(data,scale):scaled_data = []for row in data:scaled_input = [row['input'][i]*scale[i] for i in range(len(scale))]scaled_data.append({'input':scaled_input,'result':row['result']})return scaled_data#对向量做放缩
def rescale_vec(vec,scale):return [vec[i]*scale[i] for i in range(len(scale))]#定义scale损失函数
def createcostf_scale(algf,data):def costf_scale(scale):scaled_data = rescale(data,scale)return crossvalidate(algf,scaled_data,trials=10)return costf_scale#定义k的损失函数
def createcostf_k(data,algf=createweightedknn):def costf_k(k):weightedknn = algf(k=k,weighf=gaussian)return crossvalidate(weightedknn,data)return costf_k#区间概率预测
def probguess(data,vec1,low,high,k=3,weightf=gaussian):dlist = getdistances(data,vec1)inweight = 0.0totalweight= 0.0for i in range(k):(dist,id) = dlist[i]weight = weightf(dist)v = data[id]['result']if v>=low and v<=high:inweight += weighttotalweight += weightif inweight == 0:return 0return inweight/totalweight#根据区间概率预测,绘制累计概率图
def cumulativegragh(data,vec1,high,k=3,weightf=gaussian):x = np.arange(0.0,high,0.1)y = [probguess(data,vec1,0.0,t,k=k,weightf=weightf) for t in x]fig = plt.figure()ax=fig.add_subplot(1,1,1)ax.plot(x,y)fig.show()#使用KNN思想,绘制概率密度图
def probalitygragh(data,vec1,high,k=3,weightf=gaussian,ss=5.0):x = np.arange(0.0,high,0.1)#得到每个小区间上的概率probs = [probguess(data,vec1,v,v+0.1,k,weightf) for v in x]#做平滑处理,即加上近邻概率的高斯权重smoothed = []for i in range(len(probs)):sv = 0.0for j in range(0,len(probs)):dist = abs(i-j)*0.1weight = weightf(dist,sigma=ss)sv+=weight*probs[j]smoothed.append(sv)fig = plt.figure()ax = fig.add_subplot(1,1,1)ax.plot(x,smoothed)fig.show()if __name__ == "__main__":#记载数据import winepricedata = wineprice.wineset3()#优化K,确定K的大致范围,这里设2-7costf_k = createcostf_k(data,createweightedknn)for i in range(2,8):print(i,costf_k(i))'''out:从简单从小,这里k=4交叉验证损失最小2 62368.446917658183 66027.433781509724 61087.782862150315 65923.38556651276 67817.687443481187 67395.5927600834'''#以上述得出的k=4为基础,优化scaleimport optimization weightedknn = createweightedknn(k=4)domain = [(0,20)]*4costf_scale = createcostf_scale(weightedknn,data)#使用模拟退火算法优化缩放系数。--见前面的博文-优化算法optimization.annealingoptimize(domain,costf_scale)#Out[150]: [1, 13, 12, 0]#K和放缩比例相互影响,这个确定的过程比较繁琐,可能要重复几次。#这里经过3次相互交叉验证后,决定使用 k=3,scale=[8, 4, 3, 2]。k = 3scale = [8, 4, 3, 2]scaled_data = rescale(data,scale)weightedknn = createweightedknn(k=3,weighf=gaussian)#交叉验证crossvalidate(weightedknn,scaled_data)#Out[153]: 62935.15164770742#knn数值预测TobePredict=[90, 35, 13, 3000.0]scaled_tobepredict = rescale_vec(TobePredict,scale) #放缩print(weightedknn(scaled_data,scaled_tobepredict))  #预测#188.3792652896066#价格区间预测probguess(scaled_data,scaled_tobepredict,100,150)#Out[106]: 1.2491095402673855e-05probguess(scaled_data,scaled_tobepredict,100,180)#Out[107]: 0.3000429516680889probguess(scaled_data,scaled_tobepredict,100,200)#Out[108]: 1.0#累计概率图cumulativegragh(scaled_data,scaled_tobepredict,300)#概率密度图probalitygragh(scaled_data,scaled_tobepredict,300)

结果展示

#1、累计概率图

#2、概率密度图(从概率密度图中发现它的概率分布并不对称,说明有可能我们的数据中存在未知的隐藏变量,需要再详细询问获取的数据是否有漏标记说明的信息。)

K近邻模型、KNN算法1-构建预测模型相关推荐

  1. 独孤九剑第四式-K近邻模型(KNN)

  2. 机器学习算法总结之K近邻(KNN)

    写在前面 K近邻(K-nearest neighbor,k-nn)是一种常用的机器学习监督学习方法,可用于分类和回归问题.其工作机制为:给定测试样本,基于某种距离度量找出训练集中与其最靠近的K个训练样 ...

  3. K近邻(KNN)算法总结

    文章目录 一.KNN原理 二.KNN的三要素 2.1 k值的选择 2.2 距离度量 2.3 分类决策规则 三.KNN算法实现 3.1 KNN算法蛮力实现 3.2 KD树实现 3.3 球树实现 四.KN ...

  4. 介绍一下K近邻(KNN)算法,KNeighbors和RadiusNeighbors的差异是什么?各有什么优势?

    介绍一下K近邻(KNN)算法,KNeighbors和RadiusNeighbors的差异是什么?各有什么优势? K近邻(KNN)算法 近邻(Nearest Neighbor)算法既可以用于监督学习(分 ...

  5. K近邻(KNN)算法是基于实例的算法,如果训练样本数量庞大,预测的时候挨个计算距离效率会很低下,如何破解?

    K近邻(KNN)算法是基于实例的算法,如果训练样本数量庞大,预测的时候挨个计算距离效率会很低下,如何破解? K近邻(KNN)是最简单的算法之一,它计算预测样本与训练数据集中每个数据点之间的距离,并找到 ...

  6. 一文搞懂k近邻(k-NN)算法(一)

    原文链接 一文搞懂k近邻(k-NN)算法(一) 前几天和德川一起在学习会上讲解了k-NN算法,这里进行总结一下,力争用最 通俗的语言讲解以便更多同学的理解. 本文目录如下: 1.k近邻算法的基本概念, ...

  7. 机器学习之K近邻(KNN)模型

    机器学习之KNN 本文主要介绍K近邻(KNN)模型,KNN在机器学习中是很常见的: 1.KNN模型介绍 2.KNN数学原理 3.算法及Python实现 4.小结 1.KNN模型介绍 k近邻法(k-ne ...

  8. 机器学习算法与Python实践之(二)k近邻(KNN)

      机器学习算法与Python实践之(二)k近邻(KNN) (基于稀疏矩阵的k近邻(KNN)实现) 一.概述 这里我们先来看看当我们的数据是稀疏时,如何用稀疏矩阵的特性为KNN算法加速.KNN算法在之 ...

  9. 统计学习方法——K近邻模型

    0. 写在前面 在这一讲的讨论班中,我们将要讨论一下K近邻模型.可能有人会说,K近邻模型有什么好写的,那分明就是一个最简单的机器学习模型,哦,不,连机器学习也算不上的算法吧.但是这里,我想提醒的是,我 ...

最新文章

  1. StingBuffer
  2. Oracle真实世界数据链——将现实世界和区块链世界相互打通——让主流币爆涨十倍的项目
  3. POJ2983 查分约束系统
  4. 经典C语言程序100例之五六
  5. 缓存-分布式锁-Redisson-读写锁补充
  6. win7关机快捷键_电脑快捷键大全(上)
  7. 菲尔茨奖得主丘成桐在清华设立数学英才班,比肩清华姚班
  8. 最短网络(信息学奥赛一本通-T1350)
  9. 并发编程中,你加的锁未必安全
  10. 解决sendmail服务启动慢的方法
  11. mysql字符串处理函数left()、length()使用
  12. 服务器虚拟化十大因素
  13. ubuntu16.04 kinetic 版本ROS安装PR2
  14. react-native 模仿原生 实现下拉刷新/上拉加载更多(RefreshListView)
  15. 优秀的文本对比工具:UltraCompare 21 for Mac
  16. 推荐一个项目管理工具:TAPD
  17. 【技巧】谷歌Chrome浏览器清理缓存的两种方式
  18. ubuntu/deepin安装配置mysql
  19. 数据结构(C语言版)——顺序栈(代码版)
  20. vue使用高德地图 zoom 不生效

热门文章

  1. 中国量子计算机芯片美国,13nm!中国量子芯片再获突破,美国专家:中国学者不睡觉吗?...
  2. python data PDAdata pivot table ,group by, contains, starts with
  3. XMind ,石墨笔记, Effie ,你用什么应用来完成采编工作?
  4. 2016年最新版App内购买详细指南
  5. calibre的注册表残留删除
  6. java libjli.so_解决setcap导致Java加载libjli.so 失败问题
  7. 动视暴雪宣布裁员约8%  780多名员工将被裁-千氪
  8. 脉冲式和相位式激光测距
  9. reviewer中文_审稿意见回复模板,中文
  10. 京冀41所医院和急救中心成为北京冬奥会定点医院