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 #返回距离列表
新闻热点
疑难解答