Python实现KNN算法

一. 作业题目:原生Python实现knn分类算法,用鸢尾花数据集。
二.算法设计
KNN算法核心思想:如果一个样本在特征空间中的K个最相似(最近临)的样本中大多数属于某个类别,则该样本也属于这个类别。
KNN(K-Nearest Neighbor)工作原理:存在一个样本数据集合,也称为训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类对应的关系。输入没有标签的数据后,将新数据中的每个特征与样本集中数据对应的特征进行比较,提取出样本集中特征最相似数据(最近邻)的分类标签。一般来说,我们只选择样本数据集中前k个最相似的数据,这就是k近邻算法中k的出处,通常k是不大于20的整数。最后选择k个最相似数据中出现次数最多的分类作为新数据的分类。
算法原理:
(1)准备数据集和标签
(2)计算测试数据与训练数据之间的距离
(3)将这些距离升序排列
(4)确定前k个最近点
(5)返回类别出现频率最高的元素类别
三.源代码
import numpy as np
import random
import math
from sklearn.datasets import load_iris#调用load_iris函数加载数据

#原生Python实现KNN过程

def My_KNN(X_train,y_train,k,test,current_list):#K最近点的个数,但只能是奇数方便做判断
distances=[]
#for循环找出测试数据与训练集每一个点的距离
for x_train in X_train:
d = math.sqrt(np.sum((x_train[0]-X_test[0])**2+(x_train[1]-X_test[1])**2))
distances.append(d)
nearest = np.argsort(distances) #从小到大排列后返回索引
near_y = [y_train[i] for i in nearest[:k]]
for vote in near_y: #for循环选出数组中出现次数最多的y值
a=0
b=0
c=0
vote_out = 0
if vote == 0:
a+=1
elif vote == 1:
b+=1
else:
c+=1
if b>(c or a):
vote_out = 1
elif c>( b or a):
vote_out = 2
else:
vote_out = 0
###vote_out就是从邻近点集中选出最多的点就是预测的鸢尾花种类
if vote_out == y_train[test]: #如果预测结果与实际结果相同,在数组中添加1反之为0
current_list.append(1)
else:
current_list.append(0)
print(vote_out,y_train[test])
#这里用循环产生50个测试集,来测试My_KNN()函数
current_list=[]
count = 0
k = 5
#循环生成50个测试集
for i in range(50):
count+=1
test = random.randint(1,99)
X_test = iris_dataset[‘data’][test]
My_KNN(X_train,y_train,k,test,current_list)
current_list
percent = sum(current_list)/len(current_list) #因为数组内只有0和1 所以数组内元素相加/数组长度就是正确率
print("""
在抽选{0}组数据中,K为{1},其算法预测的准确度为{2}
“”".format(count,k,percent))
四.测试和调试
在这里插入图片描述
图1.
在这里插入图片描述
图2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值