假設現在有一些資料點,我們利用一條直線對這些點進行擬合(該線稱為最佳擬合直線),這個擬合過程就稱作為回歸。我們希望接收所有的輸出,然後**出類別。在兩個類別的情況下,輸出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...