自写knn算法

1、实验目的

掌握了解knn算法,运用算法对数据点进行预测

2、实验内容

进行实验前,要了解什么是knn,以及knn的作用和用法,knn是一种基本的机器学习算法,构建模型只用保存训练数据集即可,最主要考虑的是其近邻数。

此次实验的要求在于通过自己编写knn算法,在不调用任何方法的情况下编写代码。

3、实验代码

import random

from sklearn.datasets import load_iris

iris_dataset=load_iris()

def test(a,b,data,label):
    listmin=[] #保存各个测试数据与样本数据的最小距离
    list1=[]#保存所有近邻距离
    list2=[]#保存listmin用来排序查找
    listknn=[]#保存n近邻的n各最短距离
    num=[]#保存最短距离下标
    result1=0
    result2=0
    result3=0
    
    for j in range(len(data)):  #计算最短距离度量,并保存在数组中
        list1=[]
        for i in range(1,b+1):
            c=abs(a[0]-data[j][0])**i+abs(a[1]-data[j][1])**i+abs(a[2]-data[j][2])**i+abs(a[3]-data[j][3])**i
            d=round((pow(c,1/i)),3)#保留三位小数
            list1.append(d)
            
        listmin.append(min(list1))
        
    list2.extend(listmin)#创建一个新的数组用来运算
    list2.sort()
    
    for i in range(b):  #找寻数组中与目标点距离最短的n个点,进行记录,并且进行预测
        for j in range(len(listmin)):
            if list2[i]==listmin[j]:
               
                listknn.append(list2[i])
                num.append(listmin.index(listmin[j]))
                            
                if(label[listmin.index(listmin[j])]==0):
                    result1+=1
                elif(label[listmin.index(listmin[j])]==1):
                    result2+=1
                else:
                    result3+=1
                            
    if (result1>result2 and result1>result3):
        n=0
    elif(result2>result1 and result2>result3):
        n=1
    else:
        n=2
    
    print("目标点为:{},当模型设为{}近邻时,与目标点最近的点是{},距离为:{},预测标签为:{}".format(a,b,(list(data[num[i]] for i in range(len(num)))),listknn,n))


data=iris_dataset['data']
#data=[[1.0,2.0],[1.2,0.1],[0.1,0.4],[0.3,3.5],[1.5,2.3],[1.1,0.7],[0.6,0.9],[0.2,1.5]]        
label=iris_dataset['target']
a=[random.uniform(1,8) for i in range(4)]
print("测试数据为:{}".format(a))
knn=int(input("请输入近邻:"))

test(a,knn,data,label)

4、运行结果

5、经验总结

因为knn算法在机器学习中属于较简单的算法,所以此次代码的目的在于通过自己的理解以及思维来编写一个knn算法,在理解之余还要加深对算法的升华。

此次实验的困难在于理解knn算法后不是太明白如何将其变为平常语句来形容,所以此次我编写的代码有些冗长,大部分代码也是根据自己的理解来编写,最主要的还是通过欧氏距离公式以及数学运算来完成代码。

因为机器学习的难度还是较大,理解的东西也比较多,后面的时间还需继续加强学习。

CSDN:

6、参考资料

【1】张亮(译).Python机器学习基础教程.人民邮电出版社.2019.6

【2】董付国.Python程序设计(第二版).清华大学出版社.2019.3

【3】李航.统计学习方法.清华大学出版社.2012

【4】博客:https://www.cnblogs.com/ybjourney/p/4702562.html

发布了16 篇原创文章 · 获赞 3 · 访问量 1099

猜你喜欢

转载自blog.csdn.net/qq_41890177/article/details/102253635