KNN算法是一种分类算法,其实啊,KNN的原理就是当预测一个新的值x的时候,根据它距离最近的K个点是什么类别来判断x属于哪个类别。
例如当K=3的时候,也就是取最靠近样本点的三个数据,然后看这三个数据大多数是什么类型的,就将样本点归为什么类;
所以在代码中可以根据距离计算判断:例如二维数据
KNN算法优点
简单易用,相比其他算法,KNN算是比较简洁明了的算法。即使没有很高的数学基础也能搞清楚它的原理。模型训练时间快,上面说到KNN算法是惰性的,这里也就不再过多讲述。预测效果好,对异常值不敏感,毕竟取多数的数据。
KNN算法缺点
对内存要求较高,因为该算法存储了所有训练数据,预测阶段可能很慢
对不相关的功能和数据规模敏感。
具体代码实现,这里使用matlab生成总数据集data.txt,有1000条数据
编程语言采用我喜欢的Java。原理都一样,语言只是工具,嘿嘿。
首先是肯定是读取data,txt文件,将数据保存在List集合中:
集合中用Data类封装数据.
//数据类
public class Data implements Comparable<Data>{
// 每年获得的飞行常客里程数
private double mile;
// 玩视频游戏所耗时间百分比
private double time;
// 每周消费的冰淇淋公升数
private double icecream;
// 1 代表不喜欢的人
// 2 代表魅力一般的人
// 3 代表极具魅力的人
private int type;
// 两个数据距离
private double distance;
@Override
public int compareTo(Data o) {
if (this.distance < o.getDistance()) {
return -1;
}else if (this.distance > o.getDistance()) {
return 1;
}
return 0;
}
}
//省略getter 和setter方法,实现Comparable接口后可以实现compareTo方法,自定义排序规则。
接下来读取文件数据:采用BufferedReader类对文件进行读取
//解析传入的文件名对应的文件数据
private List<Data> initDataSet(String fileName) throws IOException {
List<Data> list = new ArrayList<Data>();
BufferedReader bufferedReader = new BufferedReader(new FileReader(fileName));
String line = null;
while ((line = bufferedReader.readLine()) != null) {
Data data = new Data();
String[] s = line.split("\t");
data.setMile(Double.parseDouble(s[0]));
data.setTime(Double.parseDouble(s[1]));
data.setIcecream(Double.parseDouble(s[2]