1、线性回归
原理我也没看懂。。。数学不好哎。
均方误差是回归中常用的线性度量:
J
(
θ
)
=
1
2
∑
j
=
1
n
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
2
J(\theta)=\frac{1}{2}\sum_{j=1}^{n}(h_{\theta}(x^{(i)})-y^{(i)})^2
J(θ)=21j=1∑n(hθ(x(i))−y(i))2
2、线性回归损失函数、代价函数、目标函数
- 损失函数(Loss Function):度量单样本预测的错误程度,损失函数值越小,模型就越好。
- 代价函数(Cost Function):度量全部样本集的平均误差。
- 目标函数(Object Function):代价函数和正则化函数,最终要优化的函数。
2.1损失函数
(https://github.com/scutan90/DeepLearning-500-questions/blob/master/ch02_机器学习基础/第二章_机器学习基础.md)
机器学习通过对算法中的目标函数进行不断求解优化,得到最终想要的结果。分类和回归问题中,通常使用损失函数或代价函数作为目标函数。 损失函数用来评价预测值和真实值不一样的程度。通常损失函数越好,模型的性能也越好。 损失函数可分为经验风险损失函数和结构风险损失函数。经验风险损失函数指预测结果和实际结果的差别,结构风险损失函数是在经验风险损失函数上加上正则项。 下面介绍常用的损失函数:
(1)0-1损失函数 如果预测值和目标值相等,值为0,如果不相等,值为1。
L
(
Y
,
f
(
x
)
)
=
{
1
,
Y
≠
f
(
x
)
0
,
Y
=
f
(
x
)
L(Y, f(x)) = \begin{cases} 1,& Y\ne f(x)\ 0,& Y = f(x) \end{cases}
L(Y,f(x))={1,Y=f(x) 0,Y=f(x)一般的在实际使用中,相等的条件过于严格,可适当放宽条件:
L
(
Y
,
f
(
x
)
)
=
{
1
,
∣
Y
−
f
(
x
)
∣
⩾
T
0
,
∣
Y
−
f
(
x
)
∣
<
T
L(Y, f(x)) = \begin{cases} 1,& |Y-f(x)|\geqslant T\ 0,& |Y-f(x)|< T \end{cases}
L(Y,f(x))={1,∣Y−f(x)∣⩾T 0,∣Y−f(x)∣<T
(2)绝对值损失函数 和0-1损失函数相似,绝对值损失函数表示为:
L
(
Y
,
f
(
x
)
)
=
∣
Y
−
f
(
x
)
∣
L(Y, f(x)) = |Y-f(x)|
L(Y,f(x))=∣Y−f(x)∣
(3)平方损失函数
L
(
Y
,
f
(
x
)
)
=
∑
N
(
Y
−
f
(
x
)
)
2
L(Y, f(x)) = \sum_N{(Y-f(x))}^2
L(Y,f(x))=N∑(Y−f(x))2这点可从最小二乘法和欧几里得距离角度理解。最小二乘法的原理是,最优拟合曲线应该使所有点到回归直线的距离和最小。
(4)对数损失函数
L
(
Y
,
P
(
Y
∣
X
)
)
=
−
log
P
(
Y
∣
X
)
L(Y, P(Y|X)) = -\log{P(Y|X)}
L(Y,P(Y∣X))=−logP(Y∣X) 常见的逻辑回归使用的就是对数损失函数,有很多人认为逻辑回归的损失函数是平方损失,其实不然。逻辑回归它假设样本服从伯努利分布(0-1分布),进而求得满足该分布的似然函数,接着取对数求极值等。逻辑回归推导出的经验风险函数是最小化负的似然函数,从损失函数的角度看,就是对数损失函数。
(5)指数损失函数 指数损失函数的标准形式为:
L
(
Y
,
f
(
x
)
)
=
exp
(
−
Y
f
(
x
)
)
L(Y, f(x)) = \exp(-Yf(x))
L(Y,f(x))=exp(−Yf(x))例如AdaBoost就是以指数损失函数为损失函数。
(6)Hinge损失函数 Hinge损失函数的标准形式如下:
L
(
y
)
=
max
(
0
,
1
−
t
y
)
L(y) = \max{(0, 1-ty)}
L(y)=max(0,1−ty)统一的形式:
L
(
Y
,
f
(
x
)
)
=
max
(
0
,
Y
f
(
x
)
)
L(Y, f(x)) = \max{(0, Yf(x))}
L(Y,f(x))=max(0,Yf(x))其中y是预测值,范围为(-1,1),t为目标值,其为-1或1。在线性支持向量机中,最优化问题可等价于
w
,
b
min
∑
i
=
1
N
(
1
−
y
i
(
w
x
i
+
b
)
)
+
λ
∥
w
∥
2
\underset{\min}{w,b}\sum_{i=1}^N (1-y_i(wx_i+b))+\lambda\Vert w\Vert ^2
minw,bi=1∑N(1−yi(wxi+b))+λ∥w∥2上式相似于下式
1
m
∑
i
=
1
N
l
(
w
x
i
+
b
y
i
)
+
∥
w
∥
2
\frac{1}{m}\sum_{i=1}^{N}l(wx_i+by_i) + \Vert w\Vert ^2
m1i=1∑Nl(wxi+byi)+∥w∥2其中
l
(
w
x
i
+
b
y
i
)
l(wx_i+by_i)
l(wxi+byi)是Hinge损失函数,
∥
w
∥
2
\Vert w\Vert ^2
∥w∥2可看做为正则化项。
思考:既然代价函数已经可以度量样本集的平均误差,为什么还要设定目标函数?
(知乎看的,我觉得应该是这样)目标函数是最终需要优化的函数,其中包括经验损失和结构损失。经验损失就是传说中的损失函数或者代价函数。结构损失就是正则项之类的来控制模型复杂程度的函数。
当模型复杂度增加时,有可能对训练集可以模拟的很好,但是预测测试集的效果不好,出现过拟合现象,这就出现了所谓的“结构化风险”。结构风险最小化即为了防止过拟合而提出来的策略,定义模型复杂度为𝐽(𝐹)J(F),目标函数可表示为:
m
i
n
f
∈
F
1
n
∑
i
=
1
n
L
(
y
i
,
f
(
x
i
)
)
+
λ
J
(
F
)
\underset{f\in F}{min}\, \frac{1}{n}\sum^{n}_{i=1}L(y_i,f(x_i))+\lambda J(F)
f∈Fminn1i=1∑nL(yi,f(xi))+λJ(F)
3、线性回归的优化方法
3.1 梯度下降法(batch gradient descent)
设定初始参数
θ
\theta
θ,不断迭代,使得
J
(
θ
)
J(\theta)
J(θ)最小化:
θ
j
:
=
θ
j
−
α
∂
J
(
θ
)
∂
θ
\theta_j:=\theta_j-\alpha\frac{\partial{J(\theta)}}{\partial\theta}
θj:=θj−α∂θ∂J(θ)
其中
α
\alpha
α是学习率,它决定了我们沿着能让代价函数下降程度最大的方向向下迈出的步子有多大。
梯度下降法步骤如下:
(1)确定优化模型的假设函数及损失函数。 举例,对于线性回归,假设函数为:
h
θ
(
x
1
,
x
2
,
.
.
.
,
x
n
)
=
θ
0
+
θ
1
x
1
+
.
.
.
+
θ
n
x
n
h_\theta(x_1,x_2,...,x_n)=\theta_0+\theta_1x_1+...+\theta_nx_n
hθ(x1,x2,...,xn)=θ0+θ1x1+...+θnxn 其中,
θ
i
,
x
i
(
i
=
0
,
1
,
2
,
.
.
.
,
n
)
\theta_i,x_i(i=0,1,2,...,n)
θi,xi(i=0,1,2,...,n)分别为模型参数、每个样本的特征值。 对于假设函数,损失函数为:
J
(
θ
0
,
θ
1
,
.
.
.
,
θ
n
)
=
1
2
m
∑
m
j
=
0
(
h
θ
(
x
0
(
j
)
,
x
1
(
j
)
,
.
.
.
,
x
n
(
j
)
)
−
y
j
)
2
J(\theta_0,\theta_1,...,\theta_n)=\frac{1}{2m}\sum^{m}{j=0}(h\theta (x^{(j)}_0 ,x^{(j)}_1,...,x^{(j)}_n)-y_j)^2
J(θ0,θ1,...,θn)=2m1∑mj=0(hθ(x0(j),x1(j),...,xn(j))−yj)2(2)相关参数初始化。 主要初始化
θ
i
{\theta}_i
θi、算法迭代步长${\alpha}
、
终
止
距
离
、终止距离
、终止距离{\zeta}
。
初
始
化
时
可
以
根
据
经
验
初
始
化
,
即
。初始化时可以根据经验初始化,即
。初始化时可以根据经验初始化,即{\theta}
初
始
化
为
0
,
步
长
初始化为0,步长
初始化为0,步长{\alpha}
初
始
化
为
1
。
当
前
步
长
记
为
初始化为1。当前步长记为
初始化为1。当前步长记为{\varphi}_i
。
当
然
,
也
可
随
机
初
始
化
。
(
3
)
迭
代
计
算
。
1
)
计
算
当
前
位
置
时
损
失
函
数
的
梯
度
,
对
。当然,也可随机初始化。(3)迭代计算。 1)计算当前位置时损失函数的梯度,对
。当然,也可随机初始化。(3)迭代计算。1)计算当前位置时损失函数的梯度,对{\theta}_i $,其梯度表示为:
∂
∂
θ
i
J
(
θ
0
,
θ
1
,
.
.
.
,
θ
n
)
=
1
2
m
∑
m
j
=
0
(
h
θ
(
x
0
(
j
)
,
x
1
(
j
)
,
.
.
.
,
x
n
(
j
)
)
−
y
j
)
2
\frac{\partial}{\partial \theta_i}J({\theta}_0,{\theta}1,...,{\theta}n)=\frac{1}{2m}\sum^{m}{j=0}(h\theta (x^{(j)}_0 ,x^{(j)}_1,...,x^{(j)}_n)-y_j)^2
∂θi∂J(θ0,θ1,...,θn)=2m1∑mj=0(hθ(x0(j),x1(j),...,xn(j))−yj)2 2)计算当前位置下降的距离。
φ
i
=
α
∂
∂
θ
i
J
(
θ
0
,
θ
1
,
.
.
.
,
θ
n
)
{\varphi}_i={\alpha} \frac{\partial}{\partial \theta_i}J({\theta}_0,{\theta}_1,...,{\theta}_n)
φi=α∂θi∂J(θ0,θ1,...,θn) 3)判断是否终止。 确定是否所有
θ
i
{\theta}_i
θi梯度下降的距离
φ
i
{\varphi}_i
φi都小于终止距离
ζ
{\zeta}
ζ,如果都小于
ζ
{\zeta}
ζ,则算法终止,当然的值即为最终结果,否则进入下一步。 4)更新所有的
θ
i
{\theta}_i
θi,更新后的表达式为:
θ
i
=
θ
i
−
α
∂
∂
θ
i
J
(
θ
0
,
θ
1
,
.
.
.
,
θ
n
)
{\theta}_i={\theta}_i-\alpha \frac{\partial}{\partial \theta_i}J({\theta}_0,{\theta}1,...,{\theta}n)
θi=θi−α∂θi∂J(θ0,θ1,...,θn)
θ
i
=
θ
i
−
α
1
m
∑
m
j
=
0
(
h
θ
(
x
0
(
j
)
,
x
1
(
j
)
,
.
.
.
,
x
n
(
j
)
)
−
y
j
)
x
i
(
j
)
\theta_i=\theta_i - \alpha \frac{1}{m} \sum^{m}{j=0}(h\theta (x^{(j)}_0 ,x^{(j)}_1,...,x^{(j)}_n)-y_j)x^{(j)}_i
θi=θi−αm1∑mj=0(hθ(x0(j),x1(j),...,xn(j))−yj)xi(j) 5)令上式
x
0
(
j
)
=
1
x^{(j)}_0=1
x0(j)=1,更新完毕后转入1)。 由此,可看出,当前位置的梯度方向由所有样本决定,上式中
1
m
\frac{1}{m}
m1、
α
1
m
\alpha \frac{1}{m}
αm1 的目的是为了便于理解。
3.2最小二乘法矩阵求解
3.3牛顿法和拟牛顿法
先不说这个,我觉得我暂时用不上
3.4线性回归的评价指标
Python实现
调用sklearn
# -*- coding: UTF-8 -*-
import numpy as np
from sklearn.linear_model import LinearRegression
"""
sklearn.linear_model参数详解:
fit_intercept : 默认为True,是否计算该模型的截距。如果使用中心化的数据,可以考虑设置为False,不考虑截距。
注意这里是考虑,一般还是要考虑截距
normalize: 默认为false. 当fit_intercept设置为false的时候,这个参数会被自动忽略。
如果为True,回归器会标准化输入参数:减去平均值,并且除以相应的二范数。
在这里还是建议将标准化的工作放在训练模型之前。通过设置sklearn.preprocessing.StandardScaler来实现,而在此处设置为false
copy_X : 默认为True, 否则X会被改写
n_jobs: int 默认为1. 当-1时默认使用全部CPUs ??(这个参数有待尝试)
可用属性:
coef_:训练后的输入端模型系数,如果label有两个,即y值有两列。那么是一个2D的array
intercept_: 截距
可用的methods:
fit(X,y,sample_weight=None): X: array, 稀疏矩阵 [n_samples,n_features] y: array [n_samples, n_targets]
sample_weight: 权重 array [n_samples] 在版本0.17后添加了sample_weight
get_params(deep=True): 返回对regressor 的设置值
predict(X): 预测 基于 R^2值
score: 评估
参考https://blog.csdn.net/weixin_39175124/article/details/79465558
"""
# 生成数据
# 生成随机数
np.random.seed(1234)
x = np.random.rand(500, 3)
# 构建映射关系,模拟真实的数据待预测值,映射关系为y = 4.2 + 5.7*x1 + 10.8*x2,可自行设置值进行尝试
y = x.dot(np.array([4.2, 5.7, 10.8]))
# 调用模型
lr = LinearRegression(fit_intercept=True)
# 训练模型
lr.fit(x, y)
print("估计的参数值为:%s" % (lr.coef_))
# 计算R平方
print("R2:%s" % (lr.score(x, y)))
# 任意设定变量,预测目标值
x_test = np.array([2, 4, 5]).reshape(1, -1)
y_hat = lr.predict(x_test)
print("预测值为:%s" % (y_hat))
最小二乘法
class LR_LS():
def __init__(self):
self.w = None
def fit(self, X, y):
# 最小二乘法矩阵求解
# ============================= show me your code =======================
self.w = np.linalg.inv(X.transpose().dot(X)).dot(X.transpose()).dot(y)
# ============================= show me your code =======================
def predict(self, X):
# 用已经拟合的参数值预测新自变量
# ============================= show me your code =======================
y_pred = X.dot(self.w)
# ============================= show me your code =======================
return y_pred
if __name__ == "__main__":
lr_ls = LR_LS()
lr_ls.fit(x, y)
print("估计的参数值:%s" % (lr_ls.w))
x_test = np.array([2, 4, 5]).reshape(1, -1)
print("预测值为: %s" % (lr_ls.predict(x_test)))
梯度下降法
这个我还不会呢。。。。我再学学。。。。