k近邻算法的Java实现
k近邻算法是机器学习算法中最简单的算法之一,工作原理是:存在一个样本数据集合,即训练样本集,并且样本集中的每个数据都存在标签,即我们知道样本集中每一数据和所属分类的对应关系。输入没有标签的新数据之后,将新数据的每个特征和样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据的分类标签作为新数据的标签。一般来说,我们只选取样本数据中前k个最相似的数据。
Java实现:

KNNData.java
package KNN;
public class KNNData implements Comparable<KNNData>{
double c1;
double c2;
double c3;
double distance;
String type;
public KNNData(double c1, double c2, double c3, String type) {
this.c1 = c1;
this.c2 = c2;
this.c3 = c3;
this.type = type;
}
@Override
public int compareTo(KNNData arg0) {
return Double.valueOf(this.distance).compareTo(Double.valueOf(arg0.distance));
}
}
KNN.java
package KNN; import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set; public class KNN { //训练集
private List<KNNData> KNNDS = null; public KNN(List<KNNData> KNNDS) {
this.KNNDS = KNNDS;
} //欧式距离
private static double disCal(KNNData i, KNNData td) {
return Math.sqrt((i.c1 - td.c1)*(i.c1 - td.c1)+(i.c2 - td.c2)*(i.c2 - td.c2)+
(i.c3 - td.c3)*(i.c3 - td.c3));
} private static String getMaxValueKey(int k, List<KNNData> ts){
//只保留前k个元素 while(ts.size() != k) {
ts.remove(k);
} String sKey;
//保存key以及出现次数
HashMap<String,Integer> keySet = new HashMap<String,Integer>();
keySet.put(ts.get(0).type,1);
for (int x = 1; x < ts.size(); x++) {
sKey = ts.get(x).type;
if (keySet.containsKey(sKey)) {
keySet.put(sKey, keySet.get(sKey)+1);
} else {
keySet.put(sKey, 1);
}
}
Set<Map.Entry<String,Integer>> set = keySet.entrySet();
Iterator<Map.Entry<String,Integer>> iter = set.iterator(); int mValue = 0;
String mType = "";
while (iter.hasNext()){
Map.Entry<String,Integer> map = iter.next();
if (mValue < map.getValue()) {
mType = map.getKey();
mValue = map.getValue();
}
} return mType;
} public static String knnCal(int k, KNNData i, List<KNNData> ts) {
//保存距离
for (KNNData td : ts) {
td.distance = disCal(i, td);
}
Collections.sort(ts);
return getMaxValueKey(k, ts);
}
}
KNNTest.java
package KNN; import java.util.ArrayList;
import java.util.List; public class KNNTest { public static void main(String[] args) { List<KNNData> kd = new ArrayList<KNNData>();
//训练集
kd.add(new KNNData(1.2,1.1,0.1,"A"));
kd.add(new KNNData(1.2,1.1,0.1,"A"));
kd.add(new KNNData(7,1.5,0.1,"B"));
kd.add(new KNNData(6,1.2,0.1,"B"));
kd.add(new KNNData(2,2.6,0.1,"C"));
kd.add(new KNNData(2,2.6,0.1,"C"));
kd.add(new KNNData(2,2.6,0.1,"C"));
kd.add(new KNNData(100,1.1,0.1,"D")); System.out.println(KNN.knnCal(3, new KNNData(1.1,1.1,0.1,"N/A"), kd));
}
}
k近邻算法的Java实现的更多相关文章
- 机器学习实战笔记--k近邻算法
#encoding:utf-8 from numpy import * import operator import matplotlib import matplotlib.pyplot as pl ...
- 基本分类方法——KNN(K近邻)算法
在这篇文章 http://www.cnblogs.com/charlesblc/p/6193867.html 讲SVM的过程中,提到了KNN算法.有点熟悉,上网一查,居然就是K近邻算法,机器学习的入门 ...
- 从K近邻算法谈到KD树、SIFT+BBF算法
转自 http://blog.csdn.net/v_july_v/article/details/8203674 ,感谢july的辛勤劳动 前言 前两日,在微博上说:“到今天为止,我至少亏欠了3篇文章 ...
- 机器学习之K近邻算法(KNN)
机器学习之K近邻算法(KNN) 标签: python 算法 KNN 机械学习 苛求真理的欲望让我想要了解算法的本质,于是我开始了机械学习的算法之旅 from numpy import * import ...
- k近邻算法
k 近邻算法是一种基本分类与回归方法.我现在只是想讨论分类问题中的k近邻法.k近邻算法的输入为实例的特征向量,对应于特征空间的点,输出的为实例的类别.k邻近法假设给定一个训练数据集,其中实例类别已定. ...
- KNN K~近邻算法笔记
K~近邻算法是最简单的机器学习算法.工作原理就是:将新数据的每一个特征与样本集中数据相应的特征进行比較.然后算法提取样本集中特征最相似的数据的分类标签.一般来说.仅仅提取样本数据集中前K个最相似的数据 ...
- 机器学习03:K近邻算法
本文来自同步博客. P.S. 不知道怎么显示数学公式以及排版文章.所以如果觉得文章下面格式乱的话请自行跳转到上述链接.后续我将不再对数学公式进行截图,毕竟行内公式截图的话排版会很乱.看原博客地址会有更 ...
- 机器学习——KNN算法(k近邻算法)
一 KNN算法 1. KNN算法简介 KNN(K-Nearest Neighbor)工作原理:存在一个样本数据集合,也称为训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分 ...
- [机器学习] k近邻算法
算是机器学习中最简单的算法了,顾名思义是看k个近邻的类别,测试点的类别判断为k近邻里某一类点最多的,少数服从多数,要点摘录: 1. 关键参数:k值 && 距离计算方式 &&am ...
随机推荐
- The design of a distributed variant of Plato framework to support collaborated editing
A first thought system architecture (pulling mode) is one that the server doesn't keep client inform ...
- [深入浅出Windows 10]实现饼图控件
13.2 实现饼图控件 上一小节讲解了动态生成折线图和区域图,对于简单的图形这样通过C#代码来生成的方式是很方便的,但是当我们的图表要实现更加复杂的逻辑的时候,这种动态生成的方式就显得力不从心了,那就 ...
- phpunit测试成功 phpunit测试实践代码
16:12 2015/12/8phpunit测试成功,代码写在www目录下,以类名命名代码文件,我的文件名为 ArrayTest.php,类名为ArrayTest,内部写了简单的测试代码:<?p ...
- JS:操作样式表2 :用JS实现添加和删除一个类名的功能(addClass()和removeClass())
var box = document.getElementById("box"); box.id = "pox"; 将id = “box”,改为id = “po ...
- FFT 模板
#include<bits/stdc++.h> #define ll long long #define N 600005 using namespace std; inline int ...
- 如何将一个对象存到网页中并在js中使用
需求:希望在js中使用Controller传过来的对象,特别是对象里存有list的数据. 不希望循环使用隐藏域. 解决办法:在View中使用Json.Net序列化: @{ string jsonStr ...
- [CareerCup] 16.1 Thread and Process 线程和进程
16.1 What's the difference between a thread and a process? 进程Process是程序执行时的一个实例.一个进程是被分配系统资源的独立单元,每个 ...
- mysql错误代码整理
1005:创建表失败1006:创建数据库失败1007:数据库已存在,创建数据库失败1008:数据库不存在,删除数据库失败1009:不能删除数据库文件导致删除数据库失败1010:不能删除数据目录导致删除 ...
- Spring 定时器
<!-- 对定时任务进行引用 --> <bean id="schedulerFactory" class="org.springframework.sc ...
- redis发布订阅
命令 : redis-cli打开一个客户端 Redis Psubscribe 命令订阅一个或多个符合给定模式的频道. 每个模式以 * 作为匹配符,比如 it* 匹配所有以 it 开头的频道( it.n ...