首页 > 编程语言 >KNN算法实验

KNN算法实验

时间:2024-03-31 19:24:22浏览次数:23  
标签:KNN 分类 样本 距离 算法 实验 类别

1.knn算法概述
KNN算法是机器学习算法中最基础,最简单的算法之一。它既能用于分类,也能用于回归。KNN通过测量不同特征值之间的距离来进行分类。
KNN算法的思想就是对输入的特征向量对应特征空间的一个点,输出为该特征向量所对应的类别标签或者预测值。
KNN算法是一种特别的机器学习算法,没有一般意义上的学习的过程。工作原理是利用训练数据对特征向量空间进行划分,并将划分结果作为最终算法模型,存在一个样本数据集合,称作训练样本集,并且训练集的每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系。
一般我们只取样本数据集中前K个最相似的数据,就是KNN算法中K的含义。通常K是不大于20的整数。
2.KNN算法介绍
KNN算法,是有监督学习的分类算法,可以用于解决分类问题或者回归问题,但是通常用作分类算法。
3.KNN的核心思想
KNN 的全称是 K Nearest Neighbors,意思是 K 个最近的邻居。KNN 的原理是:当预测一个新样本的类别时,根据它距离最近的 K 个样本点是什么类别来判断该新样本属于哪个类别(多数投票)。
图中绿色的点就是我们要预测的那个点,假设K=3。那么KNN算法就会找到与它距离最近的三个点(这里用圆圈把它圈起来了),看看哪种类别多一些,比如这个例子中是蓝色三角形多一些,新来的绿色点就归类到蓝三角了。
4.k值的选择
我们可以使用交叉验证的方式进行K值的选择,从选取一个较小的K值开始不断增加K的值,然后计算验证集合的方差,最终找到一个比较合适的K值。
5.KNN算法的优劣介绍
优点:
1.简单易用
2.模型训练时间快
3.预测效果好
4.对异常值不敏感
缺点:
1.对内存要求高,需要存储所有训练数据
2.预测阶段可能较慢
6.KNN回归算法
上面讲到的KNN主要用于分类算法,事实上KNN也可以用于回归预测。
KNN算法用于回归预测的时候寻找K个近邻,将K个样本对的目标值取均值即可作为新样本的预测值。
7.KNN算法中的距离指标公式
曼哈顿距离L1(xi,xj)=∑nl=1|x(l)i−x(l)j|
欧式距离L2(xi,xj)=(∑nl=1|x(l)i−x(l)j|2)12
8.基于K邻近算法的实验实现
一、问题引入
海伦一直使用在线约会网站寻找适合自己的约会对象。她曾交往过三种类型的人:

不喜欢的人

一般喜欢的人

非常喜欢的人

这些人包含以下三种特征

每年获得的飞行常客里程数

玩视频游戏所耗时间百分比

每周消费的冰淇淋公升数

该网站现在需要尽可能向海伦推荐她喜欢的人,需要我们设计一个分类器,根据用户的以上三种特征,识别出是否该向海伦推荐。

二、需求概要分析
根据问题,我们可知,样本特征个数为3,样本标签为三类。现需要实现将一个待分类样本的三个特征值输入程序后,能够识别该样本的类别,并且将该类别输出。

三、程序结构设计说明
根据问题,可以知道程序大致流程如下

四、K近邻算法的一般流程
数据准备:这包括收集、清洗和预处理数据。预处理可能包括归一化或标准化特征,以确保所有特征在计算距离时具有相等的权重。
我们很容易发现,当计算样本之间的距离时数字差值最大的属性对计算结果的影响最大,也就是说,每年获取的飞行常客里程数对于计算结果的影响将远远大于上表中其他两个特征-玩视频游戏所耗时间占比和每周消费冰淇淋公斤数的影响。而产生这种现象的唯一原因,仅仅是因为飞行常客里程数远大于其他特征值。但海伦认为这三种特征是同等重要的,因此作为三个等权重的特征之一,飞行常客里程数并不应该如此严重地影响到计算结果。

在处理这种不同取值范围的特征值时,我们通常采用的方法是将数值归一化,如将取值范围处理为0到1或者-1到1之间。下面的公式可以将任意取值范围的特征值转化为0到1区间内的值:

选择距离度量方法:确定用于比较样本之间相似性的度量方法,常见的如欧几里得距离、曼哈顿距离等。

确定K值:选择一个K值,即在分类或回归时应考虑的邻居数量。这是一个超参数,可以通过交叉验证等方法来选择最优的K值。

找到K个最近邻居:对于每一个需要预测的未标记的样本:

计算该样本与训练集中所有样本的距离。

根据距离对它们进行排序。

选择距离最近的K个样本

预测:

对于分类任务:查看K个最近邻居中最常见的类别,作为预测结果。例如,如果K=3,并且三个最近邻居的类别是[1, 2, 1],那么预测结果就是类别1。

对于回归任务:预测结果可以是K个最近邻居的平均值或加权平均值。

评估:使用适当的评价指标(如准确率、均方误差等)评估模型的性能。

优化:基于性能评估结果,可能需要返回并调整某些参数,如K值、距离度量方法等,以获得更好的性能。
五.算法实现
1.使用py导入数据
from numpy import *
import operator

给出训练数据以及对应的类别

def createDataSet():
group = array([[1.0,2.0],[1.2,0.9],[0.1,0.4],[0.3,0.5]])
labels = ['A','A','B','B']
return group, labels

通过KNN进行分类

def classify(input, dataSet, labels, k):
dataSize = dataSet.shape[0]
# 计算欧式距离
diff = tile(input, (dataSize, 1)) - dataSet
sqdiff = diff ** 2
squareDist = sum(sqdiff, axis=1) # 行向量分别相加,从而得到新的一个行向量
dist = squareDist ** 0.5
# 对距离进行排序
sortedDistIndex = argsort(dist) # argsort()根据元素的值从大到小对元素进行排序,返回下标

classCount = {}
for i in range(k):
    voteLabel = labels[sortedDistIndex[i]]
    # 对选取的K个样本所属的类别个数进行统计
    classCount[voteLabel] = classCount.get(voteLabel, 0) + 1
# 选取出现的类别次数最多的类别
maxCount = 0
for key, value in classCount.items():
    if value > maxCount:
        maxCount = value
        classes = key

return classes

dataSet, labels = createDataSet()
input = array([1.0, 1.1])
output = classify(input, dataSet, labels, 3)
print("Your input is:", input, "and classified to class:", output)

标签:KNN,分类,样本,距离,算法,实验,类别
From: https://www.cnblogs.com/ls111/p/18107114

相关文章

  • 贪心算法在货船装箱中的应用
    目录贪心算法简介货船装箱问题问题描述:设计思想:具体算法描述:算法证明贪心法求解问题具有的性质:数学归纳法证明贪心选择性质:反证法证明最优子结构性质:总结贪心算法简介    贪心算法总是作出当前看来是最好的选择。也就是说,不从整体最优上加以考虑,它......
  • 上海人工智能实验室大模型算法岗(实习)面经分享
    节前,我们星球组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、参加社招和校招面试的同学,针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。汇总合集:《大模型面试宝典》(2024版)发布!......
  • 腾讯这10道算法面试题,看完跪了。。。
    节前,我们星球组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、参加社招和校招面试的同学,针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。汇总合集:《大模型面试宝典》(2024版)发布!......
  • 字符串算法
    Manacher-------快速查找回文串这个算法其实是基于暴力查找回文串的优化。 while(i-k>=0&&i+k<n&&s[i-k]==s[i+k]){k++;}这就是暴力查找以s[i]为中心点的奇数长的回文串,偶数也一样就是改一下下角标就可以。这个算法的优化其实就是以s[i]为中点的回文串......
  • 模拟退火(simulated annealing,SA)算法解决TSP问题
        模拟退火(simulatedannealing,SA)算法    该算法的思想最早是由Metropolis等提出的。其出发点是基于物理中固体物质的退火过程与一般的组合优化问题之间的相似性。模拟退火法是一种通用的优化算法,其物理退火过程由以下三部分组成:    (1)加温......
  • 目前国内全地形能力最强的双足机器人 —— 逐际动力 —— 提出迭代式预训练(Iterative
    相关:https://weibo.com/1255595687/O5k4Aj8l2该公司对其产品的强化学习训练算法给出了较少的描述:提出迭代式预训练(IterativePre-training)方法,把通用机器人的基础运动能力划分为不同级别,进行循序渐进的预训练,这个过程让训练的结果更可控,从而高效地产出和收集有效数据,训练......
  • 代码随想录算法训练营第32天| 122.买卖股票的最佳时机 II、55. 跳跃游戏、45.跳跃游戏
    122.买卖股票的最佳时机II题目链接:买卖股票的最佳时机II题目描述:给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出......
  • 代码随想录算法训练营第34天| 1005. K 次取反后最大化的数组和、134. 加油站、135. 分
    1005.K次取反后最大化的数组和题目链接:K次取反后最大化的数组和题目描述:给你一个整数数组nums和一个整数k,按以下方法修改该数组:选择某个下标i并将nums[i]替换为nums[i]。重复这个过程恰好k次。可以多次选择同一个下标i。以这种方式修改数组后,返回数......
  • 代码随想录算法训练营第36天| 435. 无重叠区间、763.划分字母区间、56. 合并区间
    435.无重叠区间题目链接:无重叠区间题目描述:给定一个区间的集合intervals,其中intervals[i]=[starti,endi]。返回需要移除区间的最小数量,使剩余区间互不重叠。解题思想:这道题目和射气球很像。*“需要移除区间的最小数量,使剩余区间互不重叠”*等效于求重叠区......
  • 代码随想录算法训练营第10天 | 栈和队列
    理论基础栈和队列是STL(C++标准库)里面的两个数据结构STL中栈往往不被归类为容器,而被归类为containeradapter(容器适配器)栈的内部结构,栈的底层实现可以是vector,deque,list都是可以的,主要就是数组和链表的底层实现我们常用的SGISTL,如果没有指定底层实现的话,默认是以deque为......