- 浏览: 554230 次
- 性别:
- 来自: 济南
文章分类
- 全部博客 (270)
- Ask chenwq (10)
- JSF (2)
- ExtJS (5)
- Life (19)
- jQuery (5)
- ASP (7)
- JavaScript (5)
- SQL Server (1)
- MySQL (4)
- En (1)
- development tools (14)
- Data mining related (35)
- Hadoop (33)
- Oracle (13)
- To Do (2)
- SSO (2)
- work/study diary (10)
- SOA (6)
- Ubuntu (7)
- J2SE (18)
- NetWorks (1)
- Struts2 (2)
- algorithm (9)
- funny (1)
- BMP (1)
- Paper Reading (2)
- MapReduce (23)
- Weka (3)
- web design (1)
- Data visualisation&R (1)
- Mahout (7)
- Social Recommendation (1)
- statistical methods (1)
- Git&GitHub (1)
- Python (1)
- Linux (1)
最新评论
-
brandNewUser:
楼主你好,问个问题,为什么我写的如下的:JobConf pha ...
Hadoop ChainMap -
Molisa:
Molisa 写道mapred.min.split.size指 ...
Hadoop MapReduce Job性能调优——修改Map和Reduce个数 -
Molisa:
mapred.min.split.size指的是block数, ...
Hadoop MapReduce Job性能调优——修改Map和Reduce个数 -
heyongcs:
请问导入之后,那些错误怎么解决?
Eclipse导入Mahout -
a420144030:
看了你的文章深受启发,想请教你几个问题我的数据都放到hbase ...
Mahout clustering Canopy+K-means 源码分析
原理部分:
请参考:KNN演算法
代码实现:
KNN结点类,用来存储最近邻的k个元组相关的信息
/** * KNN结点类,用来存储最近邻的k个元组相关的信息 */ public class KNNNode { private int index; // 元组标号 private double distance; // 与测试元组的距离 private String c; // 所属类别 public KNNNode(int index, double distance, String c) { super(); this.index = index; this.distance = distance; this.c = c; } public int getIndex() { return index; } public void setIndex(int index) { this.index = index; } public double getDistance() { return distance; } public void setDistance(double distance) { this.distance = distance; } public String getC() { return c; } public void setC(String c) { this.c = c; } }
KNN算法主体类
/** * KNN算法主体类 */ public class KNN { /** * 设置优先级队列的比较函数,距离越大,优先级越高 */ private Comparator<KNNNode> comparator = new Comparator<KNNNode>() { public int compare(KNNNode o1, KNNNode o2) { if (o1.getDistance() >= o2.getDistance()) { return 1; } else { return 0; } } }; /** * 获取K个不同的随机数 * @param k 随机数的个数 * @param max 随机数最大的范围 * @return 生成的随机数数组 */ public List<Integer> getRandKNum(int k, int max) { List<Integer> rand = new ArrayList<Integer>(k); for (int i = 0; i < k; i++) { int temp = (int) (Math.random() * max); if (!rand.contains(temp)) { rand.add(temp); } else { i--; } } return rand; } /** * 计算测试元组与训练元组之前的距离 * @param d1 测试元组 * @param d2 训练元组 * @return 距离值 */ public double calDistance(List<Double> d1, List<Double> d2) { double distance = 0.00; for (int i = 0; i < d1.size(); i++) { distance += (d1.get(i) - d2.get(i)) * (d1.get(i) - d2.get(i)); } return distance; } /** * 执行KNN算法,获取测试元组的类别 * @param datas 训练数据集 * @param testData 测试元组 * @param k 设定的K值 * @return 测试元组的类别 */ public String knn(List<List<Double>> datas, List<Double> testData, int k) { PriorityQueue<KNNNode> pq = new PriorityQueue<KNNNode>(k, comparator); List<Integer> randNum = getRandKNum(k, datas.size()); for (int i = 0; i < k; i++) { int index = randNum.get(i); List<Double> currData = datas.get(index); String c = currData.get(currData.size() - 1).toString(); KNNNode node = new KNNNode(index, calDistance(testData, currData), c); pq.add(node); } for (int i = 0; i < datas.size(); i++) { List<Double> t = datas.get(i); double distance = calDistance(testData, t); KNNNode top = pq.peek(); if (top.getDistance() > distance) { pq.remove(); pq.add(new KNNNode(i, distance, t.get(t.size() - 1).toString())); } } return getMostClass(pq); } /** * 获取所得到的k个最近邻元组的多数类 * @param pq 存储k个最近近邻元组的优先级队列 * @return 多数类的名称 */ private String getMostClass(PriorityQueue<KNNNode> pq) { Map<String, Integer> classCount = new HashMap<String, Integer>(); for (int i = 0; i < pq.size(); i++) { KNNNode node = pq.remove(); String c = node.getC(); if (classCount.containsKey(c)) { classCount.put(c, classCount.get(c) + 1); } else { classCount.put(c, 1); } } int maxIndex = -1; int maxCount = 0; Object[] classes = classCount.keySet().toArray(); for (int i = 0; i < classes.length; i++) { if (classCount.get(classes[i]) > maxCount) { maxIndex = i; maxCount = classCount.get(classes[i]); } } return classes[maxIndex].toString(); } }
KNN算法测试类
/** * KNN算法测试类 */ public class TestKNN { /** * 从数据文件中读取数据 * @param datas 存储数据的集合对象 * @param path 数据文件的路径 */ public void read(List<List<Double>> datas, String path){ try { BufferedReader br = new BufferedReader(new FileReader(new File(path))); String data = br.readLine(); List<Double> l = null; while (data != null) { String t[] = data.split(" "); l = new ArrayList<Double>(); for (int i = 0; i < t.length; i++) { l.add(Double.parseDouble(t[i])); } datas.add(l); data = br.readLine(); } } catch (Exception e) { e.printStackTrace(); } } /** * 程序执行入口 * @param args */ public static void main(String[] args) { TestKNN t = new TestKNN(); String datafile = new File("").getAbsolutePath() + File.separator + "datafile"; String testfile = new File("").getAbsolutePath() + File.separator + "testfile"; try { List<List<Double>> datas = new ArrayList<List<Double>>(); List<List<Double>> testDatas = new ArrayList<List<Double>>(); t.read(datas, datafile); t.read(testDatas, testfile); KNN knn = new KNN(); for (int i = 0; i < testDatas.size(); i++) { List<Double> test = testDatas.get(i); System.out.print("测试元组: "); for (int j = 0; j < test.size(); j++) { System.out.print(test.get(j) + " "); } System.out.print("类别为: "); System.out.println(Math.round(Float.parseFloat((knn.knn(datas, test, 3))))); } } catch (Exception e) { e.printStackTrace(); } } }
- KNN.rar (9.4 KB)
- 下载次数: 117
发表评论
-
EM算法小结
2012-07-20 12:16 3377描述 EM是一种基于模型的聚类算法,假设样本符合高斯混 ... -
研究生能力培养手册
2012-06-10 21:00 8351. 如果平时几乎没看过英文原文,读不懂怎么办? ... -
[转]中科院分词工具ICTCLAS Java JNI接口
2012-06-04 15:07 1833ICTCLAS,网址:http://www.ictcla ... -
正则表达式学习资源
2012-05-30 11:37 705不懂正则表达式,怎么好意思说是玩文本挖掘的? 下面 ... -
基于向量空间模型的文本聚类算法
2012-05-29 18:26 26801 文本聚类研究现状 Internet 已经发 ... -
再往前一步,学会更专业地看待问题,尝试去解决问题。
2012-05-22 14:11 910在科研工作中,有一个很基本的技能,就是对自己和别人的工 ... -
Bloom filter
2012-04-24 21:08 1140Bloom filter的优点: 大小固定,增加更多 ... -
基于密度的局部离群点检测
2012-04-24 16:49 3031算法:基于密度的局部离群点检测(lof算法) 输入:样 ... -
[转]非均衡数据集的分类问题
2012-03-31 21:36 2934传统的机器学习分类 ... -
LDA(线性判别分析)&PCA(主成分分析)
2012-03-23 21:16 1413推荐解释得非常好的两篇博文 http://blog.c ... -
Porter Stemming
2012-02-29 10:57 871摘要: 在英语中,一个单词常常是另一个单词的“变种”,如:h ... -
Hadoop Browse the filesystem无法访问
2012-02-23 22:17 1071问题如题. 解决方法: 修改/windows/system ... -
数据挖掘数据集
2012-02-18 17:35 914收集数据挖掘过程中用到的数据集。欢迎补充! TREC ... -
分类器的动态选择
2012-02-18 17:15 1025XMU DM一师兄写的动态集成分类器的选择, 内容挺新颖的, ... -
book reading plan
2012-02-09 15:50 682Mining of Massive Datasets ... -
[转]学术论文的标准格式是什么?写论文有哪些小技巧
2012-02-08 21:45 921我有一篇谈研究生开题报告的文章,你可以参考下: ... -
Rapid-I, 一个JAVA的数据挖掘开源平台
2012-01-30 18:29 988当前主要使用的weka3.6,Hadoop的MapR ... -
Weka分析结果参数解释
2012-01-17 17:20 4199Kappa Statistic 假设有两个相互独立的人分别将 ... -
一淘背后的数据野心
2012-01-05 23:11 1168摘要:马云你能 ... -
多标记(multi-label)学习和Mulan
2011-12-21 20:33 2974概念澄清: ...
相关推荐
KNN算法原理和java实现,K最近邻分类
KNN最近邻算法java实现
Java实现kNN算法
KNN算法的实现过程,用java实现,很详细的哦
KNN算法实验报告【Java实现】.doc
该KNN算法示例采用java实现,对数据分类算法的学习很有用,而且代码封装很好,简单易懂,极适合初学者
KNN–最近邻分类算法,算法逻辑比较简单,思路如下: 1.设一待分类数据iData,先计算其到已标记数据集中每个数据的距离,例如欧拉距离sqrt((x1-x2)^2+(y1-y2)^2); 2.然后根据离iData最近的k个数据的分类,出现次数...
邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。 kNN算法的核心思想是...
KNN算法JVAA实现邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法可以说是整个数据挖掘分类技术中最简单的方法了。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用她最接近的k个邻居来代表...
K-近邻算法,又称为 KNN 算法,是数据挖掘技术中原理最简单的算法。 KNN 的工作原理:给定一个已知类别标签的数据训练集,输入没有标签的新数据后,在训练数据集中找到与新数据最临近的 K 个实例。如果这 K 个实例的...
模式识别中的KNN算法实现,基于Matlab的实现,以及剪辑近邻法的matlab实现。
mnist手写体的识别采用KNN算法,Java实现,60K训练集,10K测试集。代码主要包括读mnist数据集,KNN算法。
k最近邻算法(kNN)是一个十分简单的分类算法,该算法包括两个步骤:(1)在给定的搜索训练集上按一定距离度量,寻找一个k的值。(2)在这个kNN算法当中,根据大多数分为一致的类来进行分类。kNN算法具有的非参数...
这个是我实验课的作业,Java实现knn算法,对网上需手动输入数据的算法进行了一些改进,注释详细,数据是文件夹中的txt文件,读者可以自己更换成自己的数据。
邻近算法,或者说K最近邻(KNN,K-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是K个最近的邻居的意思,说的是每个样本都可以用它最接近的K个邻近值来代表。近邻算法就是将数据...
资源中包括完成的KNN算法训练和实现过程,以及用于机器学习的糖尿病数据集。 数据特征包括: Pregnancies:怀孕次数 Glucose:葡萄糖测试值 BloodPressure:血压 SkinThickness:表皮厚度 Insulin:胰岛素 BMI:身体...
KNN算法用JAVA实现,在WEKA平台上实现
2. 设计基于最近邻准则的分类器。 资源包括代码实现和课程报告--Bayes和KNN分类器实现鸢尾花数据集分类 源码实现包括手撕贝叶斯和KNN以及使用工具包实现 课程报告主要包括以下部分: 一、 问题描述 二、 数据预处理 ...
java实现的KNN算法,对学习KNN算法有帮助
KNN算法,K最近邻分类算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。