2022-09-19

作者: 扫地僧Andy | 来源:发表于2022-09-19 23:41 被阅读0次

算法简介

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

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

image.png

线性回归基础

什么是线性?

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

什么是回归?

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

什么是回归分析?

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

线性函数

  • 一元线性函数
    • f(x)=w_0+w_1x
    • 一元线性方程y=w_0+w_1x
  • 多元线性函数
    • f(x_1,x_2,...,x_n)=w_0+w_1x_1+w_2+x_2+...+w_nx_n=w_0+\sum\limits_{i=1}^{n}w_ix_i
    • 写成向量的形式
      • f(x_1,x_2,...,x_n)=w_0+[w_1w_2\cdots w_n]\begin{bmatrix} {x_{1}}\\ {x_{2}}\\ {\vdots}\\ {x_{n}}\\ \end{bmatrix}=w_0+\vec w^T\vec x

线性回归原理

线性回归

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

线性回归理论基础

  • 一元线性回归理论基础
    • y=w_0+w_1x+b
    • 其中w_0+w_1x为回归函数,b为随机误差
    • 现在对理论模型中的变量x,y进行n次独立观察,得到样本
      • (x_1,y_1),(x_2,y_2),\cdots,(x_n,y_n)
      • 这组样本的构造可由方程y_i=w_0+w_1x_i+b_i,(i=1,2,\cdots,n)来描述,这里b_i是第i次观察时随机误差b所取得的值
  • 多元线性回归理论基础
    • y=w_0+w_1x_1+\cdots+w_nx_n+b
      • 现在对x_1,x_2,\cdots,x_ny进行观察,第i次观察时它们的取值分别记为x_1^i,x_2^i,\cdots,x_n^iy^i,随机误差b^i,得到方程
        • y^i=w_0+w_1x_1^i+w_2x_2^i+\cdots+w_nx_n^i+b^i,(i=1,\cdots,n)
        • 统一规范:x_1^i表示特征x_1的第i次观察

线性回归模型

  • 线性回归模型公式
    • 在机器学习领域,线性回归模型记为:
    • y=w_1x_1+w_2x_2+\cdots+w_nx_n+b=[w_0w_1w_2\cdots w_n]\begin{bmatrix} {x_{1}}\\ {x_{2}}\\ {\vdots}\\ {x_{n}}\\ \end{bmatrix}+b
      • 则可以统一形式为:
        • y=\sum\limits_{i=1}^{n}w_ix_i+b=\vec w^T\vec x+b
          • y是预测函数
          • w是模型参数
          • x是特征输入
          • b是偏置量
  • 线性回归模型假设
    • 假设一:变量是相互无关的
      • 各变量的作用与其他变量取值无关
    • 假设二:变量的作用是可以叠加的
      • 公式中个变量是相加的

线性回归模型损失函数

  • 损失函数的定义
    • 损失函数(Loss Function)是度量模型一次预测的好坏,即真实值(y)与预测值(\hat y)的误差
    • 线性回归损失函数:L=\frac{1}{2}(y-\hat y)^2
      • 平方损失函数衡量模型的整体准确性
      • 平方损失函数的集合意义:欧式距离
  • 损失函数的公式
    • 假设数据集有m个训练样本,n个特征工程,则平方损失函数:L(w)=\frac{1}{2}\sum\limits_{j=1}^{m}[y^j-\sum\limits_{i=1}^{n}w_ix_i^j-b]^2

线性回归模型训练

  • 怎样对线性回归模型的参数进行训练?
    • 训练目的:求模型参数W
      • 即求w_1,w_2,\cdots,w_n
    • 训练原理:损失函数最小
      • 即所有真实值与预测值的误差综合最小
    • 训练方法:梯度下降
      • 梯度下降公式:w_{i+1}=w_i-\alpha\nabla f,顺着损失函数当前点梯度下降反方向,按规定步长\alpha进行迭代搜索
  • 线性回归模型的梯度下降训练
    • 采样梯度下降法进行学习w_{i+1}=w_i-\alpha\frac{\partial L(\vec w)}{\partial w_i}
    • 由于\frac{\partial L(\vec w)}{\partial w_i}=-\sum\limits_{j=1}^{m}[y^j-\sum\limits_{i=1}^{n}w_ix_i^j-b]*x_i^j
    • 则:w_{i+1}=w_i+\alpha[\sum\limits_{j=1}^{m}(y^j-\sum\limits_{i=1}^{n}w_ix_i^j-b)*x_i^j]
      • 迭代训练,计算每个参数w_i,直至收敛预定的值为止

        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 晴热 周一 “猪爸,老师布置的作文,我没有思路,咋办?”周六的时候,宝贝一脸愁容...

  • 杂言·菊花酒

    菊花酒 (杂言) 2022-09-19 道旁遍菊科,时人已不宝。 尘垢常污叶,独花顾盼姿色仍娟好。 蜜香自有蜂蝶酿...

  • 高粱和鲜花

    2022-09-19 21:08浙江 你们说是种高粱好呢,还是种鲜花好呢?事情是这样的:曾经有一个最美乡村,村子中...

  • CSS:美化滚动条

    2022-09-19 周一 父元素添加样式 1.例:y轴滚动, 先给父元素盒子限定高度 然后再设置滚动条样式,le...

  • 设计思维-传统即创造

    2022-09-19 《传统即创造》是《今日的艺术》的姐妹篇。 《今日的艺术》出版获得成功后,冈本太郎想要再写一本...

  • 病多是堵出来的 疏通法在这里 爱吃这些食物的

    一、《病多是堵出来的!最好的疏通法都在这里!很实用,请慢看!》 黄帝内经与健康生活 2022-09-19 19:3...

  • 现代诗·影子里困住了一头狼

    影子里困住了一头狼 (现代诗) 2022-09-19 影子在尘埃里扭曲 仿佛里面困住了一头独狼 圆月与它有什么勾连...

  • 毅心睡着了(四)

    2022-09-19 上周上完厕所后的轩轩回到寝室,嘀嘀咕咕,告诉临床的同学,毅心在玩,可以不睡觉。 今天周一,问...

  • 上海驾驶证期满换证经历

    大学时考得驾照过期半年,是外地驾照,今天(2022-09-19)早上抽空去长宁区交警支队换了新证。所需证件只需要身...

  • 2022-09-19

    我的审美已经不认可自己的筷子腿了,想要更健康强壮些。 不知道这算不算又一层觉醒。

网友评论

    本文标题:2022-09-19

    本文链接:https://www.haomeiwen.com/subject/kajmortx.html