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)