线性回归(1)

作者 : 开心源码 本文共2799个字,预计阅读时间需要7分钟 发布时间: 2022-05-13 共126人阅读

MachineLearninginMarketing

感谢李宏毅《回归-案例研究》

部分内容为听取李宏毅老师讲座的笔记,也融入了自己对机器学习了解,个人推荐李宏毅老师的机器学习系列课程,尤其对于初学者强烈推荐。课程设计相对其余课程要容易了解。

在机器学习中算法通常分为回归和分类两种,今天我们讨论什么线性回归。以及如何设计一个线性回归模型。

什么回归

简单了解通过数据最终预测出来一个值。

回归问题的实例

就是找到一个函数,这个函数输入为宝可梦,而输出为宝可梦的进化后的 CP 值,所谓 CP 值就是宝可梦的战斗能力的指标。

Xcp : 表示宝可梦的战斗值
Xs:表示宝可梦的种类
Xhp : 表示生命值
Xw, Xh : 表示宝可梦的重量和高度

  1. 找一个模型
  2. 找一个最好的函数

设计模型

图1
y = b + W * Xcp
我们可以设计方程
图2
通过给不同参数 b 和 W 可以得到不同方程,我们任意带入参数得到不同方程,从而得到方程集合。而后我们从集合中筛选出最好的方程。我们可以根据常识过滤掉少量不正当方程。

找到第一个好的函数

import pandas as pdpokemon = pd.read_csv("pokemon.csv",sep=",")pokemon.head()print(pokemon.head())
      name species   cp  ...  attack_strong_type_new  attack_strong_value_new  notes0  Pidgey1  Pidgey  384  ...                  Flying                       30    NaN1  Pidgey2  Pidgey  366  ...                  Flying                       30    NaN2  Pidgey3  Pidgey  353  ...                  Flying                       30    NaN3  Pidgey4  Pidgey  338  ...                  Flying                       30    NaN4  Pidgey5  Pidgey  242  ...                  Dragon                       25    NaN
x_data = [338., 333.,328.,207.,226.,25.,179.,60.,208.,606.]y_data = [640.,633.,619.,393.,428.,27.,193.,66.,226.,1591.]

x 表示宝可梦的 cp 值,y 表示宝可梦的进化后的 cp 值

plt.scatter(x_data,y_data)plt.show()

定义 Loss 函数

Losss 函数接受函数(模型)做为参数,输出一个评价该函数不好程度的值,大家也就明白了,Loss 函数就是帮助我们在众多函数中找最好函数作为预测的模型。

x = np.arange(-200,-100,1) #biasy = np.arange(-5,5,0.1) #weightZ = np.zeros((len(x),len(y)))X, Y = np.meshgrid(x,y)for i in range(len(x)):    for j in range(len(y)):        b = x[i]        w = y[j]        Z[j][i] = 0        for n in range(len(x_data)):            Z[j][i] = Z[j][i] + (y_data[n] - b - w*x_data[n])**2        Z[j][i] = Z[j][i]/len(x_data)
b = -120w = -4lr = 0.0000001iteration = 100000b_history = [b]w_history = [w]for i in range(iteration):    b_grad = 0.0    w_grad = 0.0    for n in range(len(x_data)):        b_grad = b_grad - 2.0 *(y_data[n] - b - w*x_data[n]) * 1.0        w_grad = w_grad - 2.0 * (y_data[n] - b - w*x_data[n]) * x_data[n]    b = b - lr * b_grad    w = w - lr * w_grad# plotplt.contourf(x,y,Z,50,alpha=0.5,cmap=plt.get_cmap('jet'))plt.plot([-188.4],[2.67],'x',ms=12,markeredgewidth=3,color='orange')plt.plot(b_history,w_history,'o-',ms=3,lw=1.5,color='black')plt.xlim(-200,-100)plt.ylim(-5,5)plt.xlabel(r'$b$',fontsize=16)plt.ylabel(r'$w$',fontsize=16)plt.show()

在图上我们,这里颜色越偏红色值越大,表示函数越不好。

梯度下降

在函数有两个参数决定方程好坏,分别是 w 和 b,我们可以分别考量这两个参数。我们需要找到 w 让 L(w) 值最小,可以穷举所有 w 来找到 L(w),尽管这样做可行,但是没有效率的。我们需要随机选取一个 w ,通过梯度下降方式找到让曲线值输出值 y 最小的 w

随机选取 w 点
对 w 进行左移(添加)还是右移(减少)


从图上看,假如切线斜率是负数,显然左边 loss 值高,而右边loss 值比较低,所以要降低 loss 值需要添加 w 的值。

解释说明一下,模型(Model)是一系列函数集合,这里假设为 y = b + W*X(cp)。这一系列函数根据参数 b 和 w 来确定,这两个参数不同决定函数也就是不同。我们输入 X(cp) 是一个宝可梦的战斗值,而输出为宝可梦的进化后的 cp 值。下面是训练数据

这里 Loss 函数接受我们函数集合(模型 Model) 中一个一个函数作为参数,输出一个用于评估方程好坏的值,Loss 表示损失的意思,那么也就是这个值越小说明我们输入函数越好,对应 Loss 值最小函数也就是最佳函数。我们知道 w 和 b 就决定我们方程长成什么样子。所以我们 Loss 也就是评判这两个参数好坏的。
这个列子比较简单,我们就是客户 b + W*X(cp) 和期望值进行求差后平方,来计算函数计算值和期望值的差值,求平方表示距离而后对所有所有数据的偏差求和。

我们将 Model(方程集合)中可能方程一个一个带入到 Loss 方程后计算损失值来评估方程的好坏,值最小的那个就是我们要找的方程

那么如何在 Loss 方程找到最小值所对应的最佳函数呢?带着这个问题我们继续而后,首先我们将 Loss 函数在图上表示出来,我们需要找到最低点,也就是函数的最小值。

首先

怎样添加,添加多少最为合适

添加(也就是步进多少)取决两个参数分别为该点微分值学习率(learning rate),其中学习率是常数。学习率是我们事前定义好的。

bandicam 2019-07-28 11-00-59-225.jpg


根据学习率(learning-rate)和该点微分值我们一步一步地移动 w 值来寻觅最小 y 值,当移动到图中local optimal 局部小最值时候,以为概念微分为 0 所以我们就中止不前,其实全局最小值就不远处等着我们。我们就失去找到最小值的机会,大家不用担心梯度下降会帮助我们找到最小值。

从一个参数推广到两个参数

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 线性回归(1)

发表回复