海林老师《数据挖掘》课程作业系列
要求:自己写R/Python代码、函数实现一系列算法
其他参见:
全文逻辑:(读者可将所有代码按顺序复制到RStudio,全选ctrl+A,运行ctrl+enter,查看结果)
- 分析
- 算法/函数
- 测试数据
- 测试代码
- 测试结果(截图)
分析:
#注:主成分个数的选定方法:根据累计方差贡献率满足95%即可
#返回结果:选择几个主成分及其解释方差的比例、将原数据投影到主成分上
算法实现(编写函数):
#如下
myPCA<-function(data){
#第一步,分别求特征的平均值,然后对于所有的样例,都减去对应的均值
#返回矩阵
qujun<-function(data){
aa=apply(as.matrix(data), 2, function(v){
return(mean(v))
})
result=matrix(rep(0,ncol(data)*nrow(data)),ncol = ncol(data),nrow = nrow(data))
for (i in 1:nrow(data)) {
result[i,]=as.matrix(data[i,])-aa
}
return(result)
}
scale_data=qujun(USArrests)
#第二步,求特征协方差矩阵
cov_matrix=cov(scale_data)
#第三步,求协方差的特征值和特征向量
eigen_values=eigen(cov_matrix)$values
eigen_vectors=eigen(cov_matrix)$vectors
#第四步,将特征值按照从大到小的顺序排序,选择其中最大的k个,
##然后将其对应的k个特征向量分别作为列向量组成特征向量矩阵。
##按照累计方差贡献率满足95%即可 选定k值
eigen_values_sort=sort(eigen_values,decreasing = T)
mysum=0
k=0
for (i in 1:length(eigen_values)) {
mysum=mysum+eigen_values_sort[i]
if(mysum>sum(eigen_values)*0.95){
k=i
break
}
}
###所选的特征值/特征向量即为:
index=which(rank(-eigen_values)%in%k)
finalvalue=eigen_values[index]
finalvector=eigen_vectors[,index]
##记录所选主成分解释方差的比例
rate=sum(finalvalue)/sum(eigen_values)
#第五步,将样本点投影到选取的特征向量上。
new_dm=scale_data%*%finalvector
#返回结果:选择几个主成分、将原数据投影到主成分上
results=list(NULL)
results[[1]]=paste0(k,"个主成分共解释",round(rate*100,2),"%的方差")
results[[2]]=new_dm
return(results)
}
数据测试:
测试数据:
#测试数据集USArrests
USArrests
aaa=myPCA(USArrests)
aaa