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 ...
随机推荐
- __attribute__ 变量对齐
http://blog.163.com/sunm_lin/blog/static/9192142200741533038695/ 一. __attribute__ ((aligned (n))) ...
- Flex 页面空白或Error #2032
日前用flex.arcgis做了一个地图显示的页面,本机调试没题目,公布后放到用户办事器上(win2003,ie6)ie6显示页面空白,换搜狗浏览器显示Error #2032,只显示进度条,客户端用i ...
- SolrCloud 5.x 集群部署方法
CentOS下安装Solr5.3 http://www.centoscn.com/image-text/install/2015/0918/6190.html solr5.3.1 集群服务搭建 ...
- 对GitHub的认识
Github创建于2008年被市场研究公司Forrester称作开发者的Facebook .作为开源代码库以及版本控制系统,Github拥有140多万开发者用户.随着越来越多的应用程序转移到了云上,G ...
- Winform 窗体最小化隐藏在桌面右下角:转
ICO文件要放到 bin\Debug 下 1.给主窗体添加 NotifyIcon 控件 2.窗体加载事件里 private void MainF_Load(object sender, EventAr ...
- Setting start page of Windows Phone dynamically through code
Essentially this one line of code will set the start page of the application. var navTo = new Uri(&q ...
- [zt]OJ常见的Judge Status
Queuing : 提交太多了,OJ无法在第一时间给所有提交以评判结果,后面提交的程序将暂时处于排队状态等待OJ的评判.不过这个过程一般不会很长. Compiling : 您提交的代码正在被编译. R ...
- Hadoop.2.x_源码编译
一.基本环境搭建 1. 准备 hadoop-2.5.0-src.tar.gz apache-maven-3.0.5-bin.tar.gz jdk-7u67-linux-x64.tar.gz proto ...
- SQL sp_executesql【转】
execute相信大家都用的用熟了,简写为exec,除了用来执行存储过程,一般都用来执行动态Sql sp_executesql,sql2005中引入的新的系统存储过程,也是用来处理动态sql的, 如: ...
- 没有Iphone也能装逼:让Android版QQ显示成Iphone6
在智能手机市场上苹果的iPhone一直都有着很高的关注度,不过其高昂的价格却让人望而却步.有些年轻人为了拥有一部iPhone 不惜出租胸部来做广告位,更有甚者还卖身卖肾.其实这又何苦呢.其实只要小小地 ...