线性回归-TF实现【人工智能学习】

补一下昨天对博客
昨天实现了线性回归,在此做个总结和记录。
**

线性回归–预测算法

**
所谓预测算法,就是在一系列事实当中,找到他们中间对关系,然后想尽一切办法构建一个公式(预测模型),以此来根据自变量,来预测因变量(结果)

而线性回归,就是自变量和因标量的相关关系是【近似直线】的关系

比如说经典例子:房价的预测。一个房子的面积和他的房价是线性关系,越大的房子越贵。
当然你也会说,地段、朝向、学区啥啥的也会有影响
没错,这就涉及到了一个纬度的概念

每一个自变量都是一个维度,表示在这个方面的变量,最后全部都作用在一个指标上,再加上每个指标的影响权重不同,得出了最后的房价
这么公式就是
房价=偏置量+权重1因变量1+权重2因变量2+…

其中这个偏置量,是用来校正的,当然…一半他就是个常数,需要求解
参考多维空间支线,可以得出
Y = ∑Wi*Xi + b
这里面的因变量,我们命名为:特征值

那么以上内容可以翻译过来:我们想要这个结果的预测,是由多个特征值的不同权重影响加成的结果。而我们就是要想办法,把这个公式解出来罢了。

值得注意的是,我们在现实当中的结果,虽然是线性的,但是多多少少不会完全贴合在线上,他会以【近似是支线】的形式来分布:
这又叫做线性分布,下图是一个特征值的图
在这里插入图片描述
我们要根据这样密密麻麻的一个一个的点,来求解一条直接–回归方程

这条直线的指标呢,就是可以最大限度的覆盖点,而我们考虑的是使用方法:常见方法:方差和最低。

我们通过不断的假设权重和偏置量,带入结果验证方差和,选取方差和最小的那个。
然后再次调整权重和偏置量,再计算方差和…

一步一步的,最后拟合出一个直线,我们就叫他一个回归方程了,就是我们都要的解

而在多维特征值的方式下,求解方式最常用的有几种,这里介绍一种我在用的方式
**

线性回归中的求解方法

**
我们的目标有了,就是求解Y = ∑Wi*Xi + b这样一条直线

那么我们知道想要求这个方程,我们需要至少由 i +1 个在线上的点来求解Wi 和 b

而我们获得的数据集又不是完全在直线上的,我们需要预测的结果总会跟实际结果有所偏差,我们起个名字【损失】,叫他这个偏差的计算方法是我们刚刚提到的方差和。

而改进这个损失的方法,就叫做优化函数,使用优化函数来减小损失的方法,就叫做机器学习了。
在这里,我们使用的方法就是『梯度下降算法』。

梯度下降
梯度的概念其实很简单,就是不断去掉各种可能杂项,下降维度的过程,然后找到损失减少最快的那个方向(那个优化方法)来优化方法。

那如何判断这么多维度(变量)中的变化率呢,说白了…就是求这个变量的偏导数…
这个算法实现不做深入记录了,很成熟的算法,直接用tf就可以直接用了。

~~

线性回归TF方法设计实现

~~

题目:假设有一组训练集,特征值只有一个,然后满足线性关系的答案是y=3X+1。
我们需要通过机器学习,根据一系列产生的结果,来逼近这个答案。

代码设计第一步,是构建训练集,为了图方便…我们将结果直接使用y=3X+1来建立一个字典,当然,我们也可以用sklearn函数库来随机生成一个训练集,但是…我现在还不熟练,明天学学吧┓( ´∀` )┏

steps = 1000 #这是设定学习步骤,每一步都搞个训练数据出来,满足y=3*x+1
for i in range(steps):
    xs = [i]
    ys = [3 * i+1]
    feed = { x: xs, y_: ys }

当然,你用别的训练集一样

然后在主函数下面,就可以用语句去训练数据了:

feed = {x:xs,y_:ys}
sess.run(train_step,feed_dict = feed)

那么整个为学习代码的伪代码如下:

import tensorflow as tf

#初始化xywb,记得这里用tf中的矩阵形式创建
x = tf.placeholder(tf.float32)#x的初始化,placeholder是占位符,后来会有传入值代替
#当然,你可以用语句中的关系来表示,这样表示矩阵的方法更专业(也更装逼):
#y = tf.nn.bias_add(tf.matmul(x,W),b)
W = tf.Variable(tf.zeros([1]))#权重,新建一个Variable类
b = tf.Variable(tf.zeros([1]))#偏置量,新建一个Variable类
y_= tf.placeholder(tf.float32) #监督训练的结果值,也是占位符,后来会有传入值代替
y = W * x + b
#开始定义损失函数和修正优化的方法,就用我们前面提到的方法:方差和梯度下降
lost = tf.reduce_mean(tf.square(y_-y)) #损失函数,方差之后再来个平均,你也一个引入numpy使用mse函数
optimizer = tf.train.AdamOptimizer(0.015) #优化器,梯度下降算法,都封装好了,一半两种:GradientDescentOptimizer和AdamOptimizer,用哪个都行,其实AdamOptimizer速度更快一点
train_model = optimizer.minimize(lost) #根据上面的优化器结果,处理梯度计算和参数更新两个操作
#初始化训练Session(场景?),就这么规定的,记住即可,相当于把训练场地铺好的意思吧
sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)

#刚才写的那个生成训练集代码
steps = 1000 #这是设定学习步骤,每一步都搞个训练数据出来,满足y=3*x+1
for i in range(steps):
    xs = [i]
    ys = [3 * i+1]
    feed = { x: xs, y_: ys }
    #讲上面生成的每一步都扔进去run,训练一下
    sess.run(train_model, feed_dict=feed)
    print("训练步数:" ,i,"W:" ,W,"b:",b)

ok,到这我们的代码其实写完了。其中你可以吧训练集换换,变成其他训练集~
下一篇文章我们来学习用随机生成的案例来训练

发布了8 篇原创文章 · 获赞 2 · 访问量 317

猜你喜欢

转载自blog.csdn.net/u013684446/article/details/105046626
今日推荐