- 浏览: 564043 次
- 性别:
- 来自: 济南
文章分类
- 全部博客 (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 3433描述 EM是一种基于模型的聚类算法,假设样本符合高斯混 ... -
研究生能力培养手册
2012-06-10 21:00 8711. 如果平时几乎没看过英文原文,读不懂怎么办? ... -
[转]中科院分词工具ICTCLAS Java JNI接口
2012-06-04 15:07 1867ICTCLAS,网址:http://www.ictcla ... -
正则表达式学习资源
2012-05-30 11:37 733不懂正则表达式,怎么好意思说是玩文本挖掘的? 下面 ... -
基于向量空间模型的文本聚类算法
2012-05-29 18:26 27281 文本聚类研究现状 Internet 已经发 ... -
再往前一步,学会更专业地看待问题,尝试去解决问题。
2012-05-22 14:11 943在科研工作中,有一个很基本的技能,就是对自己和别人的工 ... -
Bloom filter
2012-04-24 21:08 1189Bloom filter的优点: 大小固定,增加更多 ... -
基于密度的局部离群点检测
2012-04-24 16:49 3071算法:基于密度的局部离群点检测(lof算法) 输入:样 ... -
[转]非均衡数据集的分类问题
2012-03-31 21:36 2965传统的机器学习分类 ... -
LDA(线性判别分析)&PCA(主成分分析)
2012-03-23 21:16 1445推荐解释得非常好的两篇博文 http://blog.c ... -
Porter Stemming
2012-02-29 10:57 901摘要: 在英语中,一个单词常常是另一个单词的“变种”,如:h ... -
Hadoop Browse the filesystem无法访问
2012-02-23 22:17 1097问题如题. 解决方法: 修改/windows/system ... -
数据挖掘数据集
2012-02-18 17:35 946收集数据挖掘过程中用到的数据集。欢迎补充! TREC ... -
分类器的动态选择
2012-02-18 17:15 1057XMU DM一师兄写的动态集成分类器的选择, 内容挺新颖的, ... -
book reading plan
2012-02-09 15:50 710Mining of Massive Datasets ... -
[转]学术论文的标准格式是什么?写论文有哪些小技巧
2012-02-08 21:45 954我有一篇谈研究生开题报告的文章,你可以参考下: ... -
Rapid-I, 一个JAVA的数据挖掘开源平台
2012-01-30 18:29 1015当前主要使用的weka3.6,Hadoop的MapR ... -
Weka分析结果参数解释
2012-01-17 17:20 4237Kappa Statistic 假设有两个相互独立的人分别将 ... -
一淘背后的数据野心
2012-01-05 23:11 1208摘要:马云你能 ... -
多标记(multi-label)学习和Mulan
2011-12-21 20:33 3033概念澄清: ...
相关推荐
KNN(K-Nearest Neighbors)算法是一种监督学习方法,常用于...总之,KNN算法是一种简单而有效的机器学习方法,其核心在于距离计算和最近邻的选取。在实际应用中,需要根据数据特性和任务需求进行适当的调整和优化。
总之,Java实现kNN算法涉及数据预处理、距离计算、最近邻搜索和预测等多个环节。在设计和优化算法时,需要考虑到性能、准确性和适用场景,确保算法在实际应用中的有效性。同时,理解kNN算法背后的理论基础,可以帮助...
它在分类和回归问题中都有应用,尤其在机器学习初学者中非常常见,因为其原理简单,易于理解和实现。 在KNN算法中,"K"是一个关键参数,代表了我们要考虑的最近邻居的数量。当一个新的数据点需要被分类或预测时,...
这个实验项目提供了一个基础的KNN分类器的实现,通过对数据的读取、距离计算、最近邻选择和类别投票,展示了KNN算法的完整流程。通过阅读和理解这段代码,开发者可以更好地掌握KNN算法的原理,并能在此基础上进行...
总之,这个KNN算法的Java实现是一个很好的学习资源,可以帮助初学者理解算法的基本工作原理,并提供了一个实际应用的起点。通过阅读和分析这段代码,你可以深入理解数据挖掘中的分类算法,掌握如何在实际项目中应用...
《KNN算法的Java实现详解》 KNN(K-Nearest Neighbors)算法,即K近邻算法,是机器学习领域中最基础且重要的算法之一。它基于实例的学习,通过寻找训练集中与新样本最接近的K个邻居,依据邻居的类别进行投票,从而...
本项目是基于Java实现的KNN算法,并在UCI(University of California, Irvine)机器学习库的三个数据集上进行了验证和测试。以下是对KNN算法、UCI数据集以及Java实现的详细解析。 **KNN算法详解** KNN算法的基本...
标题中的“mnist手写体的识别采用KNN算法,Java实现”涉及到的是一个计算机视觉领域的经典问题,即使用机器学习方法对MNIST数据集的手写数字进行分类。MNIST数据集是包含手写数字图像的大型数据库,常用于训练各种...
KNN算法原理及应用 KNN算法是数据挖掘分类技术中最简单的方法之一,也叫K最邻近分类算法。其基本思想是:已知一个样本空间里的部分样本分成几个类,然后,给定一个待分类的数据,通过计算找出与自己最接近的K个样本...
在本项目中,我们将探讨如何使用Java...总之,通过Java实现KNN算法并与Access数据库集成,我们可以有效地对电影进行分类。通过不断地调整和优化,这个算法可以在其他领域或更多特征的数据集上展现出强大的预测能力。
本篇文章将深入探讨KNN算法的基本原理、实现步骤以及如何用Java来编写KNN算法。 KNN算法的核心思想是基于实例的学习,即通过找到训练集中与新样本最接近的K个邻居,依据这些邻居的类别进行投票决定新样本的类别。...
标题中的“[免资源分]KNN算法的C、C++、java等实现源码”表明这是一个关于KNN(K-Nearest Neighbors,K最近邻)算法的编程实现集合,涵盖C、C++和Java这三种编程语言。KNN算法是一种基于实例的学习方法,属于监督...
在本篇文档中,将会详细介绍KNN算法的原理、实现细节以及如何用Java语言实现它。 首先,KNN算法的核心思想是基于类比学习。当我们有一条待分类的测试元组时,KNN算法会在训练集中寻找与这条测试元组最相似的K个元组...
在压缩包文件“KNN”中,可能包含了Java实现KNN算法的源代码,初学者可以通过阅读和理解这些代码来深入学习KNN算法的工作原理和实现细节。同时,也可以通过运行代码,使用不同的数据集进行实验,进一步掌握KNN算法在...
1. **KNN算法原理**: KNN算法基于“近朱者赤,近墨者黑”的思想,即一个样本最可能的类别是其最近邻点中最常见的类别。这里的“近”通常用欧氏距离、曼哈顿距离或余弦相似度等度量方式来衡量。K值代表最近邻的数量...
在这个项目中,"KNN.doc"可能是文档形式的教程或代码注释,详细介绍了如何实现和使用Java编写的KNN算法以及在Weka上的应用。通过阅读这份文档,你可以进一步理解KNN的工作原理,以及如何在实际项目中应用和优化这个...
本项目通过Java语言实现了一个简单的KNN算法,帮助初学者理解该算法的基本原理和编程实现。 1. **KNN算法简介** KNN算法基于实例学习,其核心思想是:对于一个未知类别的样本,我们将其分类到与其最近的K个已知...
1. **KNN算法原理**:解释了KNN的基本概念,包括K值的选择、距离度量方法、邻居的选择策略(如使用最近邻或加权最近邻)、处理类别不平衡的方法等。 2. **数据预处理**:KNN算法对数据的质量要求较高,因此可能涉及...
5. **K最近邻(KNN)算法**:KNN算法是一种基于实例的学习方法,它根据“近朱者赤,近墨者黑”的原理,利用距离度量来找出与目标文档最近的K个训练文档,并将目标文档的类别赋予距离最近的多数类别。 6. **Java实现...
**一、KNN算法原理** 1. **距离度量**:KNN算法通常使用欧氏距离、曼哈顿距离或余弦相似度等方法来衡量样本之间的相似性。在本实验中,使用了余弦相似度来计算样本之间的相似性。 2. **选择邻居**:对于待分类样本,...