(完整版)KNN算法实验报告
- 格式:docx
- 大小:17.87 KB
- 文档页数:10
KNN算法不仅可以用于分类,还可以用于回归。通过找出一个样 本的k个最近邻居, 将这些邻居的属性的平均值赋给该样本, 就可以 得到该样本的属性。 更有用的方法是将不同距离的邻居对该样本产生 的影响给予不同的权值(weight),如权值与距离成正比。
该算法在分类时有个主要的不足是, 当样本不平衡时, 如一个类 的样本容量很大, 而其他类样本容量很小时, 有可能导致当输入一个 新样本时,该样本的K个邻居中大容量类的样本占多数。 该算法只计 算“最近的”邻居样本, 某一类的样本数量很大, 那么或者这类样本 并不接近目标样本,或者这类样本很靠近目标样本。无论怎-NearestNeighbor,KNN分类算法,是一个理论上比 较成熟的方法,也是最简单的机器学习算法之一。
该方法的思路是:如果一个样本在特征空间中的k个最相似(即 特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也 属于这个类别。KNN算法中,所选择的邻居都是已经正确分类的对象。 该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决 定待分样本所属的类别。KNN方法虽然从原理上也依赖于极限定理, 但在类别决策时,只与极少量的相邻样本有关。由于KNN方法主要靠 周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别 的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较
3
KNN
1.
2.
3.
4.
4
//KNN.java
package cqu.KNN;
import java.util.ArrayList;
import parator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
缺点:
(1)在大训练集寻找最近邻的时间是难以忍受的。
(2) 在训练数据集中要求的观测值的数目, 随着维数p的增长以 指数方式增长。这是因为和最近邻的期望距离随着维数p的增多而急 剧上升,除非训练数据集的大小随着p以指数方式增长。这种现象被 称为“维数灾难 ”。
解决办法有下面几个:
(1)通过降维技术来减少维数,如主成分分析,因子分析,变 量选择(因子选择)从而减少计算距离的时间;
{
public int compare(KNNNode o1, KNNNode o2)
{
if (o1.getDistance()>=o2.getDistance())
{
return-1;
}
else
{
return1;
}
}
};
/** *获取K个不同的随机数*@param k随机数的个数 范围*@return生成的随机数数组*/
import java.util.PriorityQueue;
//KNN算法主体类
public class KNN
{
/** *设置优先级队列的比较函数,距离越大,优先级越高*/
private Comparator<KNNNode> comparator=new Comparator<KNNNode>()
if (!rand.contains(temp))
{
rand.add(temp);
}
else
{
i--;
}
}
return rand;
}
/** *计算测试元组与训练元组之前的距离*@param d1组*@return距离值*/
public double calDistance(List<Double> d1, List<Double> d2)
第一步:将数据集分为训练集(DTrn)和测试集(DTES)。
第二步:在测试集给定一个实例Xq;在训练集(DTrn)中找到与 这个实例Xq的K-最近邻子集{X1、、XK},即:DKNN。 第三步:计算这K-最近邻子集得目标值,经过加权平均:Af(Xq)=(f(X1)+…+f(XK))/k作为f(Xq)的近似估计。改进的地方:对kNN算法的一个明显的改进是对k个最近邻的贡献加权,将较大的 权值赋给较近的近邻,相应的算法称为距离加权kNN回归算法,则 公式1则修改为:%Xq)=(w1*f(X1)+…+wk*f(XK))/(w1+...wk)—般地 距离权值wi和距离成反比关系,例如,wi近似=1/d(xq;xi).K值的选 择:需要消除K值过低,预测目标容易产生变动性,同时高k值时, 预测目标有过平滑现象。 推定k值的有益途径是通过有效参数的数目 这个概念。有效参数的数目是和k值相关的,大致等于n/k,其中,n是这个训练数据集中实例的数目。
2
那么根据以上的描述,我把结合使用反余弦匹配和kNN结合的 过程分成以下几个步骤:1.计算出样本数据和待分类数据的距离2.为待分类数据选择k个与其距离最小的样本3.统计出k个样本中大多数样本所属的分类4.这个分类就是待分类数据所属的分类
数学表达:目标函数值可以是离散值(分类问题),也可以是连续 值(回归问题).函数形势为f:n维空间R—〉一维空间R。
并不能影响运行结果。 可以采用权值的方法 (和该样本距离小的邻居 权值大)来改进。 该方法的另一个不足之处是计算量较大,因为对每 一个待分类的文本都要计算它到全体已知样本的距离, 才能求得它的K个最近邻点。目前常用的解决方法是事先对已知样本点进行剪辑, 事先去除对分类作用不大的样本。 该算法比较适用于样本容量比较大 的类域的自动分类, 而那些样本容量较小的类域采用这种算法比较容 易产生误分。
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);
(2)用复杂的数据结构,如搜索树去加速最近邻的确定。这个 方法经常通过公式2公式1设定“几乎是最近邻 ”的目标去提高搜索速 度;
(3)编辑训练数据去减少在训练集中的冗余和几乎是冗余的点, 从而加速搜索最近邻。 在个别例子中去掉在训练数据集中的一些观察
点,对分类效果没有影响, 原因是这些点被包围属于同类的观测点中