R语言-KNN算法

Python013

R语言-KNN算法,第1张

1、K最近邻(k-NearestNeighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。

2、KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。 KNN方法虽然从原理上也依赖于极限定理,但在类别决策时,只与极少量的相邻样本有关。由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合。

3、KNN算法不仅可以用于分类,还可以用于回归。通过找出一个样本的k个最近邻居,将这些邻居的属性的平均值赋给该样本,就可以得到该样本的属性。更有用的方法是将不同距离的邻居对该样本产生的影响给予不同的权值(weight),如权值与距离成正比。

简言之,就是将未标记的案例归类为与它们最近相似的、带有标记的案例所在的类 。

原理及举例

工作原理:我们知道样本集中每一个数据与所属分类的对应关系,输入没有标签的新数据后,将新数据与训练集的数据对应特征进行比较,找出“距离”最近的k(通常k<20)数据,选择这k个数据中出现最多的分类作为新数据的分类。

算法描述

1、计算已知数据集中的点与当前点的距离

2、按距离递增次序排序

3、选取与当前数据点距离最近的K个点

4、确定前K个点所在类别出现的频率

5、返回频率最高的类别作为当前类别的预测

距离计算方法有"euclidean"(欧氏距离),”minkowski”(明科夫斯基距离), "maximum"(切比雪夫距离), "manhattan"(绝对值距离),"canberra"(兰式距离), 或 "minkowski"(马氏距离)等

Usage

knn(train, test, cl, k = 1, l = 0, prob =FALSE, use.all = TRUE)

Arguments

train

matrix or data frame of training set cases.

test

matrix or data frame of test set cases. A vector will  be interpreted as a row vector for a single case.

cl

factor of true classifications of training set

k

number of neighbours considered.

l

minimum vote for definite decision, otherwisedoubt. (More precisely, less thank-ldissenting votes are allowed, even

ifkis  increased by ties.)

prob

If this is true, the proportion of the votes for the

winning class are returned as attributeprob.

use.all

controls handling of ties. If true, all distances equal

to thekth largest are

included. If false, a random selection of distances equal to thekth is chosen to use exactlykneighbours.

kknn(formula = formula(train), train, test, na.action = na.omit(), k = 7, distance = 2, kernel = "optimal", ykernel = NULL, scale=TRUE, contrasts = c('unordered' = "contr.dummy", ordered = "contr.ordinal"))

参数:

formula                            A formula object.

train                                 Matrix or data frame of training set cases.

test                                   Matrix or data frame of test set cases.

na.action                         A function which indicates what should happen when the data contain ’NA’s.

k                                       Number of neighbors considered.

distance                          Parameter of Minkowski distance.

kernel                              Kernel to use. Possible choices are "rectangular" (which is standard unweighted knn), "triangular", "epanechnikov" (or beta(2,2)), "biweight" (or beta(3,3)), "triweight" (or beta(4,4)), "cos", "inv", "gaussian", "rank" and "optimal".

ykernel                            Window width of an y-kernel, especially for prediction of ordinal classes.

scale                                Logical, scale variable to have equal sd.

contrasts                         A vector containing the ’unordered’ and ’ordered’ contrasts to use

kknn的返回值如下:

fitted.values              Vector of predictions.

CL                              Matrix of classes of the k nearest neighbors.

W                                Matrix of weights of the k nearest neighbors.

D                                 Matrix of distances of the k nearest neighbors.

C                                 Matrix of indices of the k nearest neighbors.

prob                            Matrix of predicted class probabilities.

response                   Type of response variable, one of continuous, nominal or ordinal.

distance                     Parameter of Minkowski distance.

call                              The matched call.

terms                          The ’terms’ object used.

iris%>%ggvis(~Length,~Sepal.Width,fill=~Species)

library(kknn)

data(iris)

dim(iris)

m<-(dim(iris))[1]

val<-sample(1:m,size=round(m/3),replace=FALSE,prob=rep(1/m,m))

建立训练数据集

data.train<-iris[-val,]

建立测试数据集

data.test<-iris[val,]

调用kknn  之前首先定义公式

formula : Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width

iris.kknn<-kknn(Species~.,iris.train,iris.test,distance=1,kernel="triangular")

summary(iris.kknn)

# 获取fitted.values

fit <- fitted(iris.kknn)

# 建立表格检验判类准确性

table(iris.valid$Species, fit)

# 绘画散点图,k-nearest neighbor用红色高亮显示

pcol <- as.character(as.numeric(iris.valid$Species))

pairs(iris.valid[1:4], pch = pcol, col = c("green3", "red")[(iris.valid$Species != fit)+1]

二、R语言knn算法

install.packages("class")

library(class)

对于新的测试样例基于距离相似度的法则,确定其K个最近的邻居,在K个邻居中少数服从多数

确定新测试样例的类别

1、获得数据

2、理解数据

对数据进行探索性分析,散点图

如上例

3、确定问题类型,分类数据分析

4、机器学习算法knn

5、数据处理,归一化数据处理

normalize <- function(x){

num <- x - min(x)

denom <- max(x) - min(x)

return(num/denom)

}

iris_norm <-as.data.frame(lapply(iris[,1:4], normalize))

summary(iris_norm)

6、训练集与测试集选取

一般按照3:1的比例选取

方法一、set.seed(1234)

ind <- sample(2,nrow(iris), replace=TRUE, prob=c(0.67, 0.33))

iris_train <-iris[ind==1, 1:4]

iris_test <-iris[ind==2, 1:4]

train_label <-iris[ind==1, 5]

test_label <-iris[ind==2, 5]

方法二、

ind<-sample(1:150,50)

iris_train<-iris[-ind,]

iris_test<-iris[ind,1:4]

iris_train<-iris[-ind,1:4]

train_label<-iris[-ind,5]

test_label<-iris[ind,5]

7、构建KNN模型

iris_pred<-knn(train=iris_train,test=iris_test,cl=train_label,k=3)

8、模型评价

交叉列联表法

table(test_label,iris_pred)

实例二

数据集

http://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/wdbc.data

导入数据

dir <-'http://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/wdbc.data'wdbc.data <-read.csv(dir,header = F)

names(wdbc.data) <- c('ID','Diagnosis','radius_mean','texture_mean','perimeter_mean','area_mean','smoothness_mean','compactness_mean','concavity_mean','concave points_mean','symmetry_mean','fractal dimension_mean','radius_sd','texture_sd','perimeter_sd','area_sd','smoothness_sd','compactness_sd','concavity_sd','concave points_sd','symmetry_sd','fractal dimension_sd','radius_max_mean','texture_max_mean','perimeter_max_mean','area_max_mean','smoothness_max_mean','compactness_max_mean','concavity_max_mean','concave points_max_mean','symmetry_max_mean','fractal dimension_max_mean')

table(wdbc.data$Diagnosis)## M = malignant, B = benign

wdbc.data$Diagnosis <- factor(wdbc.data$Diagnosis,levels =c('B','M'),labels = c(B ='benign',M ='malignant'))

变量课归结为名义型、有序型或连续型变量

名义型变量是美哟顺序之分的类别变量。有序型变量表示一种顺序关系,而非数量关系。连续型变量可以呈现为某个范围内的任意值,并同事表示了顺序和数量。

类别(名义型)变量和有序类别(有序型)变量在R中称为因子(factor)。因子决定了数据的分析方式以及如何进行诗句呈现。

函数(factor)以一个整数向量的形式存储类别值,整数的取值范围是[1...k](其中k是名义型变量中唯一值的个数)同时一个由字符串(原始值)组成的内部向量将映射到这些整数上。

要表示有序型变量,需要为函数factor()指定参数order=TRUE。

对于字符型向量,因子的水平默认依字母顺序创建。但按字母顺粗排序的因子很少能让人满意,可通过指定levels选项来默认覆盖默认排序。

数值型变量可以用levels和lables参数来编码成因子。

首先,以向量形式输入数据,然后将diabetes和status分别制定为普通因子和有序型因子。最后,将数据合并为一个数据框。函数str(object)可提供R中某个对象的信息,它清楚的显示diabetes是一个因子,而status是一个有序型因子,以及此数据框在内部是如何进行编码的。

函数summary()会区别对待各个变量,它显示了连续性变量age的最小值、最大值、均值和各四分位数【四分位数(Quartile)也称四分位点,是指在统计学中把所有数值由小到大排列并分成四等份,处于三个分割点位置的数值。多应用于统计学中的箱线图绘制。它是一组数据排序后处于25%和75%位置上的值。四分位数是通过3个点将全部数据等分为4部分,其中每部分包含25%的数据。很显然,中间的四分位数就是中位数,因此通常所说的四分位数是指处在25%位置上的数值(称为下四分位数)和处在75%位置上的数值(称为上四分位数)。与中位数的计算方法类似,根据未分组数据计算四分位数时,首先对数据进行排序,然后确定四分位数所在的位置,该位置上的数值就是四分位数。与中位数不同的是,四分位数位置的确定方法有几种,每种方法得到的结果会有一定差异,但差异不会很大,该解释来源于百度百科】,并显示了类别型变量diabetes和status的频数值。

主成分分析

成分分析((Principal Component Analysis,PCA)是一种数据降维技巧,它能将大量相关变量转化为一组很少的不相关变量,这些无关变量称为主成分(原来变量的线性组合)。整体思想就是化繁为简,抓住问题关键,也就是降维思想。

主成分分析法是通过恰当的数学变换,使新变量——主成分成为原变量的线性组合,并选取少数几个在变差总信息量中比例较大的主成分来分析事物的一种方法。主成分在变差信息量中的比例越大,它在综合评价中的作用就越大。

因子分析

探索性因子分析法(Exploratory Factor Analysis,EFA)是一系列用来发现一组变量的潜在结构的方法。它通过寻找一组更小的、潜在的或隐藏的结构来解释已观测到的、显式的变量间的关系。

PCA与EFA模型间的区别

参见图14-1。主成分(PC1和PC2)是观测变量(X1到X5)的线性组合。形成线性组合的权重都是通过最大化各主成分所解释的方差来获得,同时还要保证个主成分间不相关。相反,因子(F1和F2)被当做是观测变量的结构基础或“原因”,而不是它们的线性组合。

R的基础安装包提供了PCA和EFA的函数,分别为princomp()和factanal()。

最常见的分析步骤

(1)数据预处理。PCA和EFA都根据观测变量间的相关性来推导结果。用户可以输入原始数据矩阵或者相关系数矩阵到principal()和fa()函数中。若输入初始数据,相关系数矩阵将会被自动计算,在计算前请确保数据中没有缺失值。

(2)选择因子模型。判断是PCA(数据降维)还是EFA(发现潜在结构)更符合你的研究目标。如果选择EFA方法,你还需要选择一种估计因子模型的方法(如最大似然估计)。

(3)判断要选择的主成分/因子数目。

(4)选择主成分/因子。

(5)旋转主成分/因子。

(6)解释结果。

(7)计算主成分或因子得分。

PCA的目标是用一组较少的不相关变量代替大量相关变量,同时尽可能保留初始变量的信息,这些推导所得的变量称为主成分,它们是观测变量的线性组合。如第一主成分为:

它是k个观测变量的加权组合,对初始变量集的方差解释性最大。第二主成分也是初始变量的线性组合,对方差的解释性排第二,同时与第一主成分正交(不相关)。后面每一个主成分都最大化它对方差的解释程度,同时与之前所有的主成分都正交。理论上来说,你可以选取与变量数相同的主成分,但从实用的角度来看,我们都希望能用较少的主成分来近似全变量集。

主成分与原始变量之间的关系

(1)主成分保留了原始变量绝大多数信息。

(2)主成分的个数大大少于原始变量的数目。

(3)各个主成分之间互不相关。

(4)每个主成分都是原始变量的线性组合。

数据集USJudgeRatings包含了律师对美国高等法院法官的评分。数据框包含43个观测,12个变量。

用来判断PCA中需要多少个主成分的准则:

根据先验经验和理论知识判断主成分数;

根据要解释变量方差的积累值的阈值来判断需要的主成分数;

通过检查变量间k × k的相关系数矩阵来判断保留的主成分数。

最常见的是基于特征值的方法。每个主成分都与相关系数矩阵的特征值相关联,第一主成分与最大的特征值相关联,第二主成分与第二大的特征值相关联,依此类推。

Kaiser-Harris准则建议保留特征值大于1的主成分,特征值小于1的成分所解释的方差比包含在单个变量中的方差更少。Cattell碎石检验则绘制了特征值与主成分数的图形。这类图形可以清晰地展示图形弯曲状况,在图形变化最大处之上的主成分都可保留。最后,你还可以进行模拟,依据与初始矩阵相同大小的随机数据矩阵来判断要提取的特征值。若基于真实数据的某个特征值大于一组随机数据矩阵相应的平均特征值,那么该主成分可以保留。该方法称作平行分析。

图形解读:线段和x符号组成的图(蓝色线):特征值曲线;

红色虚线:根据100个随机数据矩阵推导出来的平均特征值曲线;

绿色实线:特征值准则线(即:y=1的水平线)

判别标准:特征值大于平均特征值,且大于y=1的特征值准则线,被认为是可保留的主成分。根据判别标准,保留1个主成分即可。

fa.parallel函数学习

fa.parallel(data,n.obs=,fa=”pc”/”both”,n.iter=100,show.legend=T/F)

data:原始数据数据框;

n.obs:当data是相关系数矩阵时,给出原始数据(非原始变量)个数,data是原始数据矩阵时忽略此参数;

fa:“pc”为仅计算主成分,“fa”为因子分析,“both”为计算主成分及因子;

n.iter:模拟平行分析次数;

show.legend:显示图例。

principal(r, nfactors = , rotate = , scores = )

r:相关系数矩阵或原始数据矩阵;

nfactors:设定主成分数(默认为1);

rotate:指定旋转的方法,默认最大方差旋转(varimax)。

scores:设定是否需要计算主成分得分(默认不需要)。

PC1栏包含了成分载荷,指观测变量与主成分的相关系数。如果提取不止一个主成分,那么还将会有PC2、PC3等栏。成分载荷(component loadings)可用来解释主成分的含义,解释主成分与各变量的相关程度。

h2栏为成分公因子方差,即主成分对每个变量的方差解释度。

u2栏为成分唯一性,即方差无法被主成分解释的部分(1-h2)。

SS loadings包含了与主成分相关联的特征值,其含义是与特定主成分相关联的标准化后的方差值,即可以通过它来看90%的方差可以被多少个成分解释,从而选出主成分(即可使用nfactors=原始变量个数来把所有特征值查出,当然也可以直接通过eigen函数对它的相关矩阵进行查特征值)。

Proportion Var表示每个主成分对整个数据集的解释程度。

Cumulative Var表示各主成分解释程度之和。

Proportion Explained及Cumulative Proportion分别为按现有总解释方差百分比划分主成分及其累积百分比。

结果解读:第一主成分(PC1)与每个变量都高度相关,也就是说,它是一个可用来进行一般性评价的维度。ORAL变量99.1%的方差都可以被PC1来解释,仅仅有0.91%的方差不能被PC1解释。第一主成分解释了11个变量92%的方差。

结果解读:通过碎石图可以判定选择的主成分个数为2个。

结果解读:从结果Proportion Var: 0.58和0.22可以判定,第一主成分解释了身体测量指标58%的方差,而第二主成分解释了22%,两者总共解释了81%的方差。对于高度变量,两者则共解释了其88%的方差。

旋转是一系列将成分载荷阵变得更容易解释的数学方法,它们尽可能地对成分去噪。旋转方法有两种:使选择的成分保持不相关(正交旋转),和让它们变得相关(斜交旋转)。旋转方法也会依据去噪定义的不同而不同。最流行的正交旋转是方差极大旋转,它试图对载荷阵的列进行去噪,使得每个成分只是由一组有限的变量来解释(即载荷阵每列只有少数几个很大的载荷,其他都是很小的载荷)。 结果列表中列的名字都从PC变成了RC,以表示成分被旋转。

当scores = TRUE时,主成分得分存储在principal()函数返回对象的scores元素中。

如果你的目标是寻求可解释观测变量的潜在隐含变量,可使用因子分析。

EFA的目标是通过发掘隐藏在数据下的一组较少的、更为基本的无法观测的变量,来解释一

组可观测变量的相关性。这些虚拟的、无法观测的变量称作因子。(每个因子被认为可解释多个

观测变量间共有的方差,因此准确来说,它们应该称作公共因子。)

其中 是第i个可观测变量(i = 1…k), 是公共因子(j = 1…p),并且p<k。 是 变量独有的部分(无法被公共因子解释)。 可认为是每个因子对复合而成的可观测变量的贡献值。

碎石检验的前两个特征值(三角形)都在拐角处之上,并且大于基于100次模拟数据矩阵的特征值均值。对于EFA,Kaiser-Harris准则的特征值数大于0,而不是1。

结果解读:PCA结果建议提取一个或者两个成分,EFA建议提取两个因子。

fa(r, nfactors=, n.obs=, rotate=, scores=, fm=)

 r是相关系数矩阵或者原始数据矩阵;

 nfactors设定提取的因子数(默认为1);

 n.obs是观测数(输入相关系数矩阵时需要填写);

 rotate设定旋转的方法(默认互变异数最小法);

 scores设定是否计算因子得分(默认不计算);

 fm设定因子化方法(默认极小残差法)。

与PCA不同,提取公共因子的方法很多,包括最大似然法(ml)、主轴迭代法(pa)、加权最小二乘法(wls)、广义加权最小二乘法(gls)和最小残差法(minres)。统计学家青睐使用最大似然法,因为它有良好的统计性质。

结果解读:两个因子的Proportion Var分别为0.46和0.14,两个因子解释了六个心理学测试60%的方差。

结果解读:阅读和词汇在第一因子上载荷较大,画图、积木图案和迷宫在第二因子上载荷较大,非语言的普通智力测量在两个因子上载荷较为平均,这表明存在一个语言智力因子和一个非语言智力因子。

正交旋转和斜交旋转的不同之处。

对于正交旋转,因子分析的重点在于因子结构矩阵(变量与因子的相关系数),而对于斜交旋转,因子分析会考虑三个矩阵:因子结构矩阵、因子模式矩阵和因子关联矩阵。

因子模式矩阵即标准化的回归系数矩阵。它列出了因子预测变量的权重。因子关联矩阵即因子相关系数矩阵。

图形解读:词汇和阅读在第一个因子(PA1)上载荷较大,而积木图案、画图和迷宫在第二个因子(PA2)上载荷较大。普通智力测验在两个因子上较为平均。

与可精确计算的主成分得分不同,因子得分只是估计得到的。它的估计方法有多种,fa()函数使用的是回归方法。

R包含了其他许多对因子分析非常有用的软件包。FactoMineR包不仅提供了PCA和EFA方法,还包含潜变量模型。它有许多此处我们并没考虑的参数选项,比如数值型变量和类别型变量的使用方法。FAiR包使用遗传算法来估计因子分析模型,它增强了模型参数估计能力,能够处理不等式的约束条件,GPArotation包则提供了许多因子旋转方法。最后,还有nFactors包,它提供了用来判断因子数目的许多复杂方法。

主成分分析

1.数据导入

数据结构:对10株玉米进行了生物学性状考察,考察指标有株高,穗位,茎粗,穗长,秃顶,穗粗,穗行数,行粒数。

结果解读:选择2个主成分即可保留样本大量信息。

3.提取主成分

结果解读:主成分1可解释44%的方差,主成分2解释了26%的方差,合计解释了70%的方差。

4.获取主成分得分

5.主成分方程

PC1 = 0.27 株高 - 0.04 穗位 + 0.29 茎粗 - 0.01 穗长 - 0.21 秃顶 - 0.13 穗粗 + 0.16 穗行数 + 0.24 行粒数

PC2 = -0.01 株高 + 0.36 穗位 - 0.10 茎粗 + 0.41 穗长 - 0.08 秃顶 + 0.43 穗粗 - 0.15 穗行数 + 0.01 行粒数

图形解读:此图反映了变量与主成分的关系,三个蓝点对应的RC2值较高,点上的标号2,4,6对应变量名穗位,穗长,穗粗,说明第2主成分主要解释了这些变量,与这些变量相关性强;黑点分别对应株高,茎粗,穗行数,行粒数,说明第一主成分与这些变量相关性强,第一主成分主要解释的也是这些变量,而5号点秃顶对于两个主成分均没有显示好的相关性。

因子分析

图解:可以看到需要提取4个因子。

2.提取因子

结果解读:因子1到4解释了80%的方差。

3.获取因子得分

图解:可以看出,因子1和因子2的相关系数为0.4,行粒数,株高,茎粗,秃顶在因子1的载荷较大,穗长,穗位在因子2上的载荷较大;因子3只有穗行数相关,因子4只有穗粗相关。

参考资料: