目录
一 什么是线性回归?
二 单变量线性回归
三 代价函数
四 梯度下降法
五 多变量线性回归
六 特征标准化
七 用矩阵计算方法计算参数值(正规方程)
一 什么是线性回归?
就是将一堆样本的分布拟合到一条连续直线上。
二 单变量线性回归
先给出变量定义:
- m=用于训练的样本数
- xi=第i个训练样本“输入”变量/特征量
- yi=第i个训练样本“输出”变量/特征量
机器学习的目标是通过一系列的训练,得到最优的
使得拟合效果最好。
如何去评价拟合效果呢? 引入了代价函数
三 代价函数
代价函数的定义为
如何理解代价函数?
其实代价函数里面用了最小二乘法的原理(就是让平方和最小化)。直观的说就是预测值与真实值的差值(残差)最小
有了代价函数,如何去让代价函数最小呢? 引入了梯度下降法。
四 梯度下降法
原理:
- 从某一对θ0,θ1出发
- 不断尝试改变θ0,θ1,使得J(θ0,θ1) 减小,逐步逼近最小值(迭代)
- 改变的策略:每一次改变的方向,取当前位置梯度下降的方向:
梯度下降法计算的具体过程如下:
说明:计算过程中要先将两个值都计算出来,然后再更新参数值。
梯度下降算法中的a 代表学习率(learning rate)
- 太大的话容易错过全局最优解
- 太小的话学习速度太慢
五 多变量线性回归
基本原理与单变量回归一致,只是影响因素比单变量回归多。
利用矩阵理论,假设样本矩阵为A ,设参数
为一个列向量,则有
同理,对其应用梯度下降法则可求得参数
另外,使用数量级相差较大的特征量和标准化的特征量相比,前者的路径要长一些,也就是学习的速度要慢一些。
问:如果不同样本的数量级差异很大,如何处理?引入了特征标准化
六 特征标准化
标准化常用方法:
- 缩放,即将数据缩放到[-1,1]的区间内。
七 用矩阵计算方法计算参数值(正规方程)
首先给出求解公式
梯度下降法和直接求解法的区别
从上面可以看出数据集的大小也影响了我们的方法选取。建议当n>10000时使用梯度下降法。
矩阵求逆法的tenforflow 示例
#!/usr/bin/python3
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
sess = tf.Session()
x_vals = np.linspace(0,10,100)
print(x_vals)
y_vals = x_vals + np.random.normal(0,1,100)
print(y_vals)
x_vals_column = np.transpose(np.matrix(x_vals))
print(x_vals_column)
one_column = np.transpose(np.matrix(np.repeat(1,100)))
print(one_column)
A = np.column_stack((x_vals_column, one_column))
b = np.transpose(np.matrix(y_vals))
print(A)
print(b)
A_tensor = tf.constant(A)
b_tensor = tf.constant(b)
tA_A = tf.matmul(tf.transpose(A_tensor),A_tensor)
tA_A_inv = tf.matrix_inverse(tA_A)
product = tf.matmul(tA_A_inv, tf.transpose(A_tensor))
solution = tf.matmul(product, b_tensor)
solution_eval = sess.run(solution)
print(sess.run(solution))
slope = solution_eval[0][0]
y_intercept = solution_eval[1][0]
print('slope:' + str(slope))
print('y_intercept:' + str(y_intercept))
best_fit = []
for i in x_vals:
best_fit.append(slope * i + y_intercept)
plt.plot(x_vals, y_vals, 'o', label = 'Data')
plt.plot(x_vals, best_fit,'r-', label = 'Best fit line', linewidth=3)
plt.legend(loc='upper left')
plt.show()