邏輯回歸(logistic regression) 最初是為了解決二分類問題。
對於線性模型要想進行如二分類任務,最簡單的辦法就是通過階躍函式(unit-step function),即將線性模型的輸出值套上乙個函式進行分割,大於z的判定為0,小於z的判定為1。如下圖左所示
但這有個問題是,分段函式不連續且不可微。因此,提出對數機率函式能夠有效地解釋這個問題,見上圖右,簡稱sigmoid函式,該函式任意階可微,將函式代入可得:
其實,lr 模型就是在擬合 z = w^t x +b 這條直線,使得這條直線盡可能地將原始資料中的兩個類別正確的劃分開。
通過對機率函式兩邊取對數,
將 y 視為 x 為正例的概率,則 1-y 為 x 為其反例的概率。兩者的比值稱為機率(odds),指該事件發生與不發生的概率比值,若事件發生的概率為 p。則對數機率:
將 y 視為類後驗概率估計,重寫公式有:
也就是說,輸出 y=1 的對數機率是由輸入 x 的線性函式表示的模型,這就是邏輯回歸模型。當z值越接近正無窮,p概率值也就越接近 1。因此邏輯回歸的思路是,先擬合決策邊界(不侷限於線性,還可以是多項式),再建立這個邊界與分類的概率聯絡,從而得到了二分類情況下的概率。通過上述推導我們可以看到 logistic 回歸實際上是使用線性回歸模型的**值逼近分類任務真實標記的對數機率。
回歸問題的損失函式一般為平均誤差平方損失 mse,lr解決二分類問題中,損失函式採用的是最大似然估計法,其(似然函式)形式如下:
求取對數
lr的損失函式可以表示為:
確定損失函式後,如何求解最優解?有兩種方法。
隨機梯度下降
梯度下降是通過 j(w) 對 w 的一階導數來找下降方向,並且以迭代的方式來更新引數,更新方式為 :
其中 k 為迭代次數。每次更新引數後,可以通過比較前後損失函式差值是否小於閾值或者到達最大迭代次數來停止迭代。
2. 牛頓法
然後求導取最小值,得到
因此有迭代更新式:
其中 與梯度下降演算法相比,其優點是:第
一、不需要手動的選擇步長;第
二、比梯度下降演算法快。但缺點是這些演算法更加複雜,實用性不如梯度下降。
目前,這部分暫未考慮為避免過擬合所採取的正則化處理。以上如何通過**來實現呢?
當然,以上只是對lr基本原理的介紹,至於實際的**應用,直接呼叫sklearn就可以了。import numpy as np
class logisticregression(object):
def __init__(self, learning_rate=0.1, max_iter=100, seed=none):
self.seed = seed
self.lr = learning_rate
self.max_iter = max_iter
def fit(self, x, y):
np.random.seed(self.seed)
self.w = np.random.normal(loc=0.0, scale=1.0, size=x.shape[1])
self.b = np.random.normal(loc=0.0, scale=1.0)
self.x = x
self.y = y
for i in range(self.max_iter):
self._update_step()
# print('loss: \t{}'.format(self.loss()))
# print('score: \t{}'.format(self.score()))
# print('w: \t{}'.format(self.w))
# print('b: \t{}'.format(self.b))
def _sigmoid(self, z):
return 1.0 / (1.0 + np.exp(-z))
def _f(self, x, w, b):
z = x.dot(w) + b
return self._sigmoid(z)
def predict_proba(self, x=none):
if x is none:
x = self.x
y_pred = self._f(x, self.w, self.b)
return y_pred
def predict(self, x=none):
if x is none:
x = self.x
y_pred_proba = self._f(x, self.w, self.b)
y_pred = np.array([0 if y_pred_proba[i] < 0.5 else 1 for i in range(len(y_pred_proba))])
return y_pred
def score(self, y_true=none, y_pred=none):
if y_true is none or y_pred is none:
y_true = self.y
y_pred = self.predict()
acc = np.mean([1 if y_true[i] == y_pred[i] else 0 for i in range(len(y_true))])
return acc
def loss(self, y_true=none, y_pred_proba=none):
if y_true is none or y_pred_proba is none:
y_true = self.y
y_pred_proba = self.predict_proba()
return np.mean(-1.0 * (y_true * np.log(y_pred_proba) + (1.0 - y_true) * np.log(1.0 - y_pred_proba)))
def _calc_gradient(self):
y_pred = self.predict()
d_w = (y_pred - self.y).dot(self.x) / len(self.y)
d_b = np.mean(y_pred - self.y)
return d_w, d_b
def _update_step(self):
d_w, d_b = self._calc_gradient()
self.w = self.w - self.lr * d_w
self.b = self.b - self.lr * d_b
return self.w, self.b
clf = logisticregression(learning_rate=0.1, max_iter=500, seed=272)
clf.fit(x, y)
機器學習之邏輯回歸
什麼叫邏輯回歸?簡單來講便是目標值只有,而線性回歸的目標值卻是乙個區域 0,1 可以代表得病沒得病,正確錯誤,etc.那麼怎麼才能把給定的輸入值正確的分類到呢,下面就介紹乙個特別的函式 sigmoid函式,g z 1 1 exp z 啥都不說先上圖。上圖便是sigmoid函式圖了,之所以引用這個函式...
機器學習之 邏輯回歸
邏輯回歸又稱logistic回歸,邏輯斯諦回歸,是一種廣義的線性回歸分析模型。sigmoid函式也是神經網路中常用的函式,用於把x從負無窮到正無窮壓縮到y從0到1之間。畫出來就是一條s型曲線,如下圖中的藍色曲線 它以0點為中心對稱,公式如下 當x值接近負無窮時,分母很大,s x 接近0,當x接近正無...
機器學習之邏輯回歸
知識點 邏輯回歸 只能解決二分類問題 損失函式 1 均方誤差 不存在多個區域性最低點 只有乙個最小值 2 對數似然損失 存在多個區域性最小值 改善方法 1 多次隨機初始化,多次比較最小值結果 2 調整學習率 邏輯回歸缺點 不好處理多分類問題 生成模型 有先驗概率 邏輯回歸,隱馬爾科夫模型 判別模型 ...