在对数概率回归中,咱们将样本的模型输出\(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))
分类报告以下: