机器学习(三)-单变量线性回归算法

@tocpython

1 预测数值型数据:回归

1.1 什么是回归?

  • 大天然让咱们回归到必定的区间范围以内;反过来讲就是,有一个平均的水平,可让突出的事物能向他靠拢。
  • 回归是由达尔文(Charles Darwin)的表兄弟Francis Galton发明的。 Galton于1877年完成了第一次回归预测,目的是根据上一代豌豆种子(双亲)的尺寸来预测下一代豌豆种子(孩子)的尺寸。Galton在大量对象上应用了回归分析,甚至包括人的身高。他注意到,若是双亲的高度比平均高度高,他们的子女也倾向于比平均高度高,但尚不及双亲。孩子的高度向着平均高度回退(回归)。Galton在多项研究上都注意到这个现象,因此尽管这个英文单词跟数值预测没有任何关系,但这种研究方法仍被称做回归 2 。
  • 那些高个子的后代的身高,有种回归到大众身高的趋势。 eg: 姚明身高2米26,叶莉身高1米90, 可是他们后代的身高是会逐渐回归到正常的身高水平。

在这里插入图片描述

1.2 回归的目的是预测数值型的目标值。

1.3 回归能够作什么事?

回归能够作任何事情。然而大多数公司经常使用回归法作一些比较沉闷的事情,例如:算法

  • 销售量预测
  • 制造缺陷预测。

固然也能够作有新意的应用,例如:数组

  • 预测名人的离婚率。
  • 预测所在地区的房价。

2 线性回归模型表示

2.1 线性回归的基本概念

  • 回归,通常都是指线性回归(linear regression).

从咱们最熟悉的开始, 已知两点,求直线公式设 y = ax+b, 带入两点,求得解析解为 y = 3x-60dom

在这里插入图片描述

  • 回归方程 (regression equation): y = 3x-60
  • 回归系数 (regression weights): 3和-60能够称为回归系数
  • 回归: 求这些回归系数的过程

2.2 西安高新区房价预测

这个例子是预测住房价格的,咱们要使用一个数据集,数据集包含西安市的住房价格。在这里,我要根据不一样房屋尺寸所售出的价格,画出个人数据集。比方说,若是你朋友的房子是40平方米大小,你要告诉他们这房子能卖多少钱。那么,你能够作的一件事就是构建一个模型,也许是条直线,从这个数据模型上来看,也许你能够告诉你的朋友,他能以大约78万(人民币)左右的价格卖掉这个房子。这就是监督学习算法的一个例子。
在这里插入图片描述机器学习

m:表示训练集数据的总量
    x:表示输入变量
    y:表示输出变量
    (x,y): 表示一个训练样本
    (x(i),y(i)): 表示第i个训练样本

在这里插入图片描述

3 回归的通常方法

3.1 线性回归的通常步骤

在这里插入图片描述
对于一元线性回归(单变量线性回归)来讲,学习算法为 y = ax + b
咱们换一种写法: hθ(x) = θ0 + θ1x1函数

3.2 利用Sklearn作线性回归的预测

  • 实现步骤
    1). 模拟数据
    2). 调用sklearn拟合数据, 把theta0 theta1求出来
    3). 预测
from sklearn.linear_model import LinearRegression
import numpy as np

# 1).模拟数据
X = np.random.rand(100, 1)
Y = 4 + 2 * X + np.random.randn(100, 1)

# 2). 调用sklearn拟合数据, 把theta0 theta1求出来
# 导入线性回归类
lin_reg = LinearRegression()
# 让线性回归类作训练
lin_reg.fit(X, Y)
# 输出theta0 theta1; intercept_是截距, coef_是斜率系数;
print("\ntheat0, theta1:", lin_reg.intercept_, lin_reg.coef_)

# 3). 预测
X_new = np.array([[0], [1]])
print("\nx=0, x=1预测结果:\n", lin_reg.predict(X_new))
  • 测试结果:

在这里插入图片描述

3 损失/代价函数

3.1 拟合

  • 线性回归实际上要作的事情就是: 选择合适的参数(θ0, θ1),使得hθ(x)方程,很好的拟合训练集。实现如何把最有可能的直线与咱们的数据相拟合。
  • 拟合就是把平面上一系列的点,用一条光滑的曲线链接起来。由于这条曲线有无数种可能,从而有各类拟合方法。拟合的曲线通常能够用函数表示.

下面的三张图, 展现了拟合的三种状态:学习

  • 图一是部分拟合
  • 图二是彻底不拟合
  • 图三是彻底拟合

在这里插入图片描述

3.2 损失函数: 均方偏差MSE

  • 拟合过程当中由于theta0和theta1的取值准确度, 预测的结果与训练集中的实际值有差距。
咱们选择的参数决定了咱们获得的直线相对于咱们的训练集的准确程度,模型所预测的值与训练集中实际值之间的差距(下图中蓝线所指)就是建模偏差(modeling error)。

在这里插入图片描述

  • 咱们的目标即是选择出可使得建模偏差的平方和可以最小的模型参数。 即便得损函数最小。

在这里插入图片描述

3.3 均方偏差MSE最小化

  • 二维空间求均方差

在这里插入图片描述
上图是参考吴恩达视频的图片, 咱们会发现随着theta1的不断变化, 均方偏差MSE会找到一个最小值。 若是从数学角度来看, 就是求解函数的导数,计算函数的最小值。测试

  • 三维空间求均方差

在这里插入图片描述

上图是参考吴恩达视频的图片, 咱们会发现随着theta0和theta1的不断变化, 均方偏差MSE会找到一个最小值。为了经过图形化看到最小的均方差, 三维图片并不直观。 一般使用等高线实现。以下图:
在这里插入图片描述spa

  • 更高维空间

咱们会遇到更复杂、更高维度、更多参数的状况,而这些状况是很难画出图的,所以更没法将其可视化,所以咱们真正须要的是编写程序来找出这些最小化代价函数的和的值,而梯度降低算法就是可以自动地找出能使代价函数最小化的参数和的值。3d

4 梯度降低

4.1 梯度降低的思想

梯度降低是一个用来求函数最小值的算法,咱们将使用梯度降低算法来求出代价函数的最小值。
在这里插入图片描述

梯度降低背后的思想是:开始时咱们随机选择一个参数的组合,计算代价函数,而后咱们寻找下一个能让代价函数值降低最多的参数组合。咱们持续这么作直到到到一个局部最小值(local minimum),由于咱们并无尝试完全部的参数组合,因此不能肯定咱们获得的局部最小值是否即是全局最小值(global minimum),选择不一样的初始参数组合,可能会找到不一样的局部最小值。

在这里插入图片描述

4.2 梯度降低的分类

想象一下你正站立在山的这一点上,站立在你想象的公园这座红色山上,在梯度降低算法中,咱们要作的就是旋转360度,看看咱们的周围,并问本身要在某个方向上,用小碎步尽快下山。这些小碎步须要朝什么方向?若是咱们站在山坡上的这一点,你看一下周围,你会发现最佳的下山方向,你再看看周围,而后再一次想一想,我应该从什么方向迈着小碎步下山?而后你按照本身的判断又迈出一步,重复上面的步骤,从这个新的点,你环顾四周,并决定从什么方向将会最快下山,而后又迈进了一小步,并依此类推,直到你接近局部最低点的位置。

  • 公式:

在这里插入图片描述

  • 理解

    • a是学习率(learning rate),它决定了咱们沿着能让代价函数降低程度最大的方向向下迈出的步子有多大;
    • 若是α过小的话,梯度降低会很慢
    • 若是α太大的话,梯度降低越过最小值,不只不会收敛,并且有可能发散
    • 不论斜率正或负,梯度降低都会逐渐趋向最小值
    • 即便学习率α是固定不变的,梯度降低也会收敛到一个最低点
  • 梯度降低的两种更新方式:

在这里插入图片描述

4.2.1 “Batch” Gradient Descent 批梯度降低

批梯度降低:指的是每降低一步,使用全部的训练集来计算梯度值

  • 在梯度降低中,在计算微分求导项时,咱们须要进行求和运算,因此,在每个单独的梯度降低中,咱们最终都要计算这样一个东西,这个项须要对全部个训练样本求和。所以,批量梯度降低法这个名字说明了咱们须要考虑全部这一"批"训练样本,
  • 代码实现
"""
线性回归实现梯度降低的批处理(batch_gradient_descent )
"""
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 = 100000
m = 100

# 1.初始化theta, w0...wn
theta = np.random.randn(2, 1)
count = 0

# 4. 不会设置阈值,之间设置超参数,迭代次数,迭代次数到了,咱们就认为收敛了
for iteration in range(n_iterations):
    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)
  • 执行结果

在这里插入图片描述

4.2.2 “Stochastic” Gradient Descent 随机梯度降低

随机梯度降低:指的是每降低一步,使用一条训练集来计算梯度值

4.2.3 “Mini-Batch” Gradient Descent “Mini-Batch”梯度降低

“Mini-Batch”梯度降低:指的是每降低一步,使用一部分的训练集来计算梯度值

相关文章
相关标签/搜索