knn算法思想及代码实现

el/2024/2/25 22:44:14

实验中用到的数据在我的上传中心有


1.什么是KNN

K近邻算法(K-Nearest Neighbour,K-NN)是一种基本分类与回归方法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:如果一个样本在特征空间中的K个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。
K近邻算法简单,直观。给定一个训练数据集,对于新的输入实例,在训练数据集中找到与该实例最邻近的K个实例,这K个实例的多数某个类,就把该输入实例归入这个类。K近邻法没有显示的学习过程。

2.算法步骤

step.1—初始化距离为最大值
step.2—计算未知样本和每个训练样本的距离dist
step.3—得到目前K个最临近样本中的最大距离maxdist
step.4—如果dist小于maxdist,则将该训练样本作为K-最近邻样本
step.5—重复步骤2、3、4,直到未知样本和所有训练样本的距离都算完
step.6—统计K个最近邻样本中每个类别出现的次数
step.7—选择出现频率最大的类别作为未知样本的类别

在这里插入图片描述


代码

import numpy as np
import operator
from matplotlib import pyplot as plt#获取数据
def get_data(knn):#计算txt文件的行数count = len(open(knn).readlines())#创建矩阵data = np.zeros(shape = (count,2))label = np.zeros(shape = (count,1))label = label.astype(str)i = 0file = open(knn)for line in file.readlines():#strip()消除行首和行尾的空白#split()以参数为间隔符,提取数据,返回字符串列表cutline = line.strip().split(',')data[i,:]= np.array(cutline[0:2],dtype = float)label[i,0] = cutline[2]i += 1return data,label.T
#欧氏距离
def Euclidean(dataSet,testdata):m = np.shape(dataSet)[0]#计算总个数distance = np.zeros(m)for i in range(m):        distance[i] = np.sqrt( np.sum( np.power( dataSet[i,:] - testdata[0,:] , 2)  )  )return distance#训练集,测试数据,训练集标签,距离方式,k值
def Knn(dataSet,dataSet_label,testdata,distance_way,k):#dist_sort是disance的升序排列的索引列表 dist_sort = distance_way(dataSet, testdata).argsort()#创建一个{类别:频数}的字典    classcount = {}#遍历前k个样本for i in range(k):label = dataSet_label[0,dist_sort[i]]classcount[label] = classcount.get( label , 0 ) + 1#classcount_sort为classcount按照  '值'  序列的列表classcount_sort = sorted(classcount.items(), key = operator.itemgetter(1),reverse = True)#返回频数最高对应的标签return classcount_sort[0][0]#主程序
a= get_data('F:\人工智能\数据集\knn1.txt')
k=10
dataSet,dataSet_label = a[0],a[1]
testdata = np.array([# [10.0,9.9,10.2,10.1] # [5.4,3.7,1.5,0.2] [5.4,3.7]],dtype = float)
print("分类结果")
lab=Knn(dataSet,dataSet_label,testdata,Euclidean,k)
print(lab) #输出分类类型
histance=Euclidean(dataSet,testdata)
histance.sort()
r=(histance[k+1]+histance[k+2])/2#计算半径
'''
#计算每个标签的元素个数
num1 = str(dataSet_label.tolist()).count("Iris-setosa")
num2 = str(dataSet_label.tolist()).count("Iris-versicolor")
num3 = str(dataSet_label.tolist()).count("Iris-virginica")
'''
print("图像展示")
#图像展示
def circle(r, a, b):  # 为了画出圆,这里采用极坐标的方式对圆进行表示 :x=r*cosθ,y=r*sinθ。theta = np.arange(0, 2*np.pi, 0.01)#极角x = a+r * np.cos(theta)y = b+r * np.sin(theta)return x, yk_circle_x, k_circle_y = circle(r, 5.4,3.7)plt.figure(figsize=(10, 10))
plt.xlim((4.0,8.0))#x坐标限制
plt.ylim((2.0,6.0))#y坐标限制
x_feature = list(map(lambda x: x[0], dataSet))  # 返回每个数据的x特征值
y_feature = list(map(lambda y: y[1], dataSet))
plt.scatter(x_feature[:50], y_feature[:50], c="b")  
plt.scatter(x_feature[50:100], y_feature[50:100], c="g")
plt.scatter(x_feature[100:], y_feature[100:], c="r")
plt.scatter([5.4], [3.7], c="k", marker="x")   # 待测试点的坐标
plt.plot(k_circle_x, k_circle_y)

实验结果:
在这里插入图片描述


http://www.ngui.cc/el/4466217.html

相关文章

机器学习—— 评价指标

一、分类指标 1、准确率和召回率 准确率(Precision)是你给出的正确结果数占你给出的所有结果数的比例。 召回率(Recall)是你给出的正确结果数占所有正确结果数的比例。 比如:池塘里共有200生物,其中鱼140&…

机器学习测试二总结

1、卷积神经网络计算公示: 卷积层与池化层输出矩阵大小 C[(T-F2*P)/S]1 C为输出矩阵尺寸,T为待处理矩阵的尺寸,F为滤波器矩阵尺寸,P为填充矩阵(pooling),S为步长 2、MLP是完全连通的有向图&…

0-1背包与完全背包的区别

0-1背包 重要部分:每次每个物品最多只能选择一次。 题面:有n个重量和价值分别为 Wi 与 Vi 的物品,现在从这些物品中挑选出总重量不超过 s 的物品,并且要求总价值最大。 输入: n4 S5 (w,v) {(2,3&#xf…

最小生成树之最大生成树

poj 3723 Conscription 【最大生成树|最大权森林】 题目:poj 3723 Conscription 题意:要征兵n个男兵和m个女兵,每个花费10000元,但是如果已经征募的男士兵中有和将要征募的女士兵关系好的,那么可以减少花费&#xff0c…

Crazy Rows(2009 Round2 A)

Problem You are given an N x N matrix with 0 and 1 values. You can swap any two adjacent rows of the matrix. Your goal is to have all the 1 values in the matrix below or on the main diagonal. That is, for each X where 1 ≤ X ≤ N, there must be no 1 valu…

selenium启动chrome时,弹出设置页面:Windows Defender 防病毒要重置您的设置。和data页面

selenium启动chrome时,弹出设置页面:Windows Defender 防病毒要重置您的设置。和data页面 1.在使用selenium打开chrome时同时打开了两个标签页,且页面停留在chrome的设置页面,页面打开链接后data页面也没有消失 winr 运行 regedit &#xff…

Java从头来(一)

java命名规范 1、命名规则 包:英文全小写 类:英文,每个单词的首字母为大写,其它为小写,例如:JavaTest 变量:英文有意义,首字母第一个单词小写,其它单词首字母大写。例如…

深度学习——负采样

引用自:https://zhuanlan.zhihu.com/p/39684349 训练一个神经网络意味着要输入训练样本并且不断调整神经元的权重,从而不断提高对目标的准确预测。每当神经网络经过一个训练样本的训练,它的权重就会进行一次调整。 vocabulary的大小决定了我们…

高情商的对话(边学习边更新)

你是我的太阳 意:“你是我的太阳”。那说明“你”在他(她)的心目中,地位非常重要,非常显赫。想一想吧,万物生长靠太阳,可以说:没有太阳,地球上的万物生灵就不复存在,由此…

说话干嘛要“之道”啦?(1-10)

说话干嘛要“之道”啦? 所有的事情:报告、开会、道歉、要求加薪、演讲、倾听诉苦,都只跟一件事情 有关,就是:你会不会说话,你有没有能力去想象听你讲话的人是什么心情,想听到什么。 已经很讨人喜…