中国2012年数学建模大赛A题(葡萄与葡萄酒)+补充了pls回归系数的算法

grape=read.csv('d:/grape.csv') #葡萄数据
grape
grape=as.matrix(grape[,-1])
claret=read.csv('d:/claret.csv') #葡萄酒数据
claret
claret=as.matrix(claret[,-1])
x=grape
y=claret
x0=scale(x)
x0
y0=scale(y)
y0
m=t(x0)%*%y0%*%t(y0)%*%x0
m
eigen(m)
w1=eigen(m)$vectors[,1]
w1
v1=t(y0)%*%x0%*%w1/sqrt(as.matrix(eigen(m)$values)[1,])
v1
t1=x0%*%w1
t1 # 以上为第一步(1)分别提取两变量组的第一对成分,并使之相关性达最大。
u1=y0%*%v1
u1
library("pracma")
α1=inv(t(t1)%*%t1)%*%t(t1)%*%x0 #也可由t(x0)%*%t1/norm(t1,'2')^2算得α1(主成分t1与x0进行最小二乘回归求得的t1对每一个x0的回归系数)
β1=inv(t(t1)%*%t1)%*%t(t1)%*%y0 #也可由t(y0)%*%t1/norm(t1,'2')^2算得β1(主成分t1与y0进行最小二乘回归求得的t1对每一个y0的回归系数)
α1
t(α1)
β1
t(β1)
t(x0)%*%t1/norm(t1,'2')^2 # norm(t1,'2')为svd(t1)即t1的最大奇异值,也可用sqrt(t(t1)%*%t1)求得
t(y0)%*%t1/norm(t1,'2')^2 # 以上为第二步(2)建立y对T1的回归及x对T1的回归。
B=t(x0)%*%u1%*%inv(t(t1)%*%x0%*%t(x0)%*%u1)%*%t(t1)%*%y0 #保留第一对潜变量对应的标准化自变量x和标准化应变量y的pls回归系数矩阵(该矩阵公式参见‘KernelPartialLeastSquaresRegressionin Reproducing Kernel Hilbert Space’p102)

B
library("pls")
pls1=plsr(y0~x0,ncomp=1,validation='LOO',jackknife=T)
coef(pls1) #上式中B的求解等价于R的pls包中保留一个主成分的结果
px0=t1%*%α1
E1=x0-px0
py0=t1%*%β1
F1=y0-py0 # 以上为第三步(3) 用残差阵E1和F1代替x0和y0重复以上步骤。
m2=t(E1)%*%F1%*%t(F1)%*%E1
eigen(m2)
w2=eigen(m2)$vectors[,1]
w2
v2=t(F1)%*%E1%*%w2/sqrt(as.matrix(eigen(m2)$values)[1,])
v2
t2=E1%*%w2
t2
u2=F1%*%v2
u2
α2=inv(t(t2)%*%t2)%*%t(t2)%*%E1 #也可由t(E1)%*%t2/norm(t2,'2')^2算得α2
β2=inv(t(t2)%*%t2)%*%t(t2)%*%F1 #也可由t(F1)%*%t2/norm(t2,'2')^2算得β2
α2
β2
pE1=t2%*%α2
E2=E1-pE1
pF1=t2%*%β2
F2=F1-pF1
library("pls")
pls1=plsr(y0~x0,ncomp=10,validation='LOO',jackknife=T)
coef(pls1)
summary(pls1,what='all')
pls1=plsr(y0~x0,ncomp=3,validation='LOO',jackknife=T) #最终选择3个主成分,重新建立模型
coef(pls1)
jack.test(pls1) #即对coef(pls1)生成的系数进行假设检验
scores(pls1) #即求t1=x0%*%w1
loadings(pls1) #即求α1
plot(pls1)
validationplot(pls1) #validationplot()函数可以画出PLS模型在不同主成分数下对应的RMSEP(由留一交叉验证法算得的均方预测误差根)
predict(pls1) #即求py0=t1%*%β1
predplot(pls1)

 

你可能感兴趣的:(中国2012年数学建模大赛A题(葡萄与葡萄酒)+补充了pls回归系数的算法)