2022-09-19

算法简介

  • 线性回归模型(Linear Regression),因为结构简单,可解释性好,实现简单,在工程领域得到广泛应用

  • 线性回归模型是机器学习世界的"Hello World!"。完整、全面地掌握线性回归模型,有助于打通机器学习的任督二脉

image.png

线性回归基础

什么是线性?

  • 例:汽车每小时,小时可以形式多长距离?
    • 已知骑车的速度,则骑车行驶的距离只与时间唯一相关
  • 特点:世界是普遍联系的,但又特例”一个事务唯一由另一个事务觉定“
  • 线性:如上例,在二元的直角坐标系中,描出这个关系的图是一条直线,所以称为线性关系

什么是回归?

  • 起源:19世纪80年代,英国统计学家弗朗西斯.高尔顿(Francis Galton)提出
  • 研究:父代身高与子代身高之间的关系
  • 结论:子代的身高又向族群平均身高”回归的趋势“

什么是回归分析?

  • 回归分析
    • 数理统计学中,回归分析着重在寻求变量之间近似的函数关系
  • 线性回归分析
    • 是在寻求变量之间近似的线性函数关系

线性函数

  • 一元线性函数
    • 一元线性方程
  • 多元线性函数
    • 写成向量的形式

线性回归原理

线性回归

  • 什么是线性回归?
    • 现设在一个问题中因变量及自变量,可以设想的值由两部分构成:一部分,由的影响所致,这一部分表为的函数形式。另一部分,则由其他众多未加考虑的因素,包括随机因素的影响,它可视为一种随机误差,记为。于是得到模型:
      • 函数称为对的”回归函数
        • 回归函数为线性函数的情形——称为线性回归

线性回归理论基础

  • 一元线性回归理论基础
    • 其中为回归函数,为随机误差
    • 现在对理论模型中的变量进行次独立观察,得到样本
      • 这组样本的构造可由方程来描述,这里是第次观察时随机误差所取得的值
  • 多元线性回归理论基础
      • 现在对和进行观察,第次观察时它们的取值分别记为和,随机误差,得到方程
        • 统一规范:表示特征的第次观察

线性回归模型

  • 线性回归模型公式
    • 在机器学习领域,线性回归模型记为:
      • 则可以统一形式为:
          • 是预测函数
          • 是模型参数
          • 是特征输入
          • 是偏置量
  • 线性回归模型假设
    • 假设一:变量是相互无关的
      • 各变量的作用与其他变量取值无关
    • 假设二:变量的作用是可以叠加的
      • 公式中个变量是相加的

线性回归模型损失函数

  • 损失函数的定义
    • 损失函数(Loss Function)是度量模型一次预测的好坏,即真实值()与预测值()的误差
    • 线性回归损失函数:
      • 平方损失函数衡量模型的整体准确性
      • 平方损失函数的集合意义:欧式距离
  • 损失函数的公式
    • 假设数据集有个训练样本,个特征工程,则平方损失函数:

线性回归模型训练

  • 怎样对线性回归模型的参数进行训练?
    • 训练目的:求模型参数
      • 即求
    • 训练原理:损失函数最小
      • 即所有真实值与预测值的误差综合最小
    • 训练方法:梯度下降
      • 梯度下降公式:,顺着损失函数当前点梯度下降反方向,按规定步长进行迭代搜索
  • 线性回归模型的梯度下降训练
    • 采样梯度下降法进行学习
    • 由于
    • 则:
      • 迭代训练,计算每个参数,直至收敛预定的值为止

        image.png

线性回归应用

线性回归的Python实现

import numpy as np
import matplotlib.pyplot as plt

x = np.array([[1, 5.56], [2, 5.70], [3, 5.91], [4, 6.40],[5, 6.80],
              [6, 7.05], [7, 8.90], [8, 8.70],[9, 9.00], [10, 9.05]])
m, n = np.shape(x)
x_data = np.ones((m, n))
x_data[:, :-1] = x[:, :-1]
y_data = x[:, -1]
m, n = np.shape(x_data)
theta = np.ones(n)

def gradientDescent(iter, x, y, w, alpha):
    x_train = x.transpose()
    for i in range(0, iter):
        pre = np.dot(x, w)
        loss = (pre - y)
        gradient = np.dot(x_train, loss) / m
        w = w - alpha * gradient
        cost = 1.0 / 2 * m * np.sum(np.square(np.dot(x, np.transpose(w)) - y))
        print("第{}次梯度下降损失为: {}".format(i,round(cost,2)))
    return w

result = gradientDescent(1000, x_data, y_data, theta, 0.01)
y_pre = np.dot(x_data, result)
print("线性回归模型 w: ", result)

plt.rc('font', family='Arial Unicode MS', size=14)
plt.scatter(x[:, 0], x[:, 1], color='b', label='训练数据')
plt.plot(x[:, 0], y_pre, color='r', label='预测数据')
plt.xlabel('x')
plt.ylabel('y')
plt.title('线性回归预测(梯度下降)')
plt.legend()
plt.show()

线性回归的Sklearn实现

# 数据集:Advertising
# 模型:Linear Regression Model
import matplotlib.pyplot as plt
%matplotlib inline
plt.rc('font', family='Arial Unicode MS', size=14)
import numpy as np
import pandas as pd
from sklearn import datasets, linear_model

# 数据处理
data = pd.read_csv('./data/Advertising.csv')
X = data[['TV', 'Radio', 'Newspaper']]
y = data[['Sales']]

# 划分训练集和测试集
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=1)

# 求解线性模型参数
from sklearn.linear_model import LinearRegression
linreg = LinearRegression()
linreg.fit(X_train, y_train)
print(linreg.intercept_)  # 常数项 [2.87696662]
print(linreg.coef_)       # 变量系数 [[0.04656457 0.17915812 0.00345046]]

# 交叉验证
from sklearn.model_selection import cross_val_predict
from sklearn import metrics
predicted = cross_val_predict(linreg, X, y, cv=10)
print("MSE:",metrics.mean_squared_error(y, predicted))
print("RMSE:",np.sqrt(metrics.mean_squared_error(y, predicted)))

# 画图描述真实值和预测值的变化关系
fig, ax = plt.subplots()
ax.scatter(y, predicted)
ax.plot([y.min(), y.max()], [y.min(), y.max()], 'r--', lw=5)
ax.set_xlabel('真实值')
ax.set_ylabel('预测值')
plt.title('Advertising的真实值和预测值的变化关系')
plt.show()

线性回归的Sklearn实现

# TensorFlow 2.0 + Linear Regression

import tensorflow as tf
import numpy as np

x = np.float32(np.random.rand(100,1))

# y=a*x+b
y = np.dot(x,0.8) + 0.2

a = tf.Variable(np.float32())
b = tf.Variable(np.float32())

def model(x):
    return a*x+b

def loss(predicted_y, desired_y):
    return tf.reduce_sum(tf.square(predicted_y - desired_y))

optimizer = tf.optimizers.Adam(0.1)

for step in range(0, 100):
    with tf.GradientTape() as t:
        outputs = model(x)
        current_loss = loss(outputs, y)
        grads = t.gradient(current_loss, [a, b])
        optimizer.apply_gradients(zip(grads,[a, b]))
    if step % 10 == 0:
        print("Step:%d, loss:%2.5f, weight:%2.5f, bias:%2.5f "
              %(step, current_loss.numpy(), a.numpy(), b.numpy()))

线性回归总结

线性回归价值

  • 概括了一大类实际问题
    • 现实世界中,有许多问题可以用线性回归进行抽象
  • 复杂问题近似转换(机器学习基本思想之一)
    • 因为结构简单,处理比较方便,可以近似地处理其他问题

线性回归优缺点

  • 优点
    • 简单
    • 解释性好
    • 无法反应变量之间的相关性
    • 无法体现变量之间是相乘的

你可能感兴趣的:(2022-09-19)