用鸢尾花数据集来进行测试,鸢尾花数据集包含4个数据元素,分别是(花萼长度
,花萼宽度,花瓣长度,花瓣宽度),所以测试的时候需要输入4个数据来进行预测。
算法思想:
1. 调用鸢尾花数据集和类别标签
from sklearn.datasets import load_iris
iris_dataset=load_iris()
data=iris_dataset['data'] #获取鸢尾花数据集
label=iris_dataset['target'] #获取标签列表
2. 用欧式定理计算每个数据与预测数据的距离。
for j in range(len(data)): #计算最短距离度量,并保存在数组中
for i in range(1,k+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=pow(c,1/i)
list_min_lang.append(d)
3. 找到距离最短的前k个数据,并判断他们的类别
4. 比较哪种类别的数量最多
5. 预测出结果
源代码:
from sklearn.datasets import load_iris
iris_dataset=load_iris()
data=iris_dataset['data'] #获取鸢尾花数据集
label=iris_dataset['target'] #获取标签列表
a=[] #建立目标点的数据集
b=input("请输入目标点") #将输入的字符型数据分割并转换成float型
a=b.split()
for i in range(4):
a[i]=float(a[i])
k=int(input("请输入近邻:"))
list_min_lang=[] #最短距离列表,存放最短的距离数据
list_all_min=[] #所有点的最小距离
#三个标签的数量
label1=0
label2=0
label3=0
for j in range(len(data)): #计算最短距离度量,并保存在数组中
for i in range(1,k+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=pow(c,1/i)
list_min_lang.append(d)
list_min_lang.sort()
list_all_min=list_min_lang #存放k个最小距离值的列表
for i in range(k): #找寻数组中与目标点距离最短的n个点,进行记录,并且进行预测
for j in range(len(list_min_lang)):
if list_all_min[i]==list_min_lang[j]:
#判断邻近点分别是什么类
if(label[list_min_lang.index(list_min_lang[j])]==0):
label1+=1
if(label[list_min_lang.index(list_min_lang[j])]==1):
label2+=1
else:
label3+=1
#找出邻近点最多的类别
label_list=[]
label_list.append(label1)
label_list.append(label2)
label_list.append(label3)
label_list.sort()
if(label_list[2]==label1):
n=0
if(label_list[2]==label2):
n=1
if(label_list[2]==label3):
n=2
print("该目标数据为{}类".format(n))
截图
总结
这次作业加强了我对knn算法的理解,Knn算法分类的重点是要找到所有点与目标点的距离,这里用到了查到的欧式定理来解决问题。还有就是加强了我用Python编程的熟练度,由于Python才开始学习不久,编程过程中遇到一些困难,经过上网查阅和询问,慢慢了解了更多,比如将字符串分割在转换成数值型,还有将列表排序的sort()方法等等。总之还需要不断的学习和进步。