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 ...
随机推荐
- iOS中为网站添加图标到主屏幕
1 <link rel="apple-touch-icon-precomposed" href="icon.png"/> 2 <link re ...
- BZOJ 1087 题解【状压DP】
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3112 Solved: 1816[Submit][ ...
- Vijos1448校门外的树 题解
Vijos1448校门外的树 题解 描述: 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的…… 如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现 ...
- Ubuntu Gnome 14.04.2 lts 折腾笔记
unity感觉不爽,于是来折腾gnome3 = = 首先去官网下载ubuntu gnome 14.04.2 lts的包(种子:http://cdimage.ubuntu.com/ubuntu-gnom ...
- windows2008 IIS下配置FTP服务
一.服务器管理器 1.2008的系统使用服务器管理器,选择角色,因为我之前已经开启了IIS服务器角色,所以我现在只要添加角色服务即可,如果你没有开启过的话,直接添加角色即可. 2.选择WEB服务器,打 ...
- 初识WebSocket
众所周知,Http协议是无状态的,并且是基于Request/Response的方式与服务器进行交互,也就是我们常说的单工模式.但是随着互联 网的发展,浏览器与服务端进行双向通信需求的增加,长轮询向服务 ...
- 让Xcode的 stack trace信息可读
让Xcode的 stack trace信息可读 昨天在写 iOS 代码的时候,调试的时候模拟器崩溃了.异常停在了如下整个 main 函数的入口处: int main(int argc, char *a ...
- Android基于XMPP的即时通讯3-表情发送
这篇博文主要讲表情发送的一些东西. 参考:Android基于XMPP的即时通讯1-基本对话 1.准备好资源文件 采用的是emoji的表情,我打包好了,下载地址:http://files.cnblogs ...
- unity3d插件Daikon Forge GUI 中文教程3-基础控件Button和Sprite的使用
2.2添加一个按钮Button 来看看特有的属性:Button Properties Data 显示的文本 Behavior 中的几个: Aoto Size 选中时就是按钮的背景会根据Data中的文本 ...
- sass学习笔记1
less在处理CSS动画时,非常恶心,决定转向sass了.sass诞生得比less早,只是因为它是ruby写的,因此受众面够少.但我们不需要自己下编译器或使用命令行,我们可以koala这神器 首先几个 ...