大白話介紹邏輯回歸擬牛頓法 python實現

2022-08-29 04:24:08 字數 3252 閱讀 9457

擬牛頓法的出現意義在於簡化牛頓法的計算,主要在於通過迭代近似出牛頓法的分母海森矩陣,那麼具體是如何迭代近似的呢?

經過k+1次迭代後的xk+1,將f(x)在xk+1處做泰勒展開有,取二階近似有:

兩邊同時加乙個梯度運算元有:

令:有:

這裡我們對迭代過程中的海森矩陣做約束得到了擬牛頓的條件。

我們在迭代的時候可以先令初始化單位矩陣,下面附dfp迭代方法的步驟

根據這個步驟,下面是python原始碼,親寫親測可執行:

#利用擬牛頓法求解邏輯回歸,然後畫圖(詳細版)

import pandas as pd

import numpy as np

import matplotlib.pyplot as plt

data=pd.read_csv("e:\\caffe\\study\\2_data.csv",sep=",")

#整理好資料

train_x=data.iloc[0:100,0:2]

train_y=data.iloc[0:100,2:3]

h=np.eye(3,3)

theta=np.mat([2,2,-10])#初始theta

eps=0.5

alpha=0.8

#定義函式

def h(theta,x):#lr假設函式

return(1.0/(1+np.exp(-1*(np.dot(theta,x)))))

def f(train_x,train_y,theta):#一階導函式

a=np.mat([0,0,0])

# train_x=pd.concat([dataframe([1 for i in range(len(train_x))]),train_x],1)

train_x["x3"]=[1.0 for i in range(len(train_x))]

for i in range(len(train_x)):

# a = a - (h(theta, np.mat(train_x.iloc[i, :]).t) - train_y.iloc[i, 0]) * np.mat(train_x.iloc[i, :])

a=a+ (h(theta,np.mat(train_x.iloc[i,:]).t)-train_y.iloc[i,0])*np.mat(train_x.iloc[i,:])

return a/len(train_x)

# return a

def d(train_x,train_y,theta,h):

ff=f(train_x,train_y,theta)

return np.dot(h,ff.t)*(-1)

def newtheta(train_x,train_y,theta,h,alpha):

dd=d(train_x,train_y,theta,h)

return theta+alpha*dd.t

def s(train_x,train_y,theta,h,alpha):

nt=newtheta(train_x,train_y,theta,h,alpha)

return nt-theta

def y(train_x,train_y,theta,nt):

nf=f(train_x,train_y,nt)

ff=f(train_x,train_y,theta)

return nf-ff

def newh(train_x,train_y,theta,h,alpha,nt):#修正h

ss=s(train_x,train_y,theta,h,alpha)

yy=y(train_x,train_y,theta,nt)

return (h+np.dot(np.dot(ss.t,ss),np.dot(ss.t,yy).i)-np.dot(np.dot(np.dot(np.dot(h, yy.t),yy),h),np.dot(np.dot(yy.t,yy),h).i))

def finaltheta(train_x,train_y,theta,h,alpha,eps):#迭代輸出最後的theta

while (np.array(f(train_x,train_y,theta))[0][0]**2+np.array(f(train_x,train_y,theta))[0][1]**2+np.array(f(train_x,train_y,theta))[0][2]**2)**0.5>eps:

dd=d(train_x,train_y,theta,h)

nt=newtheta(train_x, train_y, theta, h, alpha)

ss=s(train_x,train_y,theta,h,alpha)

yy=y(train_x,train_y,theta,nt)

nh=newh(train_x,train_y,theta,h,alpha,nt)

theta=nt/abs(min(np.array(nt)[0]))

h=nh

else:

return theta

def pic(train_x,train_y,theta,h,alpha,eps):#畫圖

nt=finaltheta(train_x, train_y, theta, h, alpha, eps)

plot_x=[1,10]

plot_y=[((-1)*np.array(nt)[0][2]+(-1)*np.array(nt)[0][0]*plot_x[0])/np.array(nt)[0][1],((-1)*np.array(nt)[0][2]+(-1)*np.array(nt)[0][0]*plot_x[1])/np.array(nt)[0][1]]

plt.scatter(train_x['x1'], train_x['x2'], c=["r" if i==1 else "b" for i in train_y["y"]])

plt.plot(plot_x, plot_y)

結果如圖所示:

這裡想說一下:

在實際調整**的時候,發現,迭代效果會受到初始theta向量的影響,所以,如果自變數維度較少可以大致觀察下可能的theta再初始化theta可能結果會比較好。

擬牛頓法當然也是要對於n為的自變數向量,theta一定要是n+1維的,這是不可以忽略的!

大白話介紹邏輯回歸牛頓法求解 python實現

首先,對於 受多個因素影響會產生兩種結果 的這類問題,我們想要訓練一種模型,通過這種模型能夠實現任意輸入乙個n維向量,可以輸出該類問題是哪一類。對於上述的情況,我們可以考慮採用邏輯回歸的思想來解決。邏輯回歸是輸入乙個n維向量,通過加權求和,經過啟用函式的 打包 綜合得出乙個 概率值 根據該 概率值 ...

mysql用大白話解釋 大白話說說mysql索引

前面其實寫了好幾篇關於 mysql 索引的文章了,文章中有具體的例項和 sql 語句,這篇文章我想再用純大白話講講 mysql 索引,文中不涉及具體 sql 我之前甚至想過為啥要用資料庫來儲存資料,用普通的 txt 或者 word 這類檔案不行麼,這個問題其實可以從幾個方面來看,乙個是併發訪問資料加...

快速排序(大白話)

假設我們現在對 6 1 2 7 9 3 4 5 10 8 這個10個數進行排序。首先在這個序列中隨便找乙個數作為基準數 不要被這個名詞嚇到了,就是乙個用來參照的數,待會你就知道它用來做啥的了 為了方便,就讓第乙個數6作為基準數吧。接下來,需要將這個序列中所有比基準數大的數放在6的右邊,比基準數小的數...