邏輯回歸之原理分析與實踐

2021-09-27 13:05:42 字數 4442 閱讀 7200

一、簡述

二、數學原理

1、sigmoid函式:

2、對於線性邊界的情況,邊界形式如下:

3、構造**函式為:

4、hθ(x)函式的值有特殊的含義,它表示結果取1的概率,因此對於輸入x分類結果為類別1和類別0的概率分別為:

5、輸出y(標籤值0或1)類別的概率可以用以下公式表示:

舉個例子,假設h(x) = 0.01,則表示y=0的概率為0.99,y=1的概率為0.01,這就要看訓練集中y的值了,

6、取似然函式,就是對每組**概率之間的乘積,乘積越大,則損失越小:

我們要改變引數theta,使得每組資料**正確的概率值盡可能地大,乘積也就盡可能地大

7、對上式取對數,單調性沒有改變,我覺得這種操作是為了更好地求導,得到如下式子:

8、損失函式一般習慣於取最小值,所以在最大值(上式)取負數就是最小值了,然後對m組資料取平均,除以m就是損失函式:

9、對theta求梯度如下:

10、使用梯度下降法更新引數,梯度下降法首先針對的凸函式,這樣才能得到全域性最優解。梯度下降法的設計和實現都很簡單,但是效率很低。這裡提下其他幾種引數更新方法:momentum、adagrad、adam,感興趣的可以查閱資料。梯度下降法如下:

11、邏輯回歸原理參考

三、程式設計測試

環境:window10+pycharm2017.3+python3.6.6

import numpy as np

import matplotlib.pyplot as plt

"""函式說明:梯度下降求最優值

parameters:

feature --m*n

lable --m*1

maxcycle --最大迭代次數

alpha --學習率

returns:

最優引數值

"""def lr_train_bgd(feature, lable, maxcycle, alpha):

# feature: m*n

n = np.shape(feature)[1] # 每組資料的特徵個數

m = np.shape(feature)[0] # 多少組資料

w = np.ones(n).reshape(n, 1) #初始化權重

i = 0

while i < maxcycle:

i += 1

x = np.dot(feature, w)

sigmoid = sig(x) # m*1

error = lable - sigmoid

if i % 50 == 0:

print("損失值: " + str(i) + ": " + str(error_rate(sigmoid, lable)))

# 梯度為: gradient := -np.dot(feature.t, error)/m ; w := w - gradient

# feature.t: n*m error:m*1 w: n*1

w = w + alpha * np.dot(feature.t, error) / m

return w

#計算損失值

"""函式說明:計算loss或誤差率

parameters:

sigmoid --經過sigmoid轉換的值

lable --標籤資料

returns:

返回誤差率

"""def error_rate(sigmoid, lable):

m = np.shape(sigmoid)[0] #特徵條數

sum = 0.

for i in range(m):

if sigmoid[i, 0] > 0 and (1 - sigmoid[i, 0] > 0):

sum -= + lable[i, 0] * np.log(sigmoid[i, 0]) + (1 - lable[i, 0]) * np.log(1 - sigmoid[i, 0])

return sum/m

"""函式說明:將值對映到0-1上,使用了sigmoid函式

parameters:

x --待變換的值或矩陣

returns:

返回 x的sigmoid值

"""def sig(x):

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

"""函式說明:載入資料集

parameters:

無returns:

返回 feature 和 lable

"""def loaddata():

feature =

lable =

fr = open('set.txt')

lines = fr.readlines()

for line in lines:

linearr = line.strip().split()

return np.array(feature, dtype='float64'), np.array(lable, dtype='float64')

"""函式說明:顯示結果

parameters:

weights --訓練得到的引數

feature --特徵資料

lable --標籤資料

returns:

無"""def display(feature, lable, weights):

xclass0 =

yclass0 =

xclass1 =

yclass1 =

for i in range(np.shape(lable)[0]):

if lable[i] == 1:

else:

fig = plt.figure()

ax = fig.add_subplot(111) # 新增subplot

ax.scatter(xclass0, yclass0, s=10, c='red', marker='s', alpha=.5) # 繪製正樣本

ax.scatter(xclass1, yclass1, s=20, c='green', alpha=.5) # 繪製負樣本

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

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

ax.plot(x, y)

plt.title('bestfit') # 繪製title

plt.xlabel('x1')

plt.ylabel('x2') # 繪製label

plt.show()

if __name__ == '__main__':

feature, lable = loaddata()

w = lr_train_bgd(feature, lable, 5000, 0.2)

print(w)

display(feature, lable, w)

set,txt檔案的資料格式形如:

-0.017612 14.053064 0

-1.395634 4.662541 1

-0.752157 6.538620 0

-1.322371 7.152853 0

0.423363 11.054677 0

0.406704 7.067335 1

損失值: 0.09733279544154633

權重:[[11.23640427]

[ 1.00910356]

[-1.53621881]]

測試截圖如下:

邏輯回歸實踐

1.邏輯回歸是怎麼防止過擬合的?為什麼正則化可以防止過擬合?答 1 可以通過增加樣本量,或者提取不重要的特徵進行降維來防止過擬合,也可以通過正則化來防止過擬合。2 正則化的原理,就是通過約束係數 w 的大小,進而抑制整體的過擬合情況。2.用logiftic回歸來進行實踐操作,資料不限。答 我這次選擇...

邏輯回歸原理

而在最大熵原理的指導下,我們知道了那條曲線應該是乙個什麼樣子的。首先,回顧我們之前推導出的最大熵模型為 ex p i 1nw ifi x,y ye xp i 1n wifi x,y 在二分類的邏輯回歸模型中,y的取值假定有兩種 y0 y1 那麼對應到特徵函式 fi x,y 上,我們可以設定 f x,...

邏輯回歸原理

最大似然估計 現在已經拿到了很多個樣本 你的資料集中所有因變數 這些樣本值已經實現,最大似然估計就是去找到那個 組 引數估計值,使得前面已經實現的樣本值發生概率最大。因為你手頭上的樣本已經實現了,其發生概率最大才符合邏輯。這時是求樣本所有觀測的聯合概率最大化,是個連乘積,只要取對數,就變成了線性加總...