本次为学生时期所写的实验报告,代码程序为课堂学习和自学,对网络程序有所参考,如有雷同,望指出出处,谢谢!
基础知识来自教材:李航的《统计学习方法》
本人小白,仍在不断学习中,有错误的地方恳请大佬指出,谢谢!
本次实验将分别采用梯度下降法和牛顿法进行二项逻辑斯蒂回归模型参数估计
一、代码实现(R语言)
1.梯度下降法
#预备代码:
#计算似然函数:对i求和( yi*(w^T*x)-log(1+exp(w^T*x)) )
likelihood_fuc<-function(y,X,w){
N=nrow(X)
save=rep(NA,N)
for (i in 1:N) {
save[i]=y[i]*t(w)%*%X[i,]-log(1+exp(t(w)%*%X[i,]))
}
sum=sum(save)
sum
}
#梯度下降法
my_gradiant_descent<-function(X,y,w,ddmax,limit,lambda){
#X为n*p+1矩阵(n次观测,p个特征,最后一列全为1)
#y为n维列向量
#w输入初值w0(w为p+1维向量)
#ddmax为最大迭代次数
#limit为给定阈值
#lambda为一系列步长的预设值
N=dim(X)[1] #N为样本数
pai=rep(NA,N) #π(x)为n维列向量,记录每个给定xi(xi为p维向量)下y=1的概率
i=1
while (i<=ddmax){
#给定x、w时y=1的概率π(x)
pai=t(exp(t(w)%*%t(X))/(1+exp(t(w)%*%t(X)))) #pai为n×1的列向量
#计算此时梯度X^T*(π-y)
grad=t(X)%*%(pai-y)
grad_norm=sqrt(sum(grad^2)) #梯度的模长
#迭代的判断条件及其处理
if(grad_norm>=limit){
#选取最适宜步长(寻找给定w下使似然函数最大的步长)
result=rep(NA,length(lambda))
for (k in 1:length(lambda)) {
result[k]=likelihood_fuc(y,X,w-lambda[k]*grad)
}
lambdabest=lambda[which.max(result)]
#更新w
w=w-lambdabest*grad
#进入下一次迭代
i=i+1
}else{
break #若不满足阈值要求,则退出循环
}
}
w
}
2.牛顿法
my_Newton_method<-function(X,y,w,ddmax,limit){
#X为n*p+1矩阵(n次观测,p个特征,最后一列全为1)
#y为n维列向量
#w输入初值w0(w为p+1维向量)
#ddmax为最大迭代次数
#limit为给定阈值
N=dim(X)[1] #N为样本数
pai=rep(NA,N)
#π(x)为n维列向量,记录每个给定xi(xi为p维向量)下y=1的概率
D=matrix(0,ncol=N,nrow = N) #D为n×n的空矩阵,用于后续海塞矩阵的便捷计算
i=1
while (i<=ddmax){
#给定x、w时y=1的概率π(x)
f