机器学习启蒙

机器学习——线性回归

引言:”线性回归“这个是我接触的第一个机器学习,对于刚刚学习 机器学习的同学,这个是一个很好的入手点,下面我针对“线性回归”进行详细的介绍。

一、什么是线性回归,“线性回归”可以分成“线性”、“回归 ”:
例如方程:y=a*x+b
线性:它是一次方的线性变化
回归:回归到平均值(基于正态分布
总而言之:“线性回归” 就是利用线性模型结合回归性质,来拟合我们需要的数据,注意:做机器学习,没有完美解。因此我们最后得到的解不是一个完美解。

二、求解线性回归的模型和参数的定义:
例如:我们给定了一个模型 Y=XWT+b
其中 Y是一个(m,1)的矩阵,X是一个(m,n)的矩阵,并且YX的值是已知的,Wb是我们要求解的。类似于函数f(x)=ax+b,我们已知对组x——>f(x)的值,来求解a和b

三、求解这类型点问题有很多种:

  1. 代数解析解:
    已知: Y=XWT+b
    因为我们求出的解(Wb)不是完美解,所以最终我们得到的Y^和真实的Y是有差距的。我们定义每一个差值为 c(i),所以每一行的误差函数: c(i) = Y^(i)-Y(i)
    那要使得所有行的误差累计和最小,就成了我们点目标函数。
    误差累计函数的平方为:c2 ,当c2 = 0,这时候我们可以求出Wb的最优解,即:F(W,b) = (XWT+b-Y)2=0
    在求解的时候,我们可以对b进行处理,X最前面插入一维全是1的数据,这样 X(m,n+1)F(W,b) = F(W)=(XWT-Y)2=0
    最后我们得到结果 W = XTY/ XTX,其中b的值就是W的第0列的值。
    代码如下:

import numpy as np
import matplotlib.pyplot as plt
X = np.random.rand(100,1)
y = 4 + 3*X+np.random.randn(100,1)
X_b = np.c_[np.ones((100,1)),X]
theta_best = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)
print(theta_best)

  1. 梯度下降:(依旧是把b放在W里面)
    根据上面 解析解得到的 F(W)=(XWT-Y)2
    F(W)函数特性可以知道,这是一个凸函数。要求F(W)的最小值,可以对W进行求导。
    F(W)W求导的函数为g=(1/m)XT(X*WT-Y),1/m代表求平均,因为有m个样本。可以对当g=0时刻,此时F(W)有最小值。
    a.先初始化一组W
    b.然后计算g=(1/m)XT(X*WT-Y)
    c.然后更新WW '= W - rate*g),其中rate为学习率(步长)
    但是真实训练的时候,我们一般不会取g=0时刻那个值,当g趋近于我们定义的一个值时,我们就默认迭代收敛了,停止训练,获取当前的W
    重复 b和c 100次或者1000次,停止 b和c的迭代,取出此时的W,当然迭代次数可以自己定义,如果训练得到的W,不能很好的拟合现有数据样本,可以调整 rate迭代次数

上面我们用的是梯度下降,不断的调整W的值,直至使得g趋近一个定义好的值,训练样本用的是所有的样本数据。
梯度下降还有2种方法:随机梯度下架、批量梯度下降,原理都是类似的,就是在训练数据采集上不同:
1.梯度下降每次迭代,用的是所有的数据;
2.随机梯度下降每次用一个样本;
3.批量梯度下降每次从样本中,抽取n行样本进行训练;

梯度下降代码如下:

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)
learning_rate = 0.1
n_iterations = 10000
m = 100
theta = np.random.randn(2, 1)# 1,初始化theta,w0…wn
count = 0
for iteration in range(n_iterations):# 4,不会设置阈值,之间设置超参数,迭代次数,迭代次数到了,我们就认为收敛了
count += 1
# 2,接着求梯度gradient
gradients = 1/m * X_b.T.dot(X_b.dot(theta)-y)
# 3,应用公式调整theta值,theta_t + 1 = theta_t - grad * learning_rate
theta = theta - learning_rate * gradients
print(count)
print(theta)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值