一、实验目的
学习K近邻算法。使用python实现K近邻算法。
- 实验内容
编写数据处理函数、曼哈顿距离计算函数、knn分类决策函数,KNN-blanks.py代码,并测试[0.45,0.1]是否为好瓜。
三、实验代码
import numpy as np
"""
函数说明:装载数据集
Parameters:
fileName - 文件名
Returns:
group - 数据集
labels - 分类标签
"""
def loadDataSet(fileName):
# 数据矩阵
group = []
# 标签向量
labels = []
# 打开文件
fr = open(fileName)
for line in fr.readlines():
# 去掉每一行首尾的空白符,例如'\n','\r','\t',' '
# 将每一行内容根据空白符进行切片
lineArr = line.strip().split('\t')
# 添加数据(元素排成一行)
group.append([float(lineArr[0]), float(lineArr[1])])
# 添加标签
labels.append(float(lineArr[2]))
return group, labels
"""
函数说明:曼哈顿距离求解
Parameters:
x1 - 向量1
x2 - 向量2
Returns:
dist - x1与x2间的曼哈顿距离
"""
def distManhattan(x1, x2):
#对应行计算差的绝对值
diff=abs(x1-x2)
# 同一行求和
dist=diff.sum(axis=1)
return dist
"""
函数说明:kNN算法,分类器
Parameters:
inX - 用于分类的数据(测试集)
dataSet - 用于训练的样本特征(训练集)
labels - 分类标准
k - kNN算法参数,选择距离最小的k个点
Returns:
predClass - 分类结果
"""
def classifyKNN(inX, dataSet, labels, k):
x1 = dataSet
#数据集大小
datasize=len(dataSet)
#将测试数据填充为为一列数据集大小的矩阵
x2=np.tile(inX, (datasize, 1))
dist = distManhattan(x1, x2)
# 返回元素从大到小排序后的索引值
sDist = dist.argsort()[::-1]
# 记录类别出现次数
nums = {}
#记录前k项同一类别出现的最大次数
predNum=0
#预测的类别
predClass=0
for i in range(k):
# 取出前k个元素的类别
Class = labels[sDist[i]]
# print(nums[Class])
#记录对应类别标签出现的次数+1,get:返回键值
nums[Class] = nums.get(Class, 0) + 1
#记录出现的最大次数以及对应类别
if(nums[Class]>predNum):
predNum=nums[Class]
predClass=Class
return predClass
if __name__ == '__main__':
# 设置测试数据test
group,labels = loadDataSet('TrainingSet.txt')
test=[0.45,0.1]
test_class = classifyKNN(test, group, labels, 3)
# 打印预测结果
print(test_class)