【机器学习】--线性回归从初识到应用

=========================================================

声明:由于不同平台阅读格式不一致(尤其源码部分),所以获取更多阅读体验!!

请关注本人博客园地址:http://www.cnblogs.com/LHWorldBlog/

个人网站地址:http://www.lhworldblog.com/

==========================================================

一.前述

线性回归是机器学习的基础,所以比较重要。这里边线性是指一次回归实际上就是拟合。Copy过来一段线性回归的描述如下:确定一个唯一的因变量(需要预测的值)和一个或多个数值型的自变量(预测变量)之间的关系。线性回归是一种有监督的机器学习,何谓有监督:实际上就是我们的数据集既要有X,又要有Y。

二.原理 

先明确几个概念

1.比如y=a+bx是我们根据样本预测出来的曲线,那么这里面的a,b这些参数就是我们的模型(Model),我们的算法(Algorithm)就是这里面的公式。

2.最大似然估计(最大可能性概率):机器学习做的事情就是已知数据集X,Y求解拟合出来的曲线的参数w,而最大似然估计就是当w取什么值的时候代入公式中,x,y的出现概率最大

3.大自然的一切都是回归到一定区间之内的也就是趋于平均,所以我们可以大胆假设两个条件:

   3.1 预测出来的预测值和真实值之间的误差足够多的情况下的叠加的分布符合均值u为0,方差为某定值的正态分布。

   3.2 所有样本独立分布

 误差的概率密度函数:

误差函数:

 

把误差带进来:

 ps:以上最后求出最大似然估计,因为每个样本点是相互独立的,所以似然函数求最大,即为每个样本点相乘。

上式中取Log函数即:

要使上面似然函数最大,也就是让最后的误差函数最小!!!!

所以有两种办法:

第一种硬求:

根据数学中函数对上式求导后求解可得。

第二种最小梯度下降法:

梯度下降的核心是以最快的速度找到最优解 。我们的目的就是找到损失函数的一组w参数值,所以结合图像可知线性回归的图像是一个凸函数,也就是损失函数求导为0,也就是最低端与损失函数相切的那一组w参数。

 

因为我们最终是要使损失函数减小,所以我们沿着损失函数的切线走会下降的最快:

我们有如下公式使每一次的损失函数都减小:

 损失函数每一点的切线(也就是斜率)推导如下:

 

这里有梯度下降里面两种方法来迭代:

第一:批量梯度下降公式:

 

解剖公式:

所以总结如下:

1.每一次迭代每一个w调整的幅度是不一样的,每一轮迭代之间的每一轮对应的w0(可以推理到w1,w2,w3,w4...)也都是不一样的。

2.损失函数与w的图像中损失函数越小,每一组w与上一组w的差值也越来越小。如下图:

 

 

3.当Step(较小的时候),也就是步长较小的时候如图,迭代次数比较多。

4.当Step(步长大的时候),会来回震荡,但有可能找到全局最优解。

 5.梯度下降一般找到的是局部最优解,但模型一般堪用即可!!!!

 

第二种:随机梯度下降(优先选择!!!!!

因为每一轮迭代不需要所有真实值与预测值的差再乘以所调整的w对应行的x的值,而是随机选择某一行计算.

举例求w0:

(真实值-预测值)*该行对应的第一列的x的值即可求得w0,w1也是随机找到一行对应相乘,这样一组w秋晚,本轮迭代结束。开始下一轮。

总结:

1.优先随机梯度下降,因为计算速度比较快。

2.随机梯度下降可以跳出局部最小值,因为有可能随机到某一行真实值和误差值相差较大,而对应的x也比较大,所以下降的幅度比较大,有可能找到最优解!!!

 

代码1:根据公式自定义批量梯度下降。

import numpy as np

X = 2 * np.random.rand(100, 1)  # 随机取100个数,然后放到一列中去,是一个向量
y = 4 + 3 * X + np.random.randn(100, 1)  # randn 正态分布,(1列100行) 3,预测值  所以这里是真实值
X_b = np.c_[np.ones((100, 1)), X]  # 相当于100行两列,第一列全是1 ,第二列是一个随机的数
# print(X_b)

learning_rate = 0.22 #学习率,步长
n_iterations = 1000  #迭代100次
m = 100  # 100行样本

theta = np.random.randn(2, 1)# 初始w值
count = 0

for iteration in range(n_iterations):# 0-999迭代
    count += 1
    gradients = 1/m * X_b.T.dot(X_b.dot(theta)-y)# 梯度 X_b.dot(theta)-y   是一个向量  X_b.T.dot乘以后面相当于矩阵的一个转置乘以一个向量相当于每一行会分别相乘加和。和
    theta = theta - learning_rate * gradients#每一次迭代,是一组数,相当于一组w参数都解出来了

print(count)
print(theta)

结果:

 代码二:自定义随机梯度下降

import numpy as np


X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)
X_b = np.c_[np.ones((100, 1)), X]
# print(X_b)

n_epochs = 50 #这些超参数都可以自己调整
t0, t1 = 5, 50  # 超参数

m = 100


def learning_schedule(t):
    return t0 / (t + t1)

theta = np.random.randn(2, 1) #初始一组w值

for epoch in range(n_epochs): # 50次 0-50
    for i in range(m): #100次 0-99
        random_index = np.random.randint(m) #随机取一行,拿到这一行的标号
        xi = X_b[random_index:random_index+1] #取这行的所有X值,切片左闭右开
        yi = y[random_index:random_index+1]#取这行的Y值
        gradients = 2*xi.T.dot(xi.dot(theta)-yi)#(误差-真实值)*这一行的x值
        learning_rate = learning_schedule(epoch*m + i) #epoch*m+i越来越大 带到上面函数中,学习率越来越小 让步长越来越小 不会随机太大
        theta = theta - learning_rate * gradients

print(theta)
#PS 总结:迭代次数多了,但每一次迭代不用加和,每一次的迭代计算小了

结果:

代码三:sk_learn中随机梯度下降公式

import numpy as np
from sklearn.linear_model import SGDRegressor

X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)

sgd_reg = SGDRegressor(n_iter=50, penalty=None, eta0=0.1) # n_iter 步长  penalty  惩罚系数 eta0 最舒适的学习率,学习率不断下降
# print(X)
# print(y.ravel())# 相当于flat 压扁压平  多行一列的数据压扁成一行。。。一个行向量。
sgd_reg.fit(X, y.ravel()) #因为这个函数需要的y是一个行向量,所以压扁。

print(sgd_reg.intercept_, sgd_reg.coef_) # intercept_ w0   coef_ w1,w2,w3多个参数。

代码三中sk_learn中学习率源码:可以发现学习率也是越来越小的。

PS:总结批量梯度下降里面我们要调整迭代次数和学习率,随机梯度下降里面我们要调整迭代次数和学习率,让学习率越来越小。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

L先生AI课堂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值