传感数据分析——最小二乘法线性拟合(Least Squares)


前言

相关性分析是对传感数据分析的定性分析,即明确两两传感数据是否存在线性关系的定性。
对于多传感数据分析而言,明确了两两传感数据之间的强相关性之后,需要定量化地表述两者之间的线性关系,即采用线性建模的方式。


本文正文内容

一、基础理论

基本概念

最小二乘法:一组数据x和y==>求出y与x之间的关系模型的参数;
最小二乘法的使用条件:误差服从标准正态分布;
假设线性最小二乘法的拟合直线公式为:
y = a x + b \begin{equation}y=ax+b\end{equation} y=ax+b
式中, a a a, b b b为待估计的参数。
设观测数据( x 1 x_{1} x1, y 1 y_{1} y1),( x 2 x_{2} x2, y 2 y_{2} y2),…,( x N x_{N} xN, y N y_{N} yN)共有N对数据,则将这些数据点分别代入方程,可以得到一共 N N N个方程构成的方程组,通过极小化实际观测数据与模型观测数据的残差平方和:
ε 2 = ∑ i = 1 N [ y i − ( a x i + b ) ] 2 \begin{equation} \varepsilon^{2}=\sum_{i=1}^{N}[y_{_i}-(ax_{_i}+b)]^{2} \end{equation} ε2=i=1N[yi(axi+b)]2
对a求偏导:
∂ ε 2 ∂ a = 2 ∑ i = 1 N [ y i − ( a x i + b ) ] ( − x i ) = 0 \begin{equation}\frac{\partial\varepsilon^2}{\partial a}=2\sum_{i=1}^N[y_i-(ax_i+b)](-x_i)=0\end{equation} aε2=2i=1N[yi(axi+b)](xi)=0
化简后得到:
∑ i = 1 N x i y i − a ∑ i = 1 N x i 2 − b ∑ i = 1 N x i = 0 \begin{equation}\sum_{i=1}^{N}x_{i}y_{i}-a\sum_{i=1}^{N}x_{i}^{2}-b\sum_{i=1}^{N}x_{i}=0\end{equation} i=1Nxiyiai=1Nxi2bi=1Nxi=0
分别对b求偏导:
∂ ε 2 ∂ b = 2 ∑ i = 1 N [ y i − ( a x i + b ) ] = 0 \begin{equation}\frac{\partial\varepsilon^{2}}{\partial b}=2\sum_{i=1}^{N}[y_{i}-(ax_{i}+b)]=0\end{equation} bε2=2i=1N[yi(axi+b)]=0
化简后后得到
∑ i = 1 N y i = a ∑ i = 1 N x i + N b \begin{equation}\sum_{i=1}^{N}y_{i}=a\sum_{i=1}^{N}x_{i}+Nb\end{equation} i=1Nyi=ai=1Nxi+Nb
由(4)和(6)得到二元一次方程组,联立求解,可得
{ a = ∑ i = 1 N x i ∑ i = 1 N y i − N ∑ i = 1 N x i y i ( ∑ i = 1 N x i ) 2 − N ∑ i = 1 N x i 2 b = y ‾ − a x ‾ \begin{cases}a=&\displaystyle\frac{\sum_{i=1}^Nx_i\sum_{i=1}^Ny_i-N\sum_{i=1}^Nx_iy_i}{(\sum_{i=1}^Nx_i)^2-N\sum_{i=1}^Nx_i^2}\\b=&\displaystyle\overline{y}-a\overline{x}\end{cases} a=b=(i=1Nxi)2Ni=1Nxi2i=1Nxii=1NyiNi=1Nxiyiyax
相关原理叙述和详解可以参考大佬的博客:
最小二乘法详解

二、运行环境

系统: Windows 10 / Ubuntu 20.04
编程语言: Python 3.8
文本编译器: Vscode
所需库:pandas >= 0.23.0, matplotlib >= 2.2.2,numpy >= 1.19.5

三、使用步骤

1.引入库

代码如下(示例):

import os
import time
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

2.读入数据

代码如下(示例):

def file_xlsx(fileder_path):
    """
    读取fileder_path文件夹下全部的.xlsx文件夹
    """
    file_list = []
    for filename in os.listdir(fileder_path):
        if filename.endswith('.xlsx'):
            file_list.append(filename)
    return sorted(file_list)

if __name__ == '__main__':
    # 文件路径
    fileder_path = './dataset/'
    # 调用file_xlsx函数读取当前文件夹下的.xlsx文件
    file_list = file_xlsx(fileder_path)

该处读取dataset文件夹下的所有.xlsx文件。


3. 最小二乘法

代码如下(示例):

"""
    用最小二乘法完成拟合曲线参数计算
    data_y = return_k * data_x + return_b
    :param data_x:
    :param data_y:
    :return: 一元线性拟合的参数 return_k、return_b
    """
    # 初始化xy等
    size = len(data_x)
    i = 0
    sum_xy = 0
    sum_y = 0
    sum_x = 0
    sum_sqare_x = 0
    while i < size:
        sum_xy += data_x[i] * data_y[i]
        sum_y += data_y[i]
        sum_x += data_x[i]
        sum_sqare_x += data_x[i] * data_x[i]
        i += 1
    # 观测点数据的average_x和average_y
    average_x = sum_x / size
    average_y = sum_y / size
    # 根据一元线性回归的最小二乘法公式求解
    return_k = (sum_x * sum_y - size * sum_xy) / (sum_x * sum_x - size * sum_sqare_x)
    return_b = average_y - average_x * return_k
    return [return_k, return_b]

4. 绘图

选择数据中的自变量x和因变量y,并绘制曲线,展示,原数据用散点图表示,线性拟合后用蓝色直线表示。详见资源传感数据分析-最小二乘法线性拟合(Least Squares)
结果图:
在这里插入图片描述


总结

以上就是本节对传感数据线性回归分析的内容,本文简单介绍了传感数据一维线性回归分析中最小二乘法的Python实现(改为自己的数据集即可),对最小二乘法的具体使用,可见传感数据分析-最小二乘法线性拟合(Least Squares)
在这里插入图片描述

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐