目录

一 什么是线性回归?

二 单变量线性回归

三 代价函数

四 梯度下降法

 

五 多变量线性回归

六 特征标准化

七 用矩阵计算方法计算参数值(正规方程)



一 什么是线性回归?

就是将一堆样本的分布拟合到一条连续直线上。

 

二 单变量线性回归

先给出变量定义:

  • m=用于训练的样本数
  • xi=第i个训练样本“输入”变量/特征量
  • yi=第i个训练样本“输出”变量/特征量

机器学习的目标是通过一系列的训练,得到最优的

二阶回归分析_代价函数

使得拟合效果最好。

如何去评价拟合效果呢? 引入了代价函数

 

三 代价函数

代价函数的定义为

二阶回归分析_梯度下降法_02

如何理解代价函数?

其实代价函数里面用了最小二乘法的原理(就是让平方和最小化)。直观的说就是预测值与真实值的差值(残差)最小

有了代价函数,如何去让代价函数最小呢? 引入了梯度下降法。

四 梯度下降法

原理:

  • 从某一对θ0,θ1出发
  • 不断尝试改变θ0,θ1,使得J(θ0,θ1) 减小,逐步逼近最小值(迭代)
  • 改变的策略:每一次改变的方向,取当前位置梯度下降的方向:

二阶回归分析_机器学习_03

梯度下降法计算的具体过程如下:

二阶回归分析_机器学习_04

说明:计算过程中要先将两个值都计算出来,然后再更新参数值。

梯度下降算法中的a 代表学习率(learning rate)

  • 太大的话容易错过全局最优解
  • 太小的话学习速度太慢

五 多变量线性回归

基本原理与单变量回归一致,只是影响因素比单变量回归多。

二阶回归分析_机器学习_05

利用矩阵理论,假设样本矩阵为A ,设参数

二阶回归分析_梯度下降法_06

为一个列向量,则有 

二阶回归分析_梯度下降法_07

二阶回归分析_二阶回归分析_08

同理,对其应用梯度下降法则可求得参数

二阶回归分析_线性回归_09

另外,使用数量级相差较大的特征量和标准化的特征量相比,前者的路径要长一些,也就是学习的速度要慢一些。

问:如果不同样本的数量级差异很大,如何处理?引入了特征标准化

 

六 特征标准化

二阶回归分析_梯度下降法_10

 

标准化常用方法:

  • 缩放,即将数据缩放到[-1,1]的区间内。

七 用矩阵计算方法计算参数值(正规方程)

首先给出求解公式

二阶回归分析_梯度下降法_11

二阶回归分析_二阶回归分析_12

 

梯度下降法和直接求解法的区别

二阶回归分析_线性回归_13

从上面可以看出数据集的大小也影响了我们的方法选取。建议当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()

二阶回归分析_梯度下降法_14