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

2022-08-29 04:21:14 字數 3300 閱讀 3864

首先,對於「受多個因素影響會產生兩種結果「的這類問題,我們想要訓練一種模型,通過這種模型能夠實現任意輸入乙個n維向量,可以輸出該類問題是哪一類。

對於上述的情況,我們可以考慮採用邏輯回歸的思想來解決。

邏輯回歸是輸入乙個n維向量,通過加權求和,經過啟用函式的「打包」,綜合得出乙個「概率值」,根據該「概率值」是否達到某個閾值來判斷結果是1還是0.

具體來說:(假如我的自變數是5維的)

注意:如果你的自變數是n維的,那麼你要輸入的其實是n+1維的,其中有個偏置不可以忽略

我們注意到,要想解決這個問題,我們目前未知的是這個n+1維的theta向量,因此如何求得這個theta向量是至關重要的。

求theta向量這裡要引入乙個極大似然的概念,具體來說:

任意乙個「概率」的公式為:

則它的似然函式為:

經簡化:

這裡我們要求解似然函式的最大值,進一步問題轉化為最優化問題,又進一步轉化為其導函式求根的問題——牛頓法!

牛頓法是一種通過迭代近似求根的方法,使用函式f (x)的泰勒級數的前面幾項來尋找方程f (x) = 0的根。用牛頓迭代法解非線性方程,是把非線性方程f(x) = 0線性化的一種近似方法。

把f(x)在點x0的某鄰域內展開成泰勒級數:

取其前兩項可以得到:

進而可以得到牛頓法迭代關係式:

注意:這裡的x是我們的theta向量,這裡的分母雖然在泰勒裡是一階導,但事實上是兩階導,因為f(x)本身就是一階導。

下面是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]

theta=np.mat([1,1,1])#初始theta

times=30#定義迭代次數

#定義函式

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

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

def j(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 h_1(train_x,train_y,theta):#海森矩陣的逆

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

a = np.zeros((3,3))

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

for i in range(len(train_x)):

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

a = a + np.eye(3,3)*(np.array(np.exp(np.dot(theta,np.mat(train_x.iloc[i, :]).t)))[0][0]/(np.array(np.exp(np.dot(theta,np.mat(train_x.iloc[i, :]).t)))[0][0]+1)**2)* np.mat(train_x.iloc[i, :]).t*np.mat(train_x.iloc[i, :])

return (a / len(train_x)).i

#return a.i

def para(train_x,train_y,theta,times):#輸出迭代後的theta,times為限制迭代次數

for i in range(times):

itheta=j(train_x,train_y,theta)*h_1(train_x,train_y,theta)

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

return theta

def pic(train_x,train_y,theta,times):#畫圖

theta=para(train_x,train_y,theta,times)

plot_x=[1,10]

plot_y=[((-1)*np.array(theta)[0][2]+(-1)*np.array(theta)[0][0]*plot_x[0])/np.array(theta)[0][1],((-1)*np.array(theta)[0][2]+(-1)*np.array(theta)[0][0]*plot_x[1])/np.array(theta)[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)

結果如圖所示:

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

擬牛頓法的出現意義在於簡化牛頓法的計算,主要在於通過迭代近似出牛頓法的分母海森矩陣,那麼具體是如何迭代近似的呢?經過k 1次迭代後的xk 1,將f x 在xk 1處做泰勒展開有,取二階近似有 兩邊同時加乙個梯度運算元有 令 有 這裡我們對迭代過程中的海森矩陣做約束得到了擬牛頓的條件。我們在迭代的時候...

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

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

快速排序(大白話)

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