`
ahuaxuan
  • 浏览: 639651 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

数据挖掘之分类(kNN算法的描述及使用)

阅读更多
/**

*作者:张荣华

*日期:2008-2-23

**/


数据挖掘之分类系列文章

之前说到分类的基本概念以及一个文本分类的实例,原文地址见:http://www.iteye.com/topic/163285 现在我们就来改造之前的分类算法,本文主要介绍KNN算法在文本分类器中的使用。

kNN算法简介:
kNN(k Nearest Neighbors)算法又叫k最临近方法, 总体来说kNN算法是相对比较容易理解的算法之一,假设每一个类包含多个样本数据,而且每个数据都有一个唯一的类标记表示这些样本是属于哪一个分类, kNN就是计算每个样本数据到待分类数据的距离,取和待分类数据最近的k各样本数据,那么这个k个样本数据中哪个类别的样本数据占多数,则待分类数据就属于该类别。

基于kNN算法的思想,我们必须找出使用该算法的突破点,本文的目的是使用kNN算法对文本进行分类,那么和之前的文章一样,关键还是项向量的比较问题,之前的文章中的分类代码仅使用的反余弦来匹配项向量,找到关键的“距离”,那么我们可以试想反余弦之后使用kNN的结果如何。

补充上一篇文章中没有详细讲解的反余弦匹配问题:
Lucene中有一个term vectors这个东东,它表示该词汇单元在文档中出现的次数,比如说这里有两篇文章,这两篇文章中都有hibernate和spring这两个单词,在第一篇文章中hibernate出现了10次,spring出现了20次,第二篇文章中hibernate出现15次,spring出现10次,那么对第一篇文章来说有两个项向量,分别是hibernate:10,spring:20,第二篇文章类似,hibernate:15,spring:10。然后我们就可以在二维空间的x,y组上表示出来,如图:

这样看来我们其实是要得到两者之间的夹角,计算两个向量之间夹角的公式为A*B/||A||*||B||。按照这个原理我们就可以得到新文章和样本文章之间的距离,代码如下,这个份代码在第一篇文章提供的代码下载中。
public double caculateVectorSpace(Map<String, Integer> articleVectorMap, Map<String, Integer> classVectorMap) {
		if (articleVectorMap == null || classVectorMap == null) {
			if (logger.isDebugEnabled()) {
				logger.debug("itemVectorMap or classVectorMap is null");
			}
			
			return 20;
		}
		
		int dotItem = 0;
		double denominatorOne = 0;
		double denominatorTwo = 0;
		
		
		for (Entry<String, Integer> entry : articleVectorMap.entrySet()) {
			String word = entry.getKey();
			double categoryWordFreq = 0;
			double articleWordFreq = 0;
			
			if (classVectorMap.containsKey(word)) {
				categoryWordFreq = classVectorMap.get(word).intValue() / classVectorMap.size();
				articleWordFreq = entry.getValue().intValue() / articleVectorMap.size();
			}
			
			dotItem += categoryWordFreq * articleWordFreq;
			denominatorOne += categoryWordFreq * categoryWordFreq;
			denominatorTwo += articleWordFreq * articleWordFreq;
		}
		
		double denominator = Math.sqrt(denominatorOne) * Math.sqrt(denominatorTwo);
		
		double ratio =  dotItem / denominator;
		
		return Math.acos(ratio);
	}

接着根据kNN的原理,我们记录下待分类数据和样本数据的距离,对每一个待分类数据都找出k个距离最小的样本,最后判断这些样本所在的分类, 这些样本所在的分类就是该新数据应该所在的分类。

那么根据以上的描述,我把结合使用反余弦匹配和kNN结合的过程分成以下几个步骤:
1, 计算出样本数据和待分类数据的距离
2, 为待分类数据选择k个与其距离最小的样本
3, 统计出k个样本中大多数样本所属的分类
4, 这个分类就是待分类数据所属的分类

根据上面的步骤,我写出了以下代码,这些代码都包含在提供下载的代码里,我将不断的扩充这些代码,可以说一下代码是使用kNN比较核心的代码。

MatchCondition这个类包括,待分类数据,样本数据,样本类别,和距离。
protected Map<String, List<MatchCondition>> analyse(Map<String, Map<String, Integer>> articleVectorMap, Map<String, Map<String, Integer>> categoryVectorMap) {
		
		Map<String, List<MatchCondition>> result = new HashMap<String, List<MatchCondition>>();
		
		for (Entry<String, Map<String, Integer>> categoryEntry : categoryVectorMap.entrySet()) {
			
			for (Entry<String, Map<String, Integer>> itemEntry : articleVectorMap.entrySet()) {
				double acos = caculateVector(itemEntry.getValue(), filterVectorMap(categoryEntry.getValue()));
				if (acos < vectorGene) {
					if (result.get(itemEntry.getKey()) != null) {
						List<MatchCondition> list = result.get(itemEntry.getKey());
						
						if (list.size() < kNum) {
							list.add(new MatchCondition(itemEntry.getKey(), categoryEntry.getKey(), acos));
						} else {
							if (list.size() == kNum) {
								Collections.sort(list, new MatchConditionComparator());
							}
							
							int n = 0;
							for (MatchCondition condition : list) {
								if (acos < condition.getAcos()) {
									list.set(n, new MatchCondition(itemEntry.getKey(), categoryEntry.getKey(), acos));
								}
								n++;
							}
						}
					} else {
						List<MatchCondition> list = new LinkedList<MatchCondition>();
						list.add(new MatchCondition(itemEntry.getKey(), categoryEntry.getKey(), acos));
						result.put(itemEntry.getKey(), list);
					}
					
				}
			}
			
		}
		
		return result;
	}


所有的代码在本文提供的下载代码中,以第一篇文章中的测试数据运行测试,所得的结果为:
2008-02-23 14:04:15,646 DEBUG ArticleKNNClassifierImpl:81 - ---------------- The article id is 3
2008-02-23 14:04:15,646 DEBUG ArticleKNNClassifierImpl:83 - categoryId : a | count : 1
2008-02-23 14:04:15,646 DEBUG ArticleKNNClassifierImpl:81 - ---------------- The article id is 2
2008-02-23 14:04:15,646 DEBUG ArticleKNNClassifierImpl:83 - categoryId : b | count : 2
2008-02-23 14:04:15,646 DEBUG ArticleKNNClassifierImpl:83 - categoryId : a | count : 3
2008-02-23 14:04:15,656 DEBUG ArticleKNNClassifierImpl:81 - ---------------- The article id is 1
2008-02-23 14:04:15,656 DEBUG ArticleKNNClassifierImpl:83 - categoryId : b | count : 1
2008-02-23 14:04:15,656 DEBUG ArticleKNNClassifierImpl:83 - categoryId : a | count : 4
2008-02-23 14:04:15,656 DEBUG ArticleKNNClassifierImpl:81 - ---------------- The article id is 5
2008-02-23 14:04:15,656 DEBUG ArticleKNNClassifierImpl:83 - categoryId : b | count : 1
2008-02-23 14:04:15,656 DEBUG ArticleKNNClassifierImpl:83 - categoryId : a | count : 4
2008-02-23 14:04:15,656 DEBUG ArticleKNNClassifierImpl:81 - ---------------- The article id is 4
2008-02-23 14:04:15,656 DEBUG ArticleKNNClassifierImpl:83 - categoryId : b | count : 3
2008-02-23 14:04:15,656 DEBUG ArticleKNNClassifierImpl:83 - categoryId : a | count : 2
从这里我们可以看出articleId为2的应该属于a分类,articleId为1的也属于a分类,articleId为5的也属于a分类,articleId为4的属于b分类。当然其实我们的样本数量太少了,并不能说明acos+knn结合的的效果。

也有人提出了一种结合kNN分类器的加权特征提取问题,该分类通过每次的分类结果不断的调整权值,具有较好的分类效果。所以说虽然kNN算法比较简单,但是事实上如果使用正确,应该也可以收到不错的效果。

下一篇关于数据挖掘的文章还是分类问题,不过会使用另外一个算法,就是朴素贝叶斯分类。当然也希望有大家能够在这里交流一下自己的经验。


  • 大小: 18.3 KB
分享到:
评论
3 楼 AngelAndAngel 2012-02-23  
你的那个图有问题吧,应该标识文章一 文章二 而不是hibernate spring?
2 楼 yetchen 2008-10-27  
请问lz,数据挖掘的算法在企业应用中是否有用武之地呢?
1 楼 gcgmh 2008-10-27  
如何能下载到你的代码啊?你说提供下载,我找不到下载链接啊!

相关推荐

    python数据挖掘之KNN算法

    Python数据挖掘领域中,KNN(K-Nearest ...总的来说,KNN算法是数据挖掘中的基础工具,通过MATLAB或其他编程语言实现,可以有效地处理分类问题。然而,要注意其在大数据场景下的性能瓶颈,以及对模型参数的合理选择。

    基于CUDA的数据挖掘KNN算法的改进.pdf

    在探讨基于CUDA的数据挖掘KNN算法的改进之前,有必要了解KNN算法及其相关背景。KNN,即K-Nearest Neighbor(K近邻)算法,是一种基本的分类与回归方法。KNN算法的核心思想是通过一个数据点附近的K个最近的数据点来...

    KNN算法原理及应用.pdf

    KNN算法是数据挖掘分类技术中最简单的方法之一,也叫K最邻近分类算法。其基本思想是:已知一个样本空间里的部分样本分成几个类,然后,给定一个待分类的数据,通过计算找出与自己最接近的K个样本,由这K个样本投票...

    数据挖掘经典算法

    以下是一些在标题和描述中提到的经典数据挖掘算法的详细说明: 1. C4.5:C4.5是ID3算法的升级版,由Ross Quinlan开发,主要用于决策树的构建。它通过信息增益和信息增益率来选择最佳属性进行划分,可以处理连续和...

    KNN算法原理及应用.docx

    KNN(K-Nearest Neighbors)算法是数据挖掘分类技术中最简单的方法之一。该算法的主要思想是通过计算待分类数据与已知样本之间的距离,找到与其最相似的 K 个样本,然后根据这 K 个样本的类别来确定待分类数据的类别...

    基于云计算平台的分布式KNN分类算法的设计与实施.pdf

    本文提出了一种基于云计算平台的分布式KNN分类算法,旨在解决传统KNN算法无法处理大规模数据的问题。该算法基于Hadoop分布式计算平台的MapReduce框架,能够高效地处理海量规模的数据。 分布式KNN分类算法 KNN(K-...

    数据分析实战 - KNN算法-病例自动诊断分析

    我们的目标是利用这些数据,通过KNN算法进行病例的自动分类。 在数据读入阶段,我们使用Python的pandas库读取CSV文件,创建DataFrame对象。接着,对数据进行理解,这包括对数据框的初步探索,如使用`describe()`...

    sjwj_knn_KNN数据_数据挖掘_

    总的来说,KNN算法在数据挖掘中的应用是多方面的,特别是在分类问题上。通过对泰坦尼克数据集的分析,我们可以了解KNN的工作原理,同时掌握如何在实际项目中运用这种算法。这个过程涵盖了数据预处理、模型训练、参数...

    数据挖掘wine数据集分类实验报告及代码

    在这个“数据挖掘wine数据集分类实验报告及代码”中,我们重点探讨了如何利用两种常见的分类算法——逻辑回归和贝叶斯算法,来对wine数据集进行分析。 1. **wine数据集**:这是一个经典的数据挖掘样本集,源自UCI ...

    机器学习十大算法:kNN.pdf

    kNN算法是一种简单且有效的分类算法,广泛应用于机器学习和数据挖掘领域。然而,kNN算法也存在一些问题,例如Curse of Dimensionality和Noise and Outliers等。因此,在实际应用中,需要根据具体情况选择合适的k值,...

    大工20秋《数据挖掘》大作业题目及要求.pdf

    KNN算法是数据挖掘中的一种基本分类算法,它的核心思想是通过寻找样本的最近邻来决定其分类。对于一个新的样本点,KNN算法会找到其在特征空间中最近的K个邻居,然后根据这K个邻居的类别分布来决定新样本的类别。这种...

    数据挖掘原理与算法04分类方法.ppt

    数据挖掘原理与算法04分类方法 数据挖掘中的分类方法是指根据给定...分类方法是数据挖掘中的重要任务之一,选择合适的分类算法是分类方法的关键。不同的分类算法有其优缺点,选择合适的分类算法可以提高分类的准确率。

    数据挖掘算法介绍.ppt

    数据挖掘算法可以分为两大类:描述性数据挖掘算法和预测性数据挖掘算法。描述性数据挖掘算法的目的是要描述数据的分布和特征,而预测性数据挖掘算法的目的是要预测未来的事件或结果。 在数据挖掘算法中,聚类算法是...

    常用数据挖掘算法总结及Python实现

    标题和描述中提到的知识点涵盖了数据挖掘领域常用算法的理论基础和在Python中的实际应用。在继续详细阐述之前,需明确数据挖掘是一门交叉学科,它结合了统计学、机器学习、数据库技术、模式识别等多个领域的方法和...

    数据挖掘经典算法大全.pdf

    在《数据挖掘经典算法大全》中,提到了几种重要的数据挖掘算法,这些算法在解决实际问题时扮演着关键角色。 1. **逻辑回归**(Logistic Regression):这是一种分类算法,通常用于二分类问题,通过构建一个 ...

    code_贝叶斯算法_KNN分类_

    KNN算法是一种非参数监督学习方法,其原理是通过寻找训练集中与新样本最接近的K个邻居(K个最近的样本),并根据这K个样本的类别进行投票来决定新样本的类别。K的选择对结果有重要影响,较小的K值可能导致过拟合,较...

    常用数据挖掘算法总结及Python实现(含标签)

    #### 案例四 KNN算法实现葡萄酒价格模型预测及交叉验证 本案例将通过KNN算法对葡萄酒的价格进行预测,并采用交叉验证的方法来评估模型的泛化能力。 综上所述,本文档涵盖了从数据挖掘的基础知识到具体算法的Python...

Global site tag (gtag.js) - Google Analytics