R-数据挖掘-主成分分析PCA(二)

海林老师《数据挖掘》课程作业系列

要求:自己写R/Python代码、函数实现一系列算法

其他参见

R-数据挖掘-求混合型数据对象距离(一)

R-数据挖掘-主成分分析PCA(二)

R-数据挖掘-关联规则(三)

R-数据挖掘-决策树ID3(四)

R-数据挖掘-贝叶斯分类(五)

R-数据挖掘-聚类Kmeans(六)

R-数据挖掘-聚类DBSCAN(七)

全文逻辑:(读者可将所有代码按顺序复制到RStudio,全选ctrl+A,运行ctrl+enter,查看结果)

  1. 分析
  2. 算法/函数
  3. 测试数据
  4. 测试代码
  5. 测试结果(截图)

分析:

#注:主成分个数的选定方法:根据累计方差贡献率满足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

测试结果:

猜你喜欢

转载自blog.csdn.net/kelanj/article/details/89576813