numpy实现逻辑回归以及梯度下降优化算法

逻辑回归及其损失

为什么采用交叉熵损失也就是二项分布参数化的极大似然估计: 参考博文

梯度下降

参考: 神经网络优化算法及代码实现——从SGD、Momentum、AdaGrad、RMSProp到Adam

训练数据:

在这里插入图片描述
实现过程:

'''
A classification task with logistic regression:
loss function: cross entropy
optimizer: sgd or Newton method

tips:
1: read csv file (headers are ['x1', 'x2', 'y']) https://www.cnblogs.com/unnameable/p/7366437.html
2: train samples: 1 - 800; test: 801:1000
3: y = sigmoid(w1*x1 + w2*x2 + b), compute the params and tell me

Modularize your code!!
'''
import csv
import numpy as np
import pandas as pd



#Sigmoid函数
def sigmoid(z):
    sigmoid=1.0/(1.0+np.exp(-z))
    return sigmoid

#cross entropy
def loss(h,y):
    loss=(-y*np.log(h)-(1-y)*np.log(1-h)).mean()
    return loss

#计算梯度
def gradient(X,h,y):
    gradient=np.dot(X.T,(h-y))/y.shape[0]
    return gradient

#逻辑回归优化过程
def Logistic_Regression(X,y,stepsize,max_iters):
    intercept=np.ones((X.shape[0],1))  #初始化截距为1
    X=np.concatenate((intercept,X),axis=1)
    w=np.zeros(X.shape[1])    #初始化参数为0
    
    iter_count=0  #当前迭代次数
    l=0   #损失值
    while(iter_count<max_iters):  #梯度下降迭代
        z=np.dot(X,w) #线性函数
        h=sigmoid(z)  
        
        g=gradient(X,h,y) #计算梯度
        w-=stepsize*g  #更新参数
        
        l=loss(h,y)  #计算更新后的损失
        iter_count=iter_count+1
        #print(iter_count)
    
    return l,w  #返回迭代后的损失和参数

#逻辑回归预测函数
def Logistic_Regression_predict(test_X,test_label,w):
    intercept=np.ones((test_X.shape[0],1))
    test_X=np.concatenate((intercept,test_X),axis=1)
    predict_z=np.dot(test_X,w)
    predict_label=sigmoid(predict_z)
    predict_label[predict_label<0.5]=0
    predict_label[predict_label>0.5]=1
    return predict_label
    
#主函数
f=open('./data.csv')
data=pd.read_csv(f)   #导入csv文件
X=data.iloc[:,0:2]
#y=data.iloc[:,2]
    
#划分测试训练集
train_X=X.iloc[0:800,:]
test_X=X.iloc[800:,:]
train_label=data.iloc[0:800,2]
test_label=data.iloc[800:,2]
    
#逻辑回归模型训练及预测
l,w=Logistic_Regression(train_X,train_label,0.05,5000) #训练模型
predict_label=Logistic_Regression_predict(test_X,test_label,w)  #预测标签
accuracy=(predict_label==test_label).mean()  #计算预测准确率
print(accuracy)
'''
result:
0.97
'''
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值