numpy實現邏輯回歸以及梯度下降優化演算法

2021-09-26 11:05:00 字數 2803 閱讀 5108

為什麼採用交叉熵損失也就是二項分布引數化的極大似然估計: 參考博文

參考: 神經網路優化演算法及**實現——從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'])

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函式

defsigmoid

(z):

sigmoid=

1.0/

(1.0

+np.exp(

-z))

return sigmoid

#cross entropy

defloss

(h,y)

: loss=

(-y*np.log(h)-(

1-y)

*np.log(

1-h)

).mean(

)return loss

#計算梯度

defgradient

(x,h,y)

: gradient=np.dot(x.t,

(h-y)

)/y.shape[0]

return gradient

#邏輯回歸優化過程

deflogistic_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

:#梯度下降迭代

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 #返回迭代後的損失和引數

#邏輯回歸**函式

deflogistic_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

'''

邏輯回歸 損失函式與梯度下降

由於二分類結果是1或者0,這與數學的階躍函式很類似,但是階躍函式在x 0的位置會發生突變,這個突變在數學上很難處理。所以一般使用sigmoid函式來擬合 g z 1 1 e z 1 具體應用到邏輯回歸演算法中 z 0 1x1 2x2 nxn i 0n i xi tx 2 其中x i 表示樣本屬性 對...

機器學習 邏輯回歸 Python實現邏輯回歸

coding utf 8 author 蔚藍的天空tom import numpy as np import os import matplotlib.pyplot as plt from sklearn.datasets import make blobs global variable path...

Tensorflow實現邏輯回歸

import tensorflow as tf 匯入mnist資料集 from tensorflow.examples.tutorials.mnist import input data mnist input data.read data sets temp data one hot true 定...