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