查看原文
其他

使用tensorflow做梯度下降的线性回归

柯广 大数据技术派 2022-10-15

tensorflow的安装


tensorflow支持的操作系统:

  • Ubuntu 16.04 或更高版本

  • Windows 7 或更高版本

  • macOS 10.12.6 (Sierra) 或更高版本(不支持 GPU)

  • Raspbian 9.0 或更高版本


在windows上安装,命令很简单:pip3 install tensorflow,因为我装了双版本Python,所以执行需要加上版本号。

注意:需要保证是 64位的Python 3.4、3.5 或 3.6版本,否则会有报错信息:

ERROR: Could not find a version that satisfies the requirement tensorflow (from versions: none)
ERROR: No matching distribution found for tensorflow


cmd命令行进入Python环境,64位Python版本信息是这样的

Python 3.6.6 (v3.6.6:4cf1f54eb7Jun 27 2018, 03:37:03) [MSC v.1900 64 bit (AMD64)] on win32

[MSC v.1900 64 bit (AMD64)]  这几个字表示64位


windows安装官方文档:

https://www.tensorflow.org/install/pip


tensorflow支持在docker容器中运行,在docker环境下运行,tensorflow运行环境可以与系统环境隔开,不依赖于系统环境,却能共享主机的资源。

docker安装官方文档:https://www.tensorflow.org/install/docker


线性回归


不同于聚类,线性回归是一种有监督学习,标签是已知的。这里拿美国房价数据,共有81列,房价影响因素很多,简单起见,取其面积与房价两列,分别作为输入(特征),输出(标签),通过tensorflow训练得到一条线性回归表达式,以此来预测房价。


数据下载地址:https://www.kaggle.com/c/house-prices-advanced-regression-techniques/data

: 链接被”墙“,需要vpn下载,可以使用这个免费chrome浏览器插件,开通google账号,并且使用google账号登陆后,才能下载。chrome浏览器插件地址,复制地址到浏览器,按照安装向导安装浏览器插件即可:http://qiniu.ikeguang.com/software/ikeguang.com/%E8%B0%B7%E6%AD%8C%E8%AE%BF%E9%97%AE%E5%8A%A9%E6%89%8Bchrome%E7%89%88.rar



数据前20行是这样的:


8450208500
9600181500
11250223500
9550140000
14260250000
14115143000
10084307000
10382200000
6120129900
7420118000
11200129500
11924345000
12968144000
10652279500
10920157000
6120132000
11241149000
1079190000
13695159000
7560139000

房价与面积的关系,可以将这种关系写下来,如下所示:

其中:

  •  y指的房价,即我们试图预测的值。

  •  m指的是直线的斜率。

  •  x指的是房屋面积,即输入特征的值。

  •  b指的是 y 轴截距。


按照机器学习的惯例,需要写一个存在细微差别的模型方程式:

其中:

  • y'指的是预测标签(理想输出值)。

  • b指的是偏差(y 轴截距)。而在一些机器学习文档中,它称为w0 。

  • w1指的是特征 1 的权重。权重与上文中用m表示的“斜率”的概念相同。

  • x1指的是特征(已知输入项)。


假设这条直线拟合好后,与真实值肯定有误差,通常计算均方误差,这个均方误差的概念,很好理解。

均方误差 (MSE) 指的是每个样本的平均平方损失。要计算 MSE,请求出各个样本的所有平方损失之和,然后除以样本数量:

我们需要拿一个模型来训练数据,通常由一个初始点开始,逐渐迭代降低损失,迭代学习可以联想到“二分查找”,“Hot and Cold”这种寻找隐藏物品(如顶针)的儿童游戏。在我们的游戏中,“隐藏的物品”就是最佳模型。刚开始,您会胡乱猜测(的值为 0。),等待系统告诉您损失是多少。然后,您再尝试另一种猜测(w1 的值为 0.5。),看看损失是多少。哎呀,这次更接近目标了。实际上,如果您以正确方式玩这个游戏,通常会越来越接近目标。这个游戏真正棘手的地方在于尽可能高效地找到最佳模型。

降低损失 (Reducing Loss):梯度下降法


误差也叫损失,与模型参数,即w的关系,可以表示如下:

即y = wx + b中,横轴w就是要找的,需要找到一个最佳的权重w值,使得误差(损失)最小,曲线最低处倒数为0,显然是个极小值点,这个取值w,对应损失最小。根据,显然是存在的。

已经确定,这个参数w肯定存在,那么怎么找出来,怎么最快的找出来?


梯度下降法,可以帮助我们快速找到这个点,梯度概念简单提一下。

大家都知道,梯度始终指向损失函数中增长最为迅猛的方向。梯度下降法算法会沿着负梯度的方向走一步,以便尽快降低损失。


梯度始终指向损失函数中增长最为迅猛的方向”,我们想要快速减小损失函数,沿着负梯度的方向即可。


tensorflow代码


主要是读取训练数据,归一化(数据太大,无法训练),进行训练,最后进行误差梯度下降的展示。

import tensorflow as tf
import numpy as np
from matplotlib import pyplot as plt

def run():
    # 读取数据
    data = np.genfromtxt('data_areaSize_price.csv',delimiter=',',dtype=np.float)

    # 数据归一化
    x_data = np.array(data[:,0]) / np.max(data[:,0])
    y_data = np.array(data[:,1]) / np.min(data[:,1])

    # print(x_data)
    # print(y_data)

    # ===========模型搭建=====================
    # 声明weights变量是一个 -1到 1值,bias变量默认为0, 
    # 表达式 y = weights * x_data + biases 就是模型了
    weights = tf.Variable(tf.random_uniform([1], -1,01.0))
    biases = tf.Variable(tf.zeros([1]))

    y = weights*x_data + biases


    # ===========计算误差:均方误差===========
    loss = tf.reduce_mean(tf.square(y-y_data))

    # ===========误差传播:梯度下降法===========
    optimizer = tf.train.GradientDescentOptimizer(0.5)

    # ================训练==================
    train = optimizer.minimize(loss)

    init = tf.global_variables_initializer() 

    sess = tf.Session()
    sess.run(init)         

    # 两次迭代损失差向量
    y_loss = []

    # 最大迭代次数
    iterate_max = 1000
    # 两次迭代损失差最大值
    loss_diff = 0.001
    # 初使误差值
    loss_pre = 0

    # 记录迭代的次数
    iterate_n = 0

    for step in range(iterate_max):
        sess.run(train)
        iterate_n = iterate_n + 1

        # y_loss.append(sess.run(loss))
        y_loss.append(abs(sess.run(loss) - loss_pre))

        if abs(sess.run(loss) - loss_pre) < loss_diff:
            print('iterate_n => ', iterate_n)
            print('loss_pre => ', loss_pre)
            print(step, 'weight => ',sess.run(weights), ' bias => ', sess.run(biases), 'loss => ',sess.run(loss))
            break

        loss_pre = sess.run(loss)

    print(y_loss)

    # 误差梯度下降展示
    plt.plot(range(iterate_n),y_loss)
    plt.show()

if __name__ == '__main__':
    run()


结果

iterate_n =>  115
loss_pre =>  5.0508256
114 weight =>  [2.5534637]  bias =>  [5.060318] loss =>  5.049826
[5.19662332534790.00177812580.0016164780.00160932540.00160217290.00159549710.00158929820.00158166890.00157451630.00156784060.00156211850.0015549660.00154781340.00154256820.0015344620.00152873990.00152206420.00151538850.00150823590.00150299070.00149583820.00148963930.00148296360.00147676470.00146961210.00146484380.00145769120.0014524460.00144481660.00144004820.00143289570.00142765050.00142049790.00141525270.00140810010.00140285490.00139713290.0013909340.00138378140.00137901310.00137376790.00136661530.00136089320.00135517120.00134944920.0013442040.00133800510.00133275990.00132608410.00132131580.00131559370.00130844120.00130510330.00129699710.00129365920.00128698350.00128221510.00127553940.00127172470.00126552580.00125932690.00125551220.00124835970.0012445450.00123882290.00123357770.00122642520.00122308730.00121784210.00121164320.00120782850.00120162960.00119686130.00119256970.00118541720.00118064880.0011773110.00117158890.00116491320.0011625290.00115537640.00115203860.00114679340.00114107130.00113677980.00113201140.00112771990.0011215210.00111675260.00111293790.00110816960.00110197070.00109863280.00109386440.00108861920.00108432770.00107955930.00107574460.00107049940.00106525420.00106096270.00105619430.00105237960.00104808810.00104284290.0010395050.00103330610.00103139880.00102519990.00101947780.00101757050.00101232530.00100851060.00100278850.0009994507]

程序中设置最大迭代次数1000次,最大两次误差的差为0.001,程序实际迭代了115次,第114次误差为5.0508256 第115次误差为5.060318 两次误差的差别很小,为0.0009994507 <0.001,收敛,程序结束。。。

最终得到,房价与房屋面积关系表达式为:

y = 2.5534637 *x + 5.060318


猜你可能喜欢

交了3年的女朋友不理我了,她说我连SVM都不会?

记第一次赚钱经历

利用Word2Vec判断文言、白话文

165cm大于50kg吗——数据标准化有理

基于梯度下降法的——线性回归拟合


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存