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