目录
1.概念
2.代码实战
3.关于如何解决预测不准
3.1)调整k的值会影响预测值
3.2)增加数据的维度
4.空间和维度
4.1)一维空间
4.2)二维空间
4.3)三维空间
4.4)空间中两点距离的计算
5.精度问题之数据归一化处理
1.概念
KNN(K-Nearest Neighbor)最邻近分类算法是数据挖掘分类技术中最简单的算法之一,其指导思想是”近朱者赤,近墨者黑“,即由你的邻居来推断出你的类别。
实现原理:为了判断未知样本的类别,以所有已知类别的样本作为参照,计算未知样本与所有已知样本的距离,从中选取与未知样本距离最近的K个已知样本,根据少数服从多数的投票法则(majority-voting),将未知样本与K个最邻近样本中所属类别占比较多的归为一类。
2.代码实战
import numpy as np import collections as c data = np.array([ [154, 1], [126, 2], [70, 2], [196, 2], [161, 2], [371, 4] ]) # 输入值 feature = data[:, 0] # 结果 label = data[:, -1]#用-1,因为前面可以有很多列特征值,-1可以直接输出最后一列的label值 # 预测点 predictPoint = 300 # 计算每个投掷点距离预测点的距离 distance = list(map(lambda x: abs(predictPoint-x), feature)) print(distance) # 对distance的集合元素从小到大排序(返回的是下标) sortIndex = np.argsort(distance) # 用排序的sortIndex来操作label集合 sortedLabel = label[sortIndex] # knn算法的k取最近的三个邻居 k = 3 print(c.Counter(sortedLabel[0:k]).most_common(1)[0][0])
3.关于如何解决预测不准
3.1)调整k的值会影响预测值
# 处理数据, 把数据打散, 分成训练集和测试集 import numpy as np data = np.loadtxt("knn_data0.csv", delimiter=",") np.random.shuffle(data) testData = data[0:100] trainData = data[100:-1] # 保存测试数据 np.savetxt("knn_testdata0.csv", testData, delimiter=",", fmt="%d") # 保存训练数据 np.savetxt("knn_traindata0.csv", trainData, delimiter=",", fmt="%d")
import numpy as np import collections as c def knn(k, predictPoint, feature, label): distance = list(map(lambda x: abs(predictPoint - x), feature)) # 对distance的集合元素从小到大排序(返回的是下标) sortIndex = np.argsort(distance) # 用排序的sortIndex来操作label集合 sortedLabel = label[sortIndex] # knn算法的k取最近的三个邻居 return c.Counter(sortedLabel[0:k]).most_common(1)[0][0] if __name__=='__main__': traindata = np.loadtxt("knn_traindata0.csv", delimiter=",") # 输入值 feature = traindata[:, 0] # 结果值 label = traindata[:, -1] # 预测点,来自测试数据集的每一条记录 testdata = np.loadtxt("knn_testdata0.csv", delimiter=",") for k in range(1, 100): count = 0 for item in testdata: predict = knn(k, item[0], feature, label) real = item[1] if predict == real: count += 1 print("k={},准确率:{}%".format(k, count*100.0/len(testdata)))
3.2)增加数据的维度
原数据集如下图所示:
将其中的中文颜色转化为数字弹性:
import numpy as np def color_to_num(str): dict = {"红": 0.50, "黄": 0.51, "蓝": 0.52, "绿": 0.53, "紫": 0.54, "粉": 0.55} return dict[str] data = np.loadtxt("knn_data1.csv", delimiter=",", converters={1: color_to_num}, encoding="gbk") print(data)
4.空间和维度
4.1) 一维空间
4.2) 二维空间
4.3) 三维空间
4.4) 空间中两点距离的计算
例:代码对比
# 一维空间 def knn(k, predictPoint, feature, label): distance = list(map(lambda x: abs(predictPoint - x), feature)) # 对distance的集合元素从小到大排序(返回的是下标) sortIndex = np.argsort(distance) # 用排序的sortIndex来操作label集合 sortedLabel = label[sortIndex] # knn算法的k取最近的三个邻居 return c.Counter(sortedLabel[0:k]).most_common(1)[0][0]
# 二维空间 def knn2(k, predictPoint, ballColor, feature, label): distance = list(map(lambda item: ((item[0]-predictPoint)**2+(item[1]-ballColor)**2)**0.5, feature)) sortIndex = np.argsort(distance) sortedLabel = label[sortIndex] return c.Counter(sortedLabel[0:k]).most_common(1)[0][0]
5.精度问题之 数据归一化处理
# 数据归一化处理后 def knn3(k, predictPoint, ballColor, feature, label): distance = list(map(lambda item: ((item[0]/475-predictPoint/475)**2+((item[1]-0.50)/0.05-(ballColor-0.50)/0.05)**2)**0.5, feature)) sortIndex = np.argsort(distance) sortedLabel = label[sortIndex] return c.Counter(sortedLabel[0:k]).most_common(1)[0][0]
标签:knn,distance,sortIndex,实现,feature,label,算法,np From: https://www.cnblogs.com/ztzzh-1/p/18147613