一、 题目描述
原生python实现knn分类算法,用鸢尾花数据集。
二、 分析及算法设计
KNN的模型没有涉及到模型的训练,每一次预测都需要计算该点与所有已知点的距离。
第一步:加载鸢尾花数据集;
第二步:定义计算距离的函数,计算用例1和用例2的距离,并返回所计算的距离;
第三步:找到K个最近邻,计算每个测试用例到训练集用例的距离,对所有计算得到的距离进行排序,for循环找出K个最近距离并返回这K个最近邻;
第四步:合并K个近邻,并且用排序函数排序,找到且返回value最大的值;
第五步:计算测试的准确率;
第六步:测试方法,对结果进行验证。
三、 源代码
import random #处理随机数
import math #处理数学运算
import csv #处理csv文件
import operator #处理操作相关的函数
加载鸢尾花数据集
def IrisDataSet(filename,split,TrainSet=[],TestSet = []):
with open(filename,"r") as csvfile:
lines = csv.reader(csvfile)
dataset = list(lines)
for x in range(len(dataset)-1):
for y in range(4):
dataset[x][y] = float(dataset[x][y])
if random.random()<split: #对数据集进行随机分类 split为分割集
TrainSet.append(dataset[x]) #训练集
else:
TestSet.append(dataset[x]) #测试集
def getDistance(case1,case2,length): #计算距离,参数分别代表用例1,用例2和距离
distance = 0
for x in range(length):
distance += pow((case1[x] - case2[x]),2)
return math.sqrt(distance) #返回开根号后的距离
找到K个最近邻
def getNeighbors(TrainSet,TestCase,k): #找到K个最近邻
distances = [] #distance集合
length = len(TestCase) -1 #长度为测试用例-1
for x in range(len(TrainSet)): #计算测试用例到训练集实例的距离
dist = getDistance(TestCase, TrainSet[x], length)
distances.append((TrainSet[x],dist))
#对所有的距离进行排序
distances.sort(key=operator.itemgetter(1)) #sort()排序函数
neighbors = []
for x in range(k): #找到k个最近邻
neighbors.append(distances[x][0])
return neighbors #返回neighbors,即k个最近邻
合并k近邻,返回value最大的值
def getCombine(neighbors): #合并k近邻,返回value最大的值
Votes = {}
for x in range(len(neighbors)):
c = neighbors[x][-1]
if c in Votes:
Votes[c]+=1
else:
Votes[c] = 1
#排序
sortedVotes = sorted(Votes.items(),key = operator.itemgetter(1),reverse =True)
return sortedVotes[0][0]
计算准确率
def AccuracyRate(TestSet,predictions):#计算准确率
right = 0 #测试成功的数据个数
for x in range(len(TestSet)): #循环取出一个测试数据进行测试
if TestSet[x][-1] == predictions[x]:
right+=1 #预测成功则计数值加1
return (right/float(len(TestSet))) * 100.0 #计算准确率
def main():
TrainSet = [] #训练数据集
TestSet = [] #测试数据集
split = 0.67 #分割的比例
loadDataset("D:\Iris_train.data", split, TrainSet, TestSet) #加载数据集
print('Train:',repr(len(TrainSet)))
print('Test:',repr(len(TestSet)))
predictions = []
k = 3
for x in range(len(TestSet)):
neighbors = getNeighbors(TrainSet, TestSet[x], k)
result = getResponse(neighbors)
predictions.append(result)
print('>预测结果=' ,repr(result),',实际结果=',repr(TestSet[x][-1]))
accuracy = getAccuracy(TestSet, predictions)
print('测试的准确率为:',repr(accuracy),'%')
if __name__ =="__main__":
main()
四、 测试用例设计及调试过程截屏
测试集和数据集比例
准确率
五、 总结
本次机器学习上机作业是用Python实现KNN分类算法,学习python时间不长,对许多部分都不熟悉,所以感觉比较难以顺利进行,分析及编码过程参考了几篇CSDN上的文章,数据集中的数据是网上下载的,数据量不是很大,结果并不能很好地体现KNN的性能。通过此次上机我觉得我还需要加强python和机器学习的理解和学习。
转载:https://blog.csdn.net/qq_44727254/article/details/102552931
查看评论