ML-逻辑回归-公式推导- 多种实现

1.简介

逻辑回归并不是回归,是分类算法。通过函数映射,通常映射后的值>0.5称为正例,反之反例,这样的学习称为二分类。


2.数学背景

定义映射函数:

求导性质:


3.推导

令z表示线性关系:

其中x是给定的数据,b是偏置,是需要学习到的参数,通过这样映射得到y∈[0,1],记y为正例概率,1-y则是反例概率.

扫描二维码关注公众号,回复: 5244839 查看本文章

则:

记为概率形式,p1,p0有:

对正反比取对数发现:

结果就是z,也就是说z越大,正概率比反概率的比越大,越可能是正。这样的一个模型具有分类表示能力。 


4.联合概率

联合0、1概率可写在一起,为:

取对数时:

所以对数联合概率记为:


5.求参、极大似然

极大似然估计w,b的值,记m个样本的联合模型:

极大化

等价于极小化:

最终,转为对m个数据集D求极小化:


 6.参数求解:

求得参数后,就可以利用:

进行预测了,当y>0.5的时候意味着正的可能性比反的可能性大,既被预测为正例。 


7.牛顿法、拟牛顿法、梯度下降法等求参

1)牛顿法:https://blog.csdn.net/jiang425776024/article/details/87601854

2)拟牛顿法:https://blog.csdn.net/jiang425776024/article/details/87602847

3)梯度下降:https://blog.csdn.net/jiang425776024/article/details/87601506

方便起见,在这里需要求的是参数w,b的整体,根据5中的损失函数:

一阶导数为:

根据2中

因为

所以,二阶导数为:

 因此,牛顿法参数的迭代形式:

梯度下降只需要一阶导数,a为步长,一般∈[0,1],代入上面的1阶导数即可:

 


8.流程

输入:

 

过程:或者随机初始化参数

           while  总体变化量<某个阀值:对进行迭代更新


9.正则化

和其它算法一样,可以对参数进行正则化,L1\L2等,通常都是在损失函数后面加上形如L2正则化:\frac{1}{2}\alpha||\theta||_2^2,其中a为正则化强度,theta为模型参数。


10.多元逻辑回归

二分类中,形如:ln\frac{P(y=1|x,\theta )}{P(y=0|x,\theta)} = x\theta

多分类中假设有K>2个类别,则有K-1个方程:

ln\frac{P(y=1|x,\theta )}{P(y=K|x,\theta)} = x\theta_1ln\frac{P(y=2|x,\theta )}{P(y=K|x,\theta)} = x\theta_2,...,ln\frac{P(y=K-1|x,\theta )}{P(y=K|x,\theta)} = x\theta_{K-1}

则K元逻辑回归的概率分布如下:

P(y=k|x,\theta ) = e^{x\theta_k} \bigg/ 1+\sum\limits_{t=1}^{K-1}e^{x\theta_t},k = 1,2,...K-1

P(y=K|x,\theta ) = 1 \bigg/ 1+\sum\limits_{t=1}^{K-1}e^{x\theta_t}

剩下的多元逻辑回归的损失函数推导以及优化方法和二元逻辑回归类似。


11.scikit-learn中逻辑回归

主要是3个:LogisticRegressionLogisticRegressionCV logistic_regression_path

其中LogisticRegressionLogisticRegressionCV的主要区别是 LogisticRegressionCV使用了交叉验证来选择(9中正则化介绍的a)正则化系数C,LogisticRegression需要自己每次指定一个正则化系数。

logistic_regression_path主要用在模型选择。

使用:

这里不会详细介绍api的参数,点击可查看LogisticRegressionLogisticRegressionCV的参数说明,

或者:https://www.cnblogs.com/pinard/p/6035872.html

import numpy as np
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.linear_model import LogisticRegressionCV

'''
https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html#sklearn.linear_model.LogisticRegression
https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegressionCV.html#sklearn.linear_model.LogisticRegressionCV
'''

X, y = load_iris(return_X_y=True)

#solver='lbfgs'使用逆牛顿法迭代寻参
#random_state=0随机种子,这个很必要,数值随便
clf = LogisticRegression(random_state=0, C=2, solver='lbfgs', multi_class='multinomial').fit(X, y)#指定了正则化强度为2
clfcv = LogisticRegressionCV(random_state=0, solver='lbfgs', multi_class='multinomial').fit(X, y)#cv类自动寻找正则化强度

pd = clf.predict(X[:2, :])
pdcv = clf.predict(X[:2, :])
print(X[:2, :], '预测类型:', pd)
print(X[:2, :], '预测类型:', pdcv)

pbd = clf.predict_proba(X[:2, :])
pbdcv = clf.predict_proba(X[:2, :])
print(X[:2, :], '预测类型的概率:', pbd)
print(X[:2, :], '预测类型的概率:', pbdcv)

print('预测分数:', clf.score(X, y))
print('预测分数:', clfcv.score(X, y))

'''
[[5.1 3.5 1.4 0.2]
 [4.9 3.  1.4 0.2]] 预测类型: [0 0]
[[5.1 3.5 1.4 0.2]
 [4.9 3.  1.4 0.2]] 预测类型: [0 0]
[[5.1 3.5 1.4 0.2]
 [4.9 3.  1.4 0.2]] 预测类型的概率: [[9.89252266e-01 1.07477333e-02 2.22652613e-10]
 [9.82191282e-01 1.78087169e-02 6.46675701e-10]]
[[5.1 3.5 1.4 0.2]
 [4.9 3.  1.4 0.2]] 预测类型的概率: [[9.89252266e-01 1.07477333e-02 2.22652613e-10]
 [9.82191282e-01 1.78087169e-02 6.46675701e-10]]
预测分数: 0.9866666666666667
预测分数: 0.98

Process finished with exit code 0

'''

 

猜你喜欢

转载自blog.csdn.net/jiang425776024/article/details/87640618