首页 > 编程 > Python > 正文

python机器学习案例教程——K最近邻算法的实现

2020-02-16 11:20:49
字体:
来源:转载
供稿:网友

K最近邻属于一种分类算法,他的解释最容易,近朱者赤,近墨者黑,我们想看一个人是什么样的,看他的朋友是什么样的就可以了。当然其他还牵着到,看哪方面和朋友比较接近(对象特征),怎样才算是跟朋友亲近,一起吃饭还是一起逛街算是亲近(距离函数),根据朋友的优秀不优秀如何评判目标任务优秀不优秀(分类算法),是否不同优秀程度的朋友和不同的接近程度要考虑一下(距离权重),看几个朋友合适(k值),能否以分数的形式表示优秀度(概率分布)。

K最近邻概念:

它的工作原理是:存在一个样本数据集合,也称作为训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一个数据与所属分类的对应关系。输入没有标签的新数据后,将新的数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本最相似数据(最近邻)的分类标签。一般来说,我们只选择样本数据集中前k个最相似的数据,这就是k-近邻算法中k的出处,通常k是不大于20的整数。最后,选择k个最相似数据中出现次数最多的分类,作为新数据的分类。

今天我们使用k最近邻算法来构建白酒的价格模型。

构造数据集

构建一个葡萄酒样本数据集。白酒的价格跟等级、年代有很大的关系。

from random import random,randintimport math# 根据等级和年代对价格进行模拟def wineprice(rating,age): peak_age=rating-50 # 根据等级计算价格 price=rating/2 if age>peak_age:  # 经过“峰值年”,后续5年里其品质将会变差  price=price*(5-(age-peak_age)/2) 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.2+0.9)  # 加入数据集  rows.append({'input':(rating,age),'result':price}) return rows

数据间的距离

使用k最近邻,首先要知道那些最近邻,也就要求知道数据间的距离。我们使用欧几里得距离作为数据间的距离。

# 使用欧几里得距离,定义距离def euclidean(v1,v2): d=0.0 for i in range(len(v1)):  d+=(v1[i]-v2[i])**2 return math.sqrt(d)

获取与新数据距离最近的k个样本数据

# 计算给预测商品和原数据集中任一其他商品间的距离。data原数据集,vec1预测商品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 #返回距离列表            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表