小言_互联网的博客

原生Python实现KNN分类算法

235人阅读  评论(0)

一、 题目描述

原生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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场