knn算法java代码 java knn算法-成都快上网建站

knn算法java代码 java knn算法

K-近邻算法简介

1.K-近邻(KNearestNeighbor,KNN)算法简介 :对于一个未知的样本,我们可以根据离它最近的k个样本的类别来判断它的类别。

成都创新互联公司是一家专注于成都网站设计、网站制作与策划设计,无锡网站建设哪家好?成都创新互联公司做网站,专注于网站建设十载,网设计领域的专业建站公司;建站业务涵盖:无锡等地区。无锡做网站价格咨询:18982081108

以下图为例,对于一个未知样本绿色小圆,我们可以选取离它最近的3的样本,其中包含了2个红色三角形,1个蓝色正方形,那么世喊我们可以判断绿色小圆属于红色三角形这一类。

我们也可以选取离它最近的5个样本,其中包含了3个蓝色正方形,2个红色三角形,那么我们可以判断绿色小圆属于蓝色正方形这一类。

3.API文档

下面我们来对KNN算法中的参数项做一个解释说明:

'n_neighbors':选取的参考对象的个数(邻居个数),默认值为5,也可以自己指定数值,但不是n_neighbors的值越大分类效果越好,最佳值需要我们做一个验证。

'weights': 距离的权重参数,默认uniform。

'uniform': 均匀的权重,所有的点在每一个类别中的权重是一样的。简单的说,就是每个点的重要性都是一样的。

'distance':权重与距离的倒数成正比,距离近的点重要性更高,对于结果的影响也更大。

'algorithm':运算方法,默认auto。

'auto':根绝模型fit的数据自动选择最合适的运算方法。

'ball_tree':树模型算法BallTree

'kd_tree':树模型算法KDTree

'brute':暴力算法

'leaf_size':叶子的尺寸,默认30。只有当algorithm = 'ball_tree' or 'kd_tree',这个参数需要设定。

'p':闵可斯基距离,当p = 1时,选择曼哈顿距离;当p = 2时,选择欧式距离。

n_jobs:使用计算机处理器数目,默认为1。当n=-1时,使用所有的处理器进行运算。

4.应用案例演示

下面以Sklearn库中自带的数据集--手写数字识别数据集为例,来测试下kNN算法。上一章,我们简单的介绍了机器学习的一般步骤:加载数据集 - 训练模型 - 结果预测 - 保存模型。这一章我们还是按照这个步骤来执行。

[手搜笑野写数字识别数据集]

5.模型的方法

每一种模型都有一些它独有的属性方法(模型的技能,能做些什么事),下面我们来了解下knn算法常用的的属性方法。

6.knn算法的优缺点

优点:

简单,效果还不错,升拦适合多分类问题

缺点:

效率低(因为要计算预测样本距离每个样本点的距离,然后排序),效率会随着样本量的增加而降低。

用kNN算法诊断乳腺癌

乳腺癌数据包括569例细胞活检案例,每个案例有32个特征。

第一个特征是识别号码,

第二个特征是癌症诊断结果(癌症诊断结果用编码“M”表示恶性,用编码“B”表示良性),

其他30个特征是数值型的实验室测量结果。(其他30个数值型测量结果由数字化细胞核的10个不同特征的均值、标准差和最差值(即最大值)构成)。这些特征包括:

Radius(半径)、Texture(质地)、Perimeter(周长)、Area(面积)、Smoothness(光滑度)、Compactness(致密性)、Concavity(凹度)、Concave points(凹点)、Symmetry(对称性)、Fractal dimension(分形维数)

最终的数据为:

可以得到有357个为良性,有212个为恶性 因为id列没有意义,去掉id列

并将目标属性编码因子化B良性M恶性

并计算各自占比

round四舍五入round(x,digits=n)

prop.table得到边缘概率prop.table(x,margin=null)

通过summary详细地观察3个特征:可以看出不同特征的度量值差别大

kNN的距离计算在很大程度上依赖于输入特征的测量尺度。由于光滑度的范围是0.05~0.16,且面积的范围是143.5~2501.0,所以在距离计算中,面积的影响比光滑度的影响大很多,这可能潜在地导致我们的分类器出现问题,所以我们应用min-max标准化亩配卜方法将特征值重新调整到一个标准范围内,对数据通过归一化来进行无量纲处理

即显然数据需要转换,转换函数为:

我们并不需要对这30个数值变量逐个进行min-max标准化,这里可以使用R中的一个函数来自动完成此过程

lapply()函数接受一个列表作为输入参数,然后把一个具体函数应用到每一个列表元素。因为数据框是一个含有等长度向卖液量的列表,所以我们可以使用lapply()函数将normalize()函数应用到数据框中的每一个特征。最后一个步骤是,应用函数as.data.frame()把lapply()返回的列表转换成一个数据框迅穗。过程如下所示:

这里使用的后缀_n是一个提示,即wdbc中的值已经被min-max标准化了。

为了确认转换是否正确应用,让我们来看看其中一个变量的汇总统计量:

正如预期的那样,area_mean变量的原始范围是143.5~2501.0,而现在的范围是0~1。

接下来需要切分数据集,实际需要构造training、validation、test,其中validation用来校正提高模型准确性,为简单起见,我们只用train和test

第一种方法:由于我们没有新病人的数据,所以使用前469条记录作为训练数据集,剩下的100条记录用来模拟新的病人

第二种方法:如果样本中的恶性肿瘤大部分分布在1,则将469作为训练集就有很大问题,此时采用随机取样

第三种方法:直接利用"caret"包中的crateDataPartition函数可自动分区

构建模型,class包中的knn函数,由于训练数据集含有469个实例,所以我们可能尝试k = 21,它是一个大约等于469的平方根的奇数。根据二分类的结果,使用奇数将消除各个类票数相等这一情况发生的可能性。

函数knn()返回一个因子向量,为测试数据集中的每一个案例返回一个预测标签,我们将该因子向量命名为wdbc_test_pred。

现在,我们可以使用knn()函数对测试数据进行分类:

该过程的下一步就是评估wdbc_test_pred向量中预测的分类与wdbc_test_labels向量中已知值的匹配程度如何。为了做到这一点,我们可以使用gmodels添加包中的CrossTable()函数,它在第2章中介绍过。如果你还没有安装该添加包,可以使用install.packages("gmodels")命令进行安装。

在使用library(gmodels)命令载入该添加包后,可以创建一个用来标识两个向量之间一致性的交叉表。指定参数prop.chisq = FALSE,将从输出中去除不需要的卡方(chi-square)值,如下所示:

行为真实结果,列为预测结果,对角框的数字越小,模型越好

选取两个变量作为横纵坐标进行画图,观察实际类别与预测的分类结果。

颜色代表分类后得到的结果,形状代表真实的类别。从检测结果和图上都可以看出,分类结果基本与真实结果一致。

KNN算法,结果报错,帮忙怎么改

knn算法(k-Nearest Neighbor algorithm).是一种经典的分类算法.

注意,不是聚码蚂类算法.所以这种分类算法必然包括了训练过程.

然而和一般性的分类算法不同,knn算法是一种 懒惰算法 .它并非

像其他的分类算法先通过训练建立分类模型.,而是一种被动的分类

过程.它是逗帆边测试边训山模雹练建立分类模型.

算法的一般描述过程如下:

1.首先计算每个测试样本点到其他每个点的距离.

这个距离可以是欧氏距离,余弦距离等.


文章标题:knn算法java代码 java knn算法
文章URL:http://kswjz.com/article/dsppcej.html
扫二维码与项目经理沟通

我们在微信上24小时期待你的声音

解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流