在對數概率迴歸中,咱們將樣本的模型輸出\(y^*\)定義爲樣本爲正例的機率,將\(\frac{y^*}{1-y^*}\)定義爲概率(odds),概率表示的是樣本做爲正例的相對可能性。將概率取對即可以獲得對數概率(log odds,logit)。html
而對數概率迴歸(Logistic Regression)則試圖從樣本集中學得模型\(w^Tx\)並使其逼近該樣本的對數概率,從而能夠獲得:python
經過求解\(conditoin1\)能夠獲得:git
由此咱們能夠知道樣本\(x_i\)爲正例的機率能夠經過函數\(h(w^Tx_i)=\frac{1}{1+e^{-w^Tx_i}}\)來表示。而其中的函數\(h(z)\)便被稱爲Sigmoid函數,其圖像以下:算法
求其導數:函數
這是一個很好的性質,有利於簡化後面優化模型時的計算。測試
經過前面的推導,能夠獲得:優化
合併兩個式子,則有:spa
求出了樣本標記的分佈律,即可以經過極大似然法來估計分佈律中的參數\(w\)。先寫出極大似然函數:code
對極大似然函數取對能夠獲得對數似然函數:htm
在前面乘上負數因子即可以獲得對數概率迴歸的代價函數:
經過最小化上述代價函數即可以估計出參數\(w\)的值。
經過上述步驟,優化對數概率迴歸模型的關鍵變成了求解:
在《線性迴歸:梯度降低法優化》中,我已經詳細介紹了梯度降低法的數學原理,這裏直接使用梯度降低法來對對數概率迴歸模型進行優化。
對\(J(w)\)進行求導:
將\(\frac{\partial J}{\partial w}\)帶入參數\(w\)的更新公式\(w^*=w-\eta\frac{\partial J}{\partial w}\),最終獲得\(w\)的更新公式以下:
梯度降低優化算法:
def fit(self, X, y): self.W = np.zeros(X.shape[1] + 1) for i in range(self.max_iter): delta = self._activation(self._linear_func(X)) - y self.W[0] -= self.eta * delta.sum() self.W[1:] -= self.eta * (delta @ X) return self
導入鳶尾花數據集進行測試:
if __name__ == "__main__": from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn.metrics import classification_report irirs = datasets.load_iris() X = irirs["data"][:100] y = irirs["target"][:100] X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.7, test_size=0.3) classifier = LRClassifier().fit(X_train, y_train) y_pred = classifier.predict(X_test) print(classification_report(y_test, y_pred))
分類報告以下: