ng-逻辑回归

声明:取机器学习中约定俗成的写法,下文中的 logln

逻辑回归

y值仅有两种结果0/1,我们要做的是分类数据。(二元分类问题)
引入sigmoid函数 $$g(z)=\frac1{1+e^{-z}}\quad{0<g(z)<1} $$ 考虑到矢量性,我们引入这样一个逻辑回归函数 $$f_{\overrightarrow{\mathrm{w}},b}(\vec{\mathrm{x}})=g(\underbrace{\mathrm{w}\cdot\vec{\mathrm{x}}+b}_{\mathbb{z}})=\frac1{1+e^{-(\vec{\mathrm{w}}\cdot\vec{\mathrm{x}}+b)}} $$ 我们可以将这个函数理解为分类的概率,也就是 $$f_{\overrightarrow{\mathrm{w}},b}(\vec)=P({y=1|\vec;\vec,b}) $$ 自然地我们要考虑决策边界的问题,也就说我们认为P大于多少时,事件为1,小于多少时事件为0。一个自然地想法是以0.5为边界,由于恰好z=0为sigmoid=0.5的点,因此我们认为这样的关系式成立。 $$\begin{aligned}\vec{\mathrm{w}}\cdot\vec{\mathrm{x}}+b&\geq0\\\widehat{y}&=1\end{aligned} $$ 而曲线(直线) $$z=\overrightarrow{\mathrm{w}}\cdot{\mathrm{\vec{x}}}+b=0 $$ 称为决策边界(线性决策边界) 自然,并非所有决策边界都是线性的,通过将x1,x2等坐标非线性化,可以拟合出非线性决策边界。

代价函数

我们如果还使用之前的残差平方和代价函数,会失望的发现这个函数歪歪扭扭,很容易陷入某个局部最优解,为此,考虑到sigmoid函数的性质,我们引入这样一个新的代价函数 $$L\big(f_{\vec{w},b}\big(\vec{x}^{(i)}\big),y^{(i)}\big)=\begin{cases}\quad-\log\big(f_{\vec{w},b}\big(\vec{x}^{(i)}\big)\big)&y^{(i)}=1\\-\log\big(1-f_{\vec{w},b}\big(\vec{x}^{(i)}\big)\big)&y^{(i)}=0\end{cases} $$ 这个函数在数学上的感觉是很正确,很合理的。
我们还可以采用一种更巧妙的写法来避免分类讨论
L(fw⃗, b(x⃗(i)), y(i)) = −y(i)log(fw⃗, b(x⃗(i))) − (1 − y(i))log(1 − fw⃗, b(x⃗(i))) 求和 $$J=\frac1m\sum_{i=1}^m[L({f_{\vec{w},b}(\vec{x}^{(i)}),y^{(i)}})] $$ $$=-\frac{1}{m}\sum_{i=1}^{m}\left[y^{(i)}\mathrm{log}\left({f_{\vec{v},b}(\vec{x}^{(i)})}\right)+(1-y^{(i)})\mathrm{log}\left(1-{f_{\vec{v},b}(\vec{x}^{(i)})}\right)\right] $$ (最大似然估计)

实现梯度下降

我们依然通过迭代这两步来实现w b的更新 $$\begin{aligned} &w_{j}=w_{j}-\alpha\frac{\partial}{\partial w_{j}}J({\vec{w}},b) \\ &b=b-\alpha\frac{\partial}{\partial b}J({\overrightarrow{w}},b) \end{aligned} $$ 最终得出 $$ w_{j} =w_{j} -\alpha \frac{1}{m} \sum_{i=1}^{m}(f_{w,x}( \overrightarrow{x^{(i)}})-\overrightarrow{y}^{(i)} )x_{j} ^{(i)}$$ 同理可得 $$ b =b -\alpha \frac{1}{m} \sum_{i=1}^{m}(f_{w,x}( \overrightarrow{x^{(i)}})-\overrightarrow{y}^{(i)} ) $$ 有趣的是,这与week1的形式一致,只不过f已经不是原来的线性函数了。

过拟合问题与解决

如果预测函数拟合出了不该有的特征(仅仅几个数据局部特征),则称之为过拟合,为了惩罚导致过拟合的wi(通常是因为他们过大),我们尝试引入惩罚项,这就是正则化方法。
将代价函数改写为 $$\begin{aligned}J(\vec{\mathbf{w}},b)&=\quad\frac1{2m}\sum_{i=1}^m(f_{\vec{\mathbf{w}},b}(\vec{\mathbf{x}}^{(i)})-y^{(i)})^2+\frac\lambda{2m}\sum_{j=1}^nw_j^2\end{aligned} $$ 原有部分决定了拟合程度有多高,而增加的项旨在keep wj small,通过调整lamda的值来确保二者微妙的平衡。

线性回归的梯度下降更新为

$$\begin{gathered} \begin{aligned}\\\&w_j=w_j-\alpha\left[\frac1m\sum_{i=1}^m\left[(f_{\overline{w},b}(\vec{x}^{(i)})-y^{(i)})x_j^{(i)}\right]+\frac\lambda mw_j\right]\end{aligned} \\ b=b-\alpha\frac{1}{m}{\sum_{i=1}^{m}(f_{\vec{w},b}\big(\vec{x}^{(i)}\big)-y^{(i)}\big)} \end{gathered} $$

逻辑回归

$$J(\vec{w},b)=-\frac{1}{m}\sum_{i=1}^{m}\left[y^{(i)}\mathrm{log}\Big(f_{\vec{w},b}\big(\vec{x}^{(i)}\big)\Big)+\big(1-y^{(i)}\big)\mathrm{log}\Big(1-f_{\vec{w},b}\big(\vec{x}^{(i)}\big)\Big)\right]+\frac{\lambda}{2m}\sum_{j=1}^{n}w_{j}^{2} $$

作业(逻辑回归)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
import pandas as pd

data_path='data/week3ex1data.txt'
data=pd.read_csv(data_path,header=None)
X=data.iloc[:,:2].values
y=data.iloc[:,2].values

# 划分数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1, random_state=4)

# 数据标准化(对于逻辑回归通常是好的做法,但不是必须的)
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# 创建逻辑回归模型并训练
model = LogisticRegression(solver='lbfgs', max_iter=1000) # 使用'lbfgs'求解器,并增加最大迭代次数以确保收敛
model.fit(X_train, y_train)

# 在测试集上进行预测
y_pred = model.predict(X_test)

# 打印预测结果和实际结果进行对比(可选)
print("Predic:", y_pred)
print("Actual:", y_test)

# 对于新的数据点进行预测(你需要先对其进行相同的标准化处理)
new_data = [[1.5, 2.5]] # 示例新数据点,你需要替换为实际的值
new_data_scaled = scaler.transform(new_data)
new_prediction = model.predict(new_data_scaled)
print("Prediction for new data:", new_prediction)


ng-逻辑回归
http://example.com/2024/04/11/机器学习/ng机器学习week3/
作者
bradin
发布于
2024年4月11日
许可协议