KNN(最邻近算法)
时间:2022/5/4
0.数据集分析
测试使用的数据集为经典的鸢尾花数据集iris.有四个属性,分别为花萼长度(sepallength)、花萼宽度(sepalwidth)、花瓣长度(petallength)、花瓣宽度(petalwidth)。决策属性为种类(setosa、versicolor、virginica)。

1.算法思想
闵老师在上课时说过,机器学习的本质就是“猜”,用已知的数据去预测未知的数据,而不同的算法就是猜的方法不同。对于KNN算法而言,它猜的思想就像是“近朱者赤,近墨者黑”的思想。正如我们想了解一个人的时候就可以通过他所交的朋友来推测他是个什么样的人,KNN也是如此。KNN通过寻找离预测目标最近的对象作为预测目标的邻居。通过邻居的占比来推测预测目标的标签。
由此可见,KNN算法有一下特点:
-
算法是比较简单,没有学习过程,也被称为惰性学习
-
算法思想简单易懂,贴合人类思维。算法适应性也是很强,可用于分类回归,可用于多种数据。
-
效果是非常好的,KNN算法充分利用了已知数据,对测试目标的预测准确率很高。通过测试可见,


多次测试结果KNN的正确率均在90%以上。
-
KNN也存在一个缺点,复杂度高。对于每个需要预测的目标,均需要计算其与整个训练集的距离。对于每一个测试数据, 复杂度为 O ( ( m + k ) n ) , 其中n为训练数据个数, m为条件属性个数, k为邻居个数.
-
一般需要对数据归一化。
-
使用过程对内存要求较高,最好是能将数据集全部存入内存中,若是内存空间较小,频繁的进行IO操作,则对算法的时间影响较大。
2.算法流程:
- 读入数据集,使用weka.jar包进行数据读取存储。
- 拆分数据集,按一定比例划分为训练集与测试集。
- 预测测试集:
- 取出一个测试对象
- 计算测试对象到训练集中训练对象的距离,这里提供两种距离度量:欧式距离和曼哈顿距离;
- 选取距离最近的K个邻居
- 投票:这里使用的是简单投票,统计邻居种类个数。
- 投票最多的标签即为预测对象的标签
- 计算预测准确度。
3.代码部分
/**
* KNN.java
*
* @author zjy
* @date 2022/5/3
* @Description: KNN算法的学习
* @version V1.0
*/
package swpu.zjy.ML.KNN;
import weka.core.Instances;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Random;
public class KNN {
/**
* 定义KNN使用的距离度量
*/
//曼哈顿距离
public static final int MANHATTAN = 0;
//欧几里得距离
public static final int EUCLIDEAN = 1;
public static int distanceMeasure = EUCLIDEAN;
//邻居数量:K ;默认为7
public static int numNeighbors = 7;
//数据集对象 用以存储整个数据集
Instances datasets;
/**
* 训练集与测试集实体
* 这里老师采用的方法是只存储一个元组的下标,用索引的形式存储训练集与测试集,
* 这是之前所没有使用形式,经过实际测试,这种方法比使用对象存储数据的方式要更快且更加节省内存。
*/
//训练集
int[] trainingSet;
//测试集
int[] testingSet;
//预测标签 ,存储KNN预测的结果
int[] predictions;
//随机数生成器
public static Random random = new Random();
/**
* KNN构造方法,通过传入数据文件路径,构造数据集
*
* @param dataSetFileName 数据集文件路径
*/
public KNN(String dataSetFileName) {
try {
FileReader fileReader = new FileReader(dataSetFileName);
//使用weka包读取数据集
datasets = new Instances(fileReader);
//设置数据集决策属性 datasets.numAttributes()获取数据集属性个数
//本次使用的鸢尾花数据集,将最后一项作为决策属性
datasets.setClassIndex(datasets.numAttributes() - 1);
fileReader.close();
} catch (IOException e) {
e.printStackTrace();
System.exit(0);
}
}
/**
* 设置邻居个数,默认是7,可由用户自己设

本文详细介绍了KNN算法的工作原理、鸢尾花数据集应用、关键步骤代码、运行结果分析及优化思考,包括距离度量、邻居选取策略和提升效率的方法。
最低0.47元/天 解锁文章
3644

被折叠的 条评论
为什么被折叠?



