logistic回歸 梯度下降演算法

2021-08-15 17:04:30 字數 2937 閱讀 8788

假設現在有一些資料點,我們利用一條直線對這些點進行擬合(該線稱為最佳擬合直線),這個擬合過程就稱作為回歸。我們希望接收所有的輸出,然後**出類別。在兩個類別的情況下,輸出0,1來代表,這種函式是單位階躍函式。

sigmoid函式具有該性質:

sigmoid函式公式是: si

gmoi

d(z)

=11+

exp(

−z) sig

moid

(z)=

11+e

xp(−

z)sigmoid函式的性質可以作為分類器,輸入為z z=

w0∗x

0+w1

∗x1+

...+

wn∗x

n z=w

0∗x0

+w1∗

x1+.

..+w

n∗xn

如果使用向量表示, 輸入向量均為列向量:輸入z: z=

w⃗ t⋅

x⃗ z =w

→t⋅x

→n為特徵個數。比如下面的例子中,只有兩個特徵,可以在二維平面上畫出並分類。

要尋求某個某個函式的最小值,最好的方法是沿著梯度的反方向,即沿著下降速率最快的方向。在andrew ng的斯坦佛課堂上,有動態圖的演示,方便理解。這種方法,可能會找到區域性最優解(local optimum),而不是全域性最優解(global optimum)。

假設更新步長是alpha,那麼根據梯度下降演算法,回歸係數可以由下面的式子進行更新: w:=

w−α∗

∇f(w

) w:=w

−α∗∇

f(w)

在上述更新引數的式子中,是對模型的**值求梯度,實際上並不需要這樣做。可以通過數學推導,可以變化成一種更方便操作的形式。

"""""

author:

xinming

modify:

2018/02/21

"""import numpy as np

import matplotlib.pyplot as plt

defload_data_set

(): fo = open('f:\pythonproject\mliacode\ch05/testset.txt')#注意\t變成了製表符。

data_mat= ;label_mat=

for line in fo.readlines():

list = line.strip().split()

return data_mat,label_mat

defsigmoid

(x):

return

1.0/(1+np.exp(-x))

deflogistic_reg_grad_descent

(data_mat,label_mat):

data_matrix = np.mat(data_mat) #100行3列

label_matrix=np.mat(label_mat).transpose() #是行向量故要轉置

m,n=np.shape(data_mat) #n為特徵個數,共有三個:x0,x1,x2

#print(m,n)

alpha = 0.001

#定義更新的步長

weights = np.ones((n,1))#初始化引數為1 3行1列

max_cycles = 500

#書中直接把迭代次數賦值為500

for k in range(max_cycles):

h = sigmoid(data_matrix*weights)#hypothesis,**值

error=h-label_matrix #m行1列,m組資料

weights=weights-alpha*data_matrix.transpose()*error #梯度下降的引數更新,可以由求導轉化為這種乘積形式

return weights

defplot_best_fit

(): data_mat,label_mat=load_data_set()

wei = logistic_reg_grad_descent(data_mat,label_mat) #

print(type(wei))

weights = wei.geta()#geta()函式將numpy矩陣轉換為陣列

print(type(weights))

print(weights)

data_array = np.array(data_mat) #轉換為numpy矩陣,方便操作

n ,m= np.shape(data_array) #矩陣的行數

x_cor1=;y_cor1=

x_cor2=;y_cor2=

for i in range(n):

if label_mat[i]==1:

else:

fig = plt.figure()

ax=fig.add_subplot(111)#返回axes類,並例項化為ax物件

ax.scatter(x_cor1,y_cor1,c='red',marker='s')#類別為1的設定為紅色方塊

ax.scatter(x_cor2,y_cor2,c='green')#類別為0的設定為綠色

x=np.arange(-3,3,0.1)

y=(-weights[0]-weights[1]*x)/weights[2]

ax.plot(x,y)

plt.show()

最後執行的效果如下:

梯度下降及logistic回歸

批量梯度下降是一種對引數的update進行累積,然後批量更新的一種方式。用於在已知整個訓練集時的一種訓練方式,但對於大規模資料並不合適。隨機梯度下降是一種對引數隨著樣本訓練,乙個乙個的及時update的方式。常用於大規模訓練集,當往往容易收斂到區域性最優解。logistics是離散的,必須是分類變數...

gradient descent 梯度下降演算法

今天給大家介紹乙個machine learning中非常基礎又非常重要的演算法 gradient descent 梯度下降演算法。其實在寫這篇文章之前,我前面的文章中就有提到gradient descent,它實在是太 氾濫 了,幾乎到處都能看到它的身影。那麼,它到底是什麼?能幹什麼?它是一種優化演...

logistic回歸的梯度計算

在logistic回歸中,假設我們的訓練集由m個已標記樣本組成 且啟用函式為sigmoid函式 x fracx 損失函式為 j theta frac sum limits m cdot log 1 cdot log 1 則損失函式對引數的梯度的第j個分量為 begin j theta frac su...