共分三部分:1.线性回归理论部分
2.代码实现
3.课后拓展
一.线性回归概念及基本原理
概念:是一种统计方法,来确定两种或两种以上变量间相互依赖的定量关系。
一元线性回归:y = w * x + b
任务:根据训练数据预测一元线性回归模型,并用验证数据验证预测的一元线性回归模型是否正确。
(x,y)
1 3
2 5.1
3 6.99
y = w * x + b;
1.假设一个线性回归模型
h(x) = 3 * x + 5;
2.判断这假设线性回归模型对不对
3 * 1 + 5 = 8 3
代价函数:均方差
((8 - 3)的平方 + (11 - 5.1)的平方 + (14 - 6.99)的平方 )/ 2*3
3.调整这个模型参数
h(x) = 2.8 * x +4;
h(x) = 2.6 * x + 3;
...
...
h(x) = 2.0 * x + 1;
求最优解算法:
梯度下降:
4.得到符合要求的线性回归模型
h(x) = 2.0 * x +1;
5.用验证数据验证训练出来的模型对不对
总结:
1.获取训练数据和验证数据 一堆(x,y)组成的训练点
2.假设一个一元线性回归函数 a = w * x +b
3.判断函数的好坏 代价函数
4.调整假设的一元线性回归函数 梯度下降算法 学习率
5.得到最优的预测一元线性回归函数 y = w * x + b
6.根据验证数据验证预测函数是否符合要求
二.线性回归使用到的tensorflow语法
import tensorflow as tf
# -----准备阶段-----
a = tf.Variable( [ [2,3] ] ) #生成一行两列的矩阵
b = tf.Variable( [ [4] , [2] ] ) #生成两行一列的矩阵
c = tf.matmul(a,b) # 求a,b的乘积
print('c的值:',c)
#创建0填充的矩阵
d = tf.zeros([2,4]) #生成两行四列的全0矩阵
#平均值
f = tf.reduce.mean([1,3])
#平方
e = tf.square([2])
#均匀分布的随机数
g = tf.random.uniform([1,10]) #生成一行十列服从均匀分布的随机数。
# -----执行阶段-----
with tf.Session() as sess:
#初始化所有变量
init = tf.global_variables_initializer()
sess.run(init)
print('a:',a)
print('a = ',sess.run(a))
print('c = ',sess.run(c))
print('d = ',sess.run(d))
print('e = ',sess.run(e))
print('f = ',sess.run(f))
print('g = ',sess.run(g))
三.线性回归的代码实现
#一元的线性回归模型的训练
#1.通过训练数据,推测出线性回归函数(y = w * x + b)中w和b的值
#2.通过验证数据,验证得到的函数是否符合预期
#引入Tensorflow
import tensorflow as tf
#引入绘图表
import matplotlib.pyplot as plt
#引入数据模块
import testData as td
#1.获取训练数据
#testData
#get_train_data 获取训练数据 参数:data_length(获取数据的个数)
#返回值:二维数组 [0] 代表x(横坐标) [1]代表(y纵坐标)
#get_validate_data 获取验证数据 参数:data_length(获取数据的个数)
#返回值:二维数组 [0] 代表x(横坐标) [1]代表(y纵坐标)
trainData = td.get_train_data(200)
trainx = [v[0] for v in trainData]
trainy = [v[1] for v in trainData]
#2.构造预测的线性回归函数 y = w * x + b
w = tf.Variable(tf.random_uniform([1]))
b = tf.Variable(tf.zeros([1]))
y = w * trainx + b
#3.判断假设函数的好坏
#代价函数
cost = tf.reduce_mean(tf.square(y-trainy))
#4.调整假设函数
#梯度下降算法找最优解
optimizer = tf.train.GradientDescentOptimizer(0.08)
train = optimizer.minimize(cost)
with tf.Session() as sess:
#初始化所有变量值
init = tf.global_variables_initializer()
sess.run(init)
#初始化的W和b的值
print("cost=",sess.run(cost),"w=",sess.run(w),"b=",sess.run(b))
#循环运行
for k in range(500):
sess.run(train)
#输出训练好的w和b
print("cost=",sess.run(cost),"w=",sess.run(w),"b=",sess.run(b))
print("执行完成")
#构造图形结构
plt.plot(trainx,trainy,'ro',label='train data')
plt.plot(trainx,sess.run(y),label='train result')
plt.legend()
plt.show()
关于testData模块 (testData.py):
#引入Numpy
import numpy as np
#构造一个线性回归函数
# y = w * x + b
w = 0.3
b = 0.8
#生成测试数据
def get_train_data(data_lenght):
train_arr = []
for i in range(data_lenght):
tr_x = np.random.uniform(0.0,1.0)
tr_y = tr_x * w + b + np.random.uniform(-0.02,0.02)
train_arr.append([tr_x,tr_y])
return train_arr
#生成校验数据
def get_validate_data(data_lenght):
validate_arr = []
for i in range(data_lenght):
va_x = np.random.uniform(0.0,1.0)
va_y = va_x * w + b + np.random.uniform(-0.02,0.02)
return validate_arr
测试模型:
import matplotlib.pyplot as plt
#引入测试数据
import testData as pt
validateData = pt.get_validate_data(40)
va_x = [v[0] for v in validateData]
va_y = [v[1] for v in validateData]
#训练结果
y = []
for x in va_x:
y.append( x * 0.3 + 0.8 )
#构造图形结构
plt.plot(va_x,va_y,'ro',label='validate Data')
plt.plot(va_x, y, label='train result')
plt.legend()
plt.show()
课后拓展:
1.随机梯度下降
方式:每次拿一个训练点进行训练
优点:大数据下训练更快 缺点:得到的可能不是全局的最优解,只是局部的最优解。
2.批量梯度下降
方式:每次拿所有的训练点进行计算
优点:可以得到全局最优解 缺点:数据量特别大的时候,训练会很慢。