Peter教你谈情说AI | 05用梯度下降法求线性回归模型

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/p23onzq/article/details/83189870

我们已经知道机器学习方式大体上分为两种类别:监督学习和非监督学习。

监督学习指的是人类给机器一大堆标示(label)过的数据,通常指机器通过学习一系列(, )数据,X代表输入数据(特征Feature),Y代表输出数据,然后自我推导到X -> Y的公式,用于未来其他数据的预测判断使用。监督学习根据输出数据又分为回归问题(Regression)和分类问题(Classfication)。回归问题通常输出是一个连续的数值,分类问题的输出是几个特定的数值。

举例如下:

(a) 回归问题 - 给定一张人脸照片,估计出这个人的年龄(年龄输出是一个连续的数值)

(b) 分类问题 - 假定一个人患有肿瘤,判断是为恶性还是良性(恶性和良性的输出是几个特定的数值)

640?wx_fmt=jpeg

这里我们先来看下回归问题里的线性回归模型。


线性回归

线性回归模型是:利用线性函数对一个或多个自变量 (x 或 (640?wx_fmt=png))和因变量(y)之间的关系进行拟合的模型。即:

640?wx_fmt=png

向量形式为:640?wx_fmt=png其中 640?wx_fmt=png


将训练样本的 x 逐个带入后,得出的预测年薪 f(x)'与真实f(x)的差异越小越接近线性回归模型。怎么衡量这个整体差距呢?我们用下面这个公式,我们把它叫做为损失函数

形式如下:

640?wx_fmt=jpeg

那么模型的优化目标为最小化损失函数。要最小化损失函数,需要沿下降速度最快的方向走,使目标函数最小化。这就用到了上一节讲过的算法:梯度下降法,来对其进行求解。


梯度下降法求解目标函数

举例线性回归的目标函数为:

640?wx_fmt=jpeg

对于 J(a,b) 而言,有两个参数 a 和 b,函数 J 分别对自变量 a 和 b 取偏微分的结果是:

640?wx_fmt=jpeg

所以我们要做得是:

Step 1:任意给定 a 和 b 的初值,a = 0; b = 0;

Step 2:用梯度下降法求解 a 和 b,伪代码如下:

640?wx_fmt=jpeg

当下降的高度小于某个指定的阈值(近似收敛至最优结果),则停止下降。

将上面展开的式子带入上面代码,就是:

640?wx_fmt=jpeg

所以梯度下降的通用形式

640?wx_fmt=png


编写线性回归训练/预测程序

如果我们要用代码实现线性回归程序应该怎样做呢?当然,你可以按照上面的描述,自己从头用代码实现一遍。

不过,其实不必。因为我们已经有很多现成的方法库,可以直接调用了。最常见的是 sklearn 库。

下面的举个例子,表格中列举了美国纽约若干程序员职位的年薪

640?wx_fmt=jpeg

我们用前6个数据作为训练集,后面5个作为测试集,来看看结果:

    import matplotlib.pyplot as plt
    import numpy as np
    from sklearn import datasets, linear_model
    from sklearn.metrics import mean_squared_error, r2_score

    experiences = np.array([0,1,2,3,4,5,6,7,8,9,10])
    salaries = np.array([103100104900106800108700110400112300114200116100117800119700121600])

    # 将特征数据集分为训练集和测试集,除了最后5个作为测试用例,其他都用于训练
    X_train = experiences[:7]
    X_train = X_train.reshape(-1,1)
    X_test = experiences[7:]
    X_test = X_test.reshape(-1,1)

    # 把目标数据(特征对应的真实值)也分为训练集和测试集
    y_train = salaries[:7]
    y_test = salaries[7:]

    # 创建线性回归模型
    regr = linear_model.LinearRegression()

    # 用训练集训练模型——看就这么简单,一行搞定训练过程
    regr.fit(X_train, y_train)

    # 用训练得出的模型进行预测
    diabetes_y_pred = regr.predict(X_test)

    # 将测试结果以图标的方式显示出来
    plt.scatter(X_test, y_test,  color='black')
    plt.plot(X_test, diabetes_y_pred, color='blue', linewidth=3)

    plt.xticks(())
    plt.yticks(())

    plt.show()

最终结果是这个样子的:

640?wx_fmt=jpeg


【推荐阅读】

Peter教你谈情说AI | 01导读

Peter教你谈情说AI | 02什么是机器学习

Peter教你谈情说AI | 03机器学习三要素

Peter教你谈情说AI | 04梯度下降法


轻轻一扫  欢迎关注~

640?wx_fmt=jpeg

如果觉得好,请

转发

转发

转发

猜你喜欢

转载自blog.csdn.net/p23onzq/article/details/83189870