目录
1.KNN介绍
knn(K-Nearest Neighbor))简称k近邻算法,当判断一个新的数据是属于哪一类时,通过计算离这个数据最近的k个数在哪个分类最多得出这个数据是属于哪个类。knn训练的必须是监督型任务。
中间方块是新来的数据,现在想要判断这个方块是属于哪一类。当选的k为3时,由图可知,这个数据被划在三角类;如果k=5,可以看出三个圆离得近,两个三角离的近,因此这个数据被划分在圆圈类中。从这里可以看出k的选值对KNN算法的准确率还是有影响的。
2.实例解析
2.1.数据集及处理
2.1.1.数据集介绍
数据集来自UCI Machine Learning Repository: Wine Quality Data Set
这里选取了红葡萄酒数据集中的前100条数据
以下为数据集特征介绍,当quality大于5时,品质为佳
2.1.2.数据集展示
可以看出 ,数据集格式存在一些问题,csv每条数据规范点应该是以逗号分隔,而这里用的是分号(;)导致打开excel展示数据出错,之后处理也会出现问题。接下来我们对数据进行处理。将分号改为逗号,因为要处理数据,所以选取了前一百条数据,原数据集数据还是比较多的。
2.1.3.数据集处理
思路就是一次性读取所有值(比较方便,这里只做展示),因为是前100条所以占内存不大。将修改后的数据存储在字符串,之后再覆盖原有文件。
2.2.KNN算法展示
读取文件利用列表生成器以及csv自带库将数据以字典形式一条条存储在列表,因为原数据集产品质量是用字符形式的数字组成的,为了方便之后分类(两类,大于5为good,其他bad)将数据全部替换成两级分类标签。
打乱列表字典顺序后,将数据集分为训练集与测试集,8:2的比例。
计算所要分类的点与附近的点的距离,这里所用的是欧式距离,可以类比两点间的距离公式,这里是多维的数据,并且每一维是数值而不是离散的分类标签。
下面是knn算法代码
def knn(data, k):
res = [
{"result": train["quality"], "distance": distance(data, train)}
for train in train_data
]
sorted(res,key=lambda a:a["distance"])
res1 = res[:k]
good = 0
bad = 0
for i in res1:
if i["result"] == "good":
good += 1
else:
bad += 1
if good > bad:
return "good"
else:
return "bad"
# result = {"good": 0, "bad": 0}
# # 4.1 总距离
# sum = 0
# for r in res1:
# sum += r["distance"]
# # 4.2 计算权重
# for r in res1:
# result[r['result']] += 1 - r["distance"] / sum
#
# # 4.3 得出结果
# if result['good'] > result['bad']:
# return "good"
# else:
# return "bad"
创建一个新的只有两个键的字典组成的列表一个存放类别,一个存放距离。用sorted函数进行升序排列。key的值用固定的lambda函数,后面的字母是任取的并且按照第二个进行排序,如b:b["distance"]表示按照键“distance”进行排序。
排序后选取前k个数据进行计算哪一类的数据多,你可以采用第一种计算个数的方式,也可以采用第二种计算权值的方式。
验证哪个k的准确率更高,因为选取的数据比较少,所以得出的准确率就当看看了。
因为前一百条数据基本上都是good型数据,不合格的葡萄酒样品只有个别几个,所以出现这种情况。