版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
机器学习:K-近邻算法(KNN):KNN算法的R语言实现1机器学习:K-近邻算法(KNN):KNN算法的R语言实现1.1简介1.1.1KNN算法的基本原理K-近邻算法(K-NearestNeighbors,KNN)是一种基于实例的学习方法,它不进行显式的训练过程,而是将数据集中的所有样本作为训练实例保存。当有新的输入数据时,KNN算法会根据输入数据在特征空间中的位置,找到距离它最近的K个训练实例,然后根据这K个实例的类别来预测输入数据的类别。在分类任务中,通常采用多数表决的方式决定输入数据的类别;在回归任务中,则采用这K个实例的平均值或加权平均值作为预测值。示例代码#加载数据集
data(iris)
iris_data<-iris[,1:4]
iris_label<-iris[,5]
#数据预处理
library(caret)
iris_data<-preProcess(iris_data,method=c("center","scale"))
iris_data<-predict(iris_data,iris[,1:4])
#划分训练集和测试集
set.seed(123)
train_index<-createDataPartition(iris_label,p=0.8,list=FALSE)
train_data<-iris_data[train_index,]
test_data<-iris_data[-train_index,]
train_label<-iris_label[train_index]
test_label<-iris_label[-train_index]
#KNN分类
library(class)
knn_result<-knn(train=train_data,test=test_data,cl=train_label,k=5)
#模型评估
library(caret)
confusionMatrix(knn_result,test_label)这段代码首先加载了iris数据集,然后进行了数据预处理,包括中心化和标准化。接着,代码将数据集划分为训练集和测试集,使用class包中的knn函数进行KNN分类,最后使用caret包中的confusionMatrix函数评估模型的性能。1.1.2KNN算法在分类与回归中的应用KNN算法可以应用于分类和回归任务。在分类任务中,KNN算法通过计算输入数据与训练数据之间的距离,找到距离最近的K个训练实例,然后根据这K个实例的类别进行多数表决,以决定输入数据的类别。在回归任务中,KNN算法同样通过计算距离找到K个最近的训练实例,但预测值是这K个实例的平均值或加权平均值。示例代码#加载回归数据集
data(airquality)
airquality_data<-airquality[,c("Ozone","Solar.R","Wind","Temp")]
airquality_label<-airquality[,1]
#数据预处理
airquality_data<-preProcess(airquality_data,method=c("center","scale"))
airquality_data<-predict(airquality_data,airquality[,c("Ozone","Solar.R","Wind","Temp")])
#划分训练集和测试集
set.seed(123)
train_index<-createDataPartition(airquality_label,p=0.8,list=FALSE)
train_data<-airquality_data[train_index,]
test_data<-airquality_data[-train_index,]
train_label<-airquality_label[train_index]
test_label<-airquality_label[-train_index]
#KNN回归
library(FNN)
knn_result<-kNN(train=train_data,test=test_data,y=train_label,k=5)
#模型评估
library(caret)
RMSE(knn_result,test_label)此代码示例展示了如何使用KNN算法进行回归任务。它使用了airquality数据集,预处理数据后,将数据集划分为训练集和测试集。然后,使用FNN包中的kNN函数进行KNN回归,最后使用caret包中的RMSE函数评估模型的预测误差。1.1.3KNN算法的优缺点KNN算法的优点包括:-算法简单,易于理解和实现。-无需训练过程,可以处理非线性问题。-对异常值不敏感。KNN算法的缺点包括:-计算量大,尤其是当数据集很大时。-需要选择合适的K值,不同的K值可能对模型性能产生显著影响。-对于不平衡的数据集,KNN算法可能表现不佳。示例代码#生成不平衡数据集
unbalanced_data<-rbind(iris_data[1:100,],iris_data[121:150,])
unbalanced_label<-c(iris_label[1:100],iris_label[121:150])
#KNN分类
knn_result_unbalanced<-knn(train=unbalanced_data,test=test_data,cl=unbalanced_label,k=5)
#模型评估
confusionMatrix(knn_result_unbalanced,test_label)这段代码展示了当数据集不平衡时,KNN算法可能面临的挑战。通过生成一个不平衡的数据集,可以看到模型在少数类上的预测性能可能会下降。1.2总结KNN算法是一种简单但强大的机器学习方法,适用于分类和回归任务。通过计算距离和选择最近的邻居,KNN能够做出预测。然而,它也存在计算效率和K值选择的挑战,特别是在处理大规模数据集和不平衡数据集时。通过上述代码示例,我们不仅理解了KNN的基本原理,还学会了如何在R语言中实现KNN算法,并评估其性能。2R语言基础2.1R语言环境搭建与基本操作在开始使用R语言进行数据分析和机器学习之前,首先需要搭建R语言的环境。R语言是一个免费且开源的统计计算和图形软件环境,广泛应用于数据科学领域。以下是如何在Windows系统上搭建R语言环境的步骤:下载R语言:访问R语言的官方网站/,选择适合你操作系统的版本进行下载。安装R语言:运行下载的安装程序,按照默认设置完成安装。安装RStudio:RStudio是一个非常流行的R语言集成开发环境(IDE),它提供了更友好的用户界面。访问RStudio官网/下载并安装RStudio。启动RStudio:安装完成后,打开RStudio,你将看到一个包含多个窗格的界面,包括控制台、文件管理器、帮助文档和图形界面。2.1.1R语言基本操作R语言提供了丰富的数据结构和函数,以下是一些基本操作的示例:#创建向量
vec<-c(1,2,3,4,5)
print(vec)
#创建矩阵
mat<-matrix(1:6,nrow=2,ncol=3)
print(mat)
#创建数据框
df<-data.frame(name=c("Alice","Bob"),age=c(25,30))
print(df)
#安装和加载包
install.packages("ggplot2")
library(ggplot2)2.2数据导入与预处理在进行数据分析或机器学习之前,数据的导入和预处理是必不可少的步骤。R语言提供了多种方式来导入数据,包括从CSV、Excel、SQL数据库等。2.2.1导入CSV数据#导入CSV文件
data<-read.csv("data.csv")
print(head(data))#查看数据的前几行2.2.2数据预处理数据预处理包括数据清洗、缺失值处理、数据转换等步骤。以下是一个简单的数据预处理示例:#处理缺失值
data$age[is.na(data$age)]<-mean(data$age,na.rm=TRUE)
#转换数据类型
data$age<-eger(data$age)
#删除重复行
data<-unique(data)2.3使用R进行数据可视化数据可视化是数据分析的重要组成部分,它可以帮助我们更好地理解数据。R语言中的ggplot2包是一个强大的绘图工具,可以创建各种类型的图表。2.3.1创建散点图#创建散点图
ggplot(data,aes(x=age,y=salary))+
geom_point()+
labs(title="AgevsSalary",x="Age",y="Salary")2.3.2创建直方图#创建直方图
ggplot(data,aes(x=salary))+
geom_histogram(binwidth=1000,color="black",fill="blue")+
labs(title="SalaryDistribution",x="Salary",y="Frequency")通过以上步骤,你已经掌握了R语言的基础环境搭建、基本操作、数据导入预处理以及数据可视化的方法。这些技能是进行更复杂的数据分析和机器学习项目的基础。接下来,你可以进一步学习如何使用R语言进行更高级的数据分析和建模。3机器学习:K-近邻算法(KNN):KNN算法的R语言实现3.1安装与加载KNN相关的R包在R中实现KNN算法,我们通常会使用class和caret包。class包提供了knn函数,而caret包则提供了更多的模型训练和评估工具,包括K值的选择和模型优化。3.1.1安装R包#安装class和caret包
install.packages("class")
install.packages("caret")3.1.2加载R包#加载class和caret包
library(class)
library(caret)3.2使用R包实现KNN分类KNN分类算法基于实例学习,预测新样本的类别是通过其在特征空间中最近的K个邻居的类别来决定的。3.2.1数据准备假设我们有一个数据集iris,我们将使用它来预测花的种类。#加载iris数据集
data(iris)
#分割数据集为训练集和测试集
set.seed(123)
trainIndex<-createDataPartition(iris$Species,p=0.8,list=FALSE)
trainData<-iris[trainIndex,]
testData<-iris[-trainIndex,]3.2.2KNN分类使用knn函数进行分类预测。#使用knn进行分类
k<-5
knnModel<-knn(train=trainData[,1:4],
test=testData[,1:4],
cl=trainData[,5],
k=k)3.2.3预测与评估评估模型的准确性。#预测结果与实际结果的比较
confusionMatrix(knnModel,testData$Species)3.3使用R包实现KNN回归KNN回归算法与分类类似,但预测的是连续值。3.3.1数据准备假设我们有一个回归数据集mtcars,我们将使用它来预测汽车的mpg值。#加载mtcars数据集
data(mtcars)
#分割数据集为训练集和测试集
set.seed(123)
trainIndex<-createDataPartition(mtcars$mpg,p=0.8,list=FALSE)
trainData<-mtcars[trainIndex,]
testData<-mtcars[-trainIndex,]3.3.2KNN回归使用knnreg函数进行回归预测。#使用knnreg进行回归
k<-5
knnRegModel<-knnreg(train=trainData[,2:11],
test=testData[,2:11],
y=trainData[,1],
k=k)3.3.3预测与评估评估模型的预测性能。#预测结果
predictions<-predict(knnRegModel,testData[,2:11])
#评估预测性能
postResample(predictions,testData$mpg)3.4K值的选择与模型优化选择合适的K值对于KNN模型的性能至关重要。3.4.1K值的选择使用交叉验证来选择最佳的K值。#设置控制参数
control<-trainControl(method="cv",number=10)
#调整K值
knnTune<-train(x=trainData[,1:4],
y=trainData[,5],
method="knn",
trControl=control,
tuneLength=10)3.4.2模型优化基于调整后的K值,优化模型。#最佳K值
bestK<-knnTune$bestTune$k
#使用最佳K值重新训练模型
knnOptModel<-knn(train=trainData[,1:4],
test=testData[,1:4],
cl=trainData[,5],
k=bestK)3.4.3性能评估再次评估模型的性能。#评估优化后的模型性能
confusionMatrix(knnOptModel,testData$Species)通过以上步骤,我们不仅实现了KNN算法在R中的应用,还通过调整K值优化了模型的性能。这为理解和应用KNN算法提供了坚实的基础。4案例分析4.1subdir4.1:Iris数据集上的KNN分类实战在本节中,我们将使用R语言和著名的Iris数据集来实现K-近邻算法(KNN)进行分类。Iris数据集包含了150个样本,每个样本有4个特征:萼片长度、萼片宽度、花瓣长度和花瓣宽度,以及一个类别标签,指示该样本属于三种鸢尾花中的哪一种。4.1.1数据准备首先,我们需要加载数据并进行预处理。#加载必要的库
library(class)
library(caret)
#加载Iris数据集
data(iris)
#将数据集分为训练集和测试集
set.seed(123)
trainIndex<-createDataPartition(iris$Species,p=0.7,list=FALSE)
trainData<-iris[trainIndex,]
testData<-iris[-trainIndex,]4.1.2KNN模型训练接下来,我们将使用class包中的knn函数来训练KNN模型。#定义K值
k<-5
#使用knn函数进行分类
predictedSpecies<-knn(train=trainData[,1:4],
test=testData[,1:4],
cl=trainData[,5],
k=k)4.1.3结果评估最后,我们将评估模型的准确性。#比较预测结果和实际结果
confusionMatrix(predictedSpecies,testData$Species)4.2subdir4.2:波士顿房价数据集上的KNN回归实战在回归问题中,KNN算法预测的是连续值。我们将使用波士顿房价数据集来演示KNN回归。4.2.1数据准备首先,加载数据并进行预处理。#加载必要的库
library(MASS)
library(caret)
#加载波士顿房价数据集
data(Boston)
#将数据集分为训练集和测试集
set.seed(123)
trainIndex<-createDataPartition(Boston$medv,p=0.7,list=FALSE)
trainData<-Boston[trainIndex,]
testData<-Boston[-trainIndex,]4.2.2KNN模型训练使用caret包中的knnreg函数来训练KNN回归模型。#定义K值
k<-7
#使用knnreg函数进行回归
knnModel<-knnreg(train=trainData[,-14],
y=trainData$medv,
k=k)
#预测测试集的房价
predictedPrice<-predict(knnModel,newdata=testData[,-14])4.2.3结果评估评估模型的预测性能。#计算均方误差
mse<-mean((predictedPrice-testData$medv)^2)
mse4.3subdir4.3:模型评估与结果解释模型评估是机器学习中至关重要的一步,它帮助我们理解模型的性能和可靠性。4.3.1评估指标对于分类问题,我们通常使用准确率、召回率、F1分数等指标。对于回归问题,我们关注均方误差(MSE)、均方根误差(RMSE)和R^2分数。4.3.2结果解释准确率:表示分类正确的样本占总样本的比例。MSE:表示预测值与真实值之间的平均平方差,值越小表示模型预测越准确。RMSE:MSE的平方根,更直观地反映了预测误差的大小。R^2分数:表示模型解释了数据中多少变异,值越接近1表示模型拟合越好。4.3.3选择合适的K值K值的选择对KNN模型的性能有显著影响。较小的K值会使模型对噪声更敏感,而较大的K值则可能忽略数据的局部特征。通常,我们通过交叉验证来选择最优的K值。#使用caret包进行交叉验证选择K值
kTune<-train(x=trainData[,1:4],
y=trainData[,5],
method="knn",
preProcess=c("center","scale"),
tuneLength=10,
trControl=trainControl(method="cv",number=10))
#输出最优K值
kTune$bestTune$k通过上述步骤,我们不仅实现了KNN算法在R语言中的应用,还学会了如何评估模型性能和选择最优的K值。这为我们在实际问题中应用KNN算法提供了坚实的基础。5进阶技巧5.1距离度量的选择在K-近邻算法中,选择合适的距离度量对于算法的性能至关重要。不同的距离度量可以捕捉到数据的不同特性,从而影响分类或回归的准确性。R语言提供了多种计算距离的函数,如dist(),可以灵活地选择不同的度量方式。5.1.1欧氏距离欧氏距离是最直观的距离度量方式,适用于数值型特征。它计算两个点在多维空间中的直线距离。#示例数据
data<-matrix(c(1,2,2,3,3,4),nrow=3,byrow=TRUE)
#计算欧氏距离
dist_euclidean<-dist(data,method="euclidean")
print(dist_euclidean)5.1.2曼哈顿距离曼哈顿距离,也称为城市街区距离,适用于特征空间中各维度具有不同物理意义的情况。它计算两个点在多维空间中沿轴方向的总距离。#计算曼哈顿距离
dist_manhattan<-dist(data,method="manhattan")
print(dist_manhattan)5.1.3马氏距离马氏距离考虑了数据的协方差结构,适用于特征之间存在相关性的数据集。它衡量了两个点在多维空间中的标准化距离。#示例数据,包含协方差
data_cov<-matrix(c(1,2,2,3,3,4,4,5,5,6,6,7),nrow=3,byrow=TRUE)
#计算马氏距离
dist_mahalanobis<-mahalanobis(data_cov,colMeans(data_cov),cov(data_cov))
print(dist_mahalanobis)5.2权重分配策略KNN算法中,权重分配策略可以提高预测的准确性。通常,距离更近的邻居对预测结果的影响更大。5.2.1均等权重这是最简单的权重策略,所有邻居的权重相等。#均等权重的KNN预测
library(class)
#假设训练数据和测试数据
train_data<-matrix(c(1,2,2,3,3,4),nrow=3,byrow=TRUE)
train_labels<-c("A","B","A")
test_data<-matrix(c(1.5,2.5),nrow=1,byrow=TRUE)
#KNN预测
knn_prediction<-knn(train_data,test_data,train_labels,k=3)
print(knn_prediction)5.2.2距离加权距离加权策略中,邻居的权重与它们到测试点的距离成反比。#距离加权的KNN预测
#自定义距离加权函数
knn_weighted<-function(train,test,labels,k){
dists<-as.matrix(dist(rbind(train,test),method="euclidean"))
dists<-dists[nrow(dists),1:nrow(train)]
weights<-1/dists
weights<-weights/sum(weights)
sorted_indices<-order(dists)
top_k_indices<-sorted_indices[1:k]
top_k_weights<-weights[top_k_indices]
top_k_labels<-labels[top_k_indices]
prediction<-weighted.mean(top_k_labels,top_k_weights)
return(round(prediction))
}
#示例数据
train_data<-matrix(c(1,2,2,3,3,4),nrow=3,byrow=TRUE)
train_labels<-c(1,2,1)
test_data<-matrix(c(1.5,2.5),nrow=1,byrow=TRUE)
#距离加权KNN预测
knn_weighted_prediction<-knn_weighted(train_data,test_data,train_labels,k=3)
print(knn_weighted_prediction)5.3处理不平衡数据集在现实世界的数据集中,各类别的样本数量可能不均衡,这被称为不平衡数据集问题。在KNN中,这可能导致预测偏向于样本数量较多的类别。5.3.1重采样重采样技术包括过采样和欠采样,可以调整各类别样本的数量,以达到平衡。过采样#过采样
library(DMwR)
#假设训练数据和标签
train_data_imbalanced<-matrix(c(1,2,2,3,3,4,4,5,5,6),nrow=5,byrow=TRUE)
train_labels_imbalanced<-c("A","A","A","B","B")
#过采样
train_data_balanced<-SMOTE(train_data_imbalanced,train_labels_imbalanced,perc.over=100,k=5)欠采样#欠采样
library(caret)
#欠采样
train_data_balanced<-downSample(train_data_imbalanced,train_labels_imbalanced)5.3.2成本敏感学习在KNN中,可以通过调整不同类别预测错误的成本,来处理不平衡数据集问题。#成本敏感学习
#自定义预测函数,考虑类别成本
knn_cost_sensitive<-function(train,test,labels,k,costs){
dists<-as.matrix(dist(rbind(train,test),method="euclidean"))
dists<-dists[nrow(dists),1:nrow(train)]
sorted_indices<-order(dists)
top_k_indices<-sorted_indices[1:k]
top_k_labels<-labels[top_k_indices]
#计算成本
cost<-sapply(top_k_labels,function(x)costs[x])
#预测类别
prediction<-which.min(cost)
return(prediction)
}
#示例数据
train_data_imbalanced<-matrix(c(1,2,2,3,3,4,4,5,5,6),nrow=5,byrow=TRUE)
train_labels_imbalanced<-c("A","A","A","B","B")
test_data<-matrix(c(1.5,2.5),nrow=1,byrow=TRUE)
#类别成本
costs<-c(A=1,B=2)
#成本敏感KNN预测
knn_cost_sensitive_prediction<-knn_cost_sensitive(train_data_imbalanced,test_data,train_labels_imbalanced,k=3,costs)
print(knn_cost_sensitive_prediction)通过上述进阶技巧,可以显著提高KNN算法在复杂数据集上的性能和准确性。6总结与实践6.11KNN算法的总结回顾K-近邻算法(K-NearestNeighbors,KNN)是一种基于实例的学习方法,用于分类和回归。在分类问题中,KNN通过计算待分类样本与训练集中所有样本的距离,选取距离最近的K
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论