最小二乘法 python实现

2023-10-27

最小二乘法适用于对处理的一堆数据,不必精确的经过每一点,而是根据图像到每个数据点的距离和最小确定函数。

最小二乘法逼近的最简单的例子是根据一组观测值对(x1,y1),(x2,y2)…(xn,yn)来拟合一条直线。直线的数学表达式为
在这里插入图片描述
下面是一元线性拟合的原理说明:
在这里插入图片描述
一元线性拟合的python实现代码


import matplotlib.pyplot as plt
from pylab import mpl
"""一元线性拟合
采用的拟合数据为xi=1,2,3,4,5,6,7
对应的相应函数值yi=0.5,2.5,2,4,3.5,6,5.5
"""
 
x = [1, 2, 3, 4, 5, 6, 7];
y = [0.5, 2.5, 2, 4, 3.5, 6, 5.5]
 
 
"""完成拟合曲线参数计算"""
def liner_fitting(data_x,data_y):
      size = len(data_x);
      i=0
      sum_xy=0
      sum_y=0
      sum_x=0
      sum_sqare_x=0
      average_x=0;
      average_y=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=sum_x/size
      average_y=sum_y/size
      return_k=(size*sum_xy-sum_x*sum_y)/(size*sum_sqare_x-sum_x*sum_x)
      return_b=average_y-average_x*return_k
      return [return_k,return_b]
 
 
"""完成完后曲线上相应的函数值的计算"""
def calculate(data_x,k,b):
    datay=[]
    for x in data_x:
        datay.append(k*x+b)
    return datay
 
 
"""完成函数的绘制"""
def draw(data_x,data_y_new,data_y_old):
    plt.plot(data_x,data_y_new,label="拟合曲线",color="black")
    plt.scatter(data_x,data_y_old,label="离散数据")
    mpl.rcParams['font.sans-serif'] = ['SimHei']
    mpl.rcParams['axes.unicode_minus'] = False
    plt.title("一元线性拟合数据")
    plt.legend(loc="upper left")
    plt.show()
 
 
parameter = liner_fitting(x,y)
draw_data = calculate(x,parameter[0],parameter[1])
draw(x,draw_data,y)

一元线性拟合实现后的图像
在这里插入图片描述

一元多项式拟合

有的时候,给出的变量关系不是直线的关系,而是曲线的关系,这个时候需要我们用多项式来进行拟合。
在这里插入图片描述
下面是一元多项式拟合的python实现


import matplotlib.pyplot as plt
from pylab import mpl
import math
"""一元多项式曲线拟合
  拟合数据为xi=0, 1, 2, 3, 4, 5
对应的函数值yi=2.1, 7.7, 13.6, 27.2, 40.9, 61
"""
x = [0, 1, 2, 3, 4, 5]
y = [2.1, 7.7, 13.6, 27.2, 40.9, 61]
 
"""完成拟合曲线参数计算前相应变量的计算"""
def polynomial_fitting(data_x,data_y):
    size=len(data_x)
    i=0
    sum_x = 0
    sum_sqare_x =0
    sum_third_power_x = 0
    sum_four_power_x = 0
    average_x = 0
    average_y = 0
    sum_y = 0
    sum_xy = 0
    sum_sqare_xy = 0
    while i<size:
        sum_x += data_x[i]
        sum_y += data_y[i]
        sum_sqare_x += math.pow(data_x[i],2)
        sum_third_power_x +=math.pow(data_x[i],3)
        sum_four_power_x +=math.pow(data_x[i],4)
        sum_xy +=data_x[i]*data_y[i]
        sum_sqare_xy +=math.pow(data_x[i],2)*data_y[i]
        i += 1;
    average_x=sum_x/size
    average_y=sum_y/size
    return [[size, sum_x, sum_sqare_x, sum_y]
        , [sum_x, sum_sqare_x, sum_third_power_x, sum_xy]
        , [sum_sqare_x,sum_third_power_x,sum_four_power_x,sum_sqare_xy]]
 
 
"""完成拟合曲线参数的计算
 其中解方程的时候,利用高斯消元法计算相应的参数值
"""
def calculate_parameter(data):
    #i用来控制列元素,line是一行元素,j用来控制循环次数,datas用来存储局部变量。保存修改后的值
    i = 0;
    j = 0;
    line_size = len(data)
 
   #将行列式变换为上三角行列式
    while j < line_size-1:
        line = data[j]
        temp = line[j]
        templete=[]
        for x in line:
            x=x/temp
            templete.append(x)
        data[j]=templete
        #flag标志应该进行消元的行数
        flag = j+1
        while flag < line_size:
            templete1 = []
            temp1=data[flag][j]
            i = 0
            for x1 in data[flag]:
                if x1!=0:
                   x1 = x1-(temp1*templete[i])
                   templete1.append(x1)
                else:
                   templete1.append(0)
                i += 1
            data[flag] = templete1
            flag +=1
        j += 1
 
 
    #求相应的参数值
 
    parameters=[]
    i=line_size-1
    #j标识减去元素个数
    #flag_rol标识除那一列
    flag_j=0
    rol_size=len(data[0])
    flag_rol=rol_size-2
    #获得解的个数
    while i>=0:
        operate_line = data[i]
        if i==line_size-1:
            parameter=operate_line[rol_size-1]/operate_line[flag_rol]
            parameters.append(parameter)
        else:
            flag_j=(rol_size-flag_rol-2)
            temp2=operate_line[rol_size-1]
            #result_flag为访问已求出解的标志
            result_flag=0
            while flag_j>0:
                temp2-=operate_line[flag_rol+flag_j]*parameters[result_flag]
                result_flag+=1
                flag_j-=1
            parameter=temp2/operate_line[flag_rol]
            parameters.append(parameter)
        flag_rol-=1
        i-=1
    return parameters
 
"""计算拟合曲线的值"""
def calculate(data_x,parameters):
    datay=[]
    for x in data_x:
        datay.append(parameters[2]+parameters[1]*x+parameters[0]*x*x)
    return datay
 
 
 
"""完成函数的绘制"""
def draw(data_x,data_y_new,data_y_old):
    plt.plot(data_x,data_y_new,label="拟合曲线",color="black")
    plt.scatter(data_x,data_y_old,label="离散数据")
    mpl.rcParams['font.sans-serif'] = ['SimHei']
    mpl.rcParams['axes.unicode_minus'] = False
    plt.title("一元多项式拟合数据")
    plt.legend(loc="upper left")
    plt.show()
 
data=polynomial_fitting(x,y)
parameters=calculate_parameter(data)
for w in parameters:
    print(w)
newData=calculate(x,parameters)
draw(x,newData,y)

一元多项式拟合的图像
在这里插入图片描述
多元线性拟合

有的时候,影响y的因素不止一个,而是多个因素,这个时候就需要多元线性拟合。

下面的python程序是两变量的线性拟合,还有最后图像的显示。

from mpl_toolkits.mplot3d import Axes3D
from pylab import mpl
import math
import matplotlib.pyplot as plt
"""多元线性拟合
其中拟合数据为x1=2, 4, 5, 8, 9
             x2=3, 5, 7, 9, 12
             y=48, 50, 51, 55, 56
"""
x1 = [2, 4, 5, 8, 9]
x2 = [3, 5, 7, 9, 12]
y = [48, 50, 51, 55, 56]
 
"""完成拟合曲线参数计算前相应变量的计算"""
def multivariatel_liner_fitting(data_x1,data_x2,data_y):
    size = len(data_x1)
    sum_x1 = 0
    sum_x2 = 0
    sum_square_x1 = 0
    sum_square_x2 = 0
    sum_x1x2 = 0
    sum_y = 0
    sum_x1y = 0
    sum_x2y = 0
    i = 0
    while i < size:
        sum_x1 += data_x1[i]
        sum_x2 += data_x2[i]
        sum_y += data_y[i]
        sum_x1y += data_x1[i]*data_y[i]
        sum_x2y += data_x2[i]*data_y[i]
        sum_x1x2 += data_x1[i]*data_x2[i]
        sum_square_x1 += data_x1[i]*data_x1[i]
        sum_square_x2 += data_x2[i]*data_x2[i]
        i += 1
    return [[size, sum_x1, sum_x2, sum_y]
        ,[sum_x1, sum_square_x1, sum_x1x2, sum_x1y]
        ,[sum_x2, sum_x1x2, sum_square_x2,sum_x2y]]
 
 
"""利用高斯消元法,求解拟合曲线的参数"""
def calculate_parameter(data):
    #i用来控制列元素,line是一行元素,j用来控制循环次数,datas用来存储局部变量。保存修改后的值
    i = 0;
    j = 0;
    line_size = len(data)
 
   #将行列式变换为上三角行列式
    while j < line_size-1:
        line = data[j]
        temp = line[j]
        templete=[]
        for x in line:
            x=x/temp
            templete.append(x)
        data[j]=templete
        #flag标志应该进行消元的行数
        flag = j+1
        while flag < line_size:
            templete1 = []
            temp1=data[flag][j]
            i = 0
            for x1 in data[flag]:
                if x1!=0:
                   x1 = x1-(temp1*templete[i])
                   templete1.append(x1)
                else:
                   templete1.append(0)
                i += 1
            data[flag] = templete1
            flag +=1
        j += 1
 
 
    #求相应的参数值
 
    parameters=[]
    i=line_size-1
    #j标识减去元素个数
    #flag_rol标识除那一列
    flag_j=0
    rol_size=len(data[0])
    flag_rol=rol_size-2
    #获得解的个数
    while i>=0:
        operate_line = data[i]
        if i==line_size-1:
            parameter=operate_line[rol_size-1]/operate_line[flag_rol]
            parameters.append(parameter)
        else:
            flag_j=(rol_size-flag_rol-2)
            temp2=operate_line[rol_size-1]
            #result_flag为访问已求出解的标志
            result_flag=0
            while flag_j>0:
                temp2-=operate_line[flag_rol+flag_j]*parameters[result_flag]
                result_flag+=1
                flag_j-=1
            parameter=temp2/operate_line[flag_rol]
            parameters.append(parameter)
        flag_rol-=1
        i-=1
    return parameters
 
def calculate(data_x1,data_x2,parameters):
    datay=[]
    i = 0
    while i < len(data_x1):
        result = parameters[2]+parameters[1]*data_x1[i]+parameters[0]*data_x2[i]
        i += 1
        datay.append(result)
    return datay
 
 
"""完成函数的绘制"""
def draw(data_x,old_y,new_y):
    #创建绘图函数对象
    fig = plt.figure()
    #创建Axes3D对象,让其包含图像3D坐标
    ax = Axes3D(fig)
    ax.scatter(data_x[0], data_x[1], old_y, color='red')
    ax.plot(data_x[0], data_x[1], new_y, color='black')
    mpl.rcParams['font.sans-serif'] = ['SimHei']
    mpl.rcParams['axes.unicode_minus'] = False
    plt.title("多元线性拟合数据")
    plt.show()
 
 
data = multivariatel_liner_fitting(x1, x2, y)
data2 = calculate_parameter(data)
newY = calculate(x1, x2, data2)
draw([x1, x2], y, newY)

多元线性拟合的图像
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

最小二乘法 python实现 的相关文章

随机推荐

  • YOLO项目服务器配置及云硬盘挂载问题

    资源包配置 首先便是conda虚拟环境创建了 这里我们便不一一赘述了 大家可以参考博主先前的文章 然后就是pytorch的安装了 这里可以使用conda命令或者是pip命令 首先是conda命令 博主在第一个服务器时的安装方式就是这个 很正
  • 关于硬件问题造成的MCU死机,过来人简单的谈一谈

    关于MCU死机问题 近期小编在出差期间遇到多起 且原因不同 所以 今日小白借此机会讲一讲因硬件问题造成的MCU死机 MCU不良 在遇到死机问题时 已经可以判定是硬件原因造成的前提下 大多人的选择是交叉验证MCU 先判定是否是MCU单体不良造
  • 软考-嵌入式系统设计师-笔记:嵌入式系统的项目开发与维护

    文章目录 系统开发过程及其项目管理 过程模型 过程评估 软件能力成熟度模型 CMM 能力成熟度模型集成 CMMI 工具与环境 ISO ICE 25010系统和软件质量模型 系统分析知识 系统设计知识 系统设计概述 结构化设计 面向对象设计
  • 接口的静态方法

    静态接口方法 从java开始 接口当中允许使用静态方法 public static 返回值类型 方法名称 参数列表 方法体 提示 就是将abstract或者default换成static即可 带上方法体 方法样式 public interf
  • 老版本的 mybatis-generator 使用示例

    文章目录 main 入口 generatorConfig xml log4j properties main 入口 import java io File import java util ArrayList import java uti
  • c++返回数组引用的函数(4种方法)

    分享返回数组引用的4种方法 普通法 类型别名 尾置返回类型 decltype include
  • CSS层叠上下文

    在学习z index属性的时候 限制了能够使用z index属性的元素 那么为什么有的元素能够使用z index 因为他创建了一个层叠上下文 对于这个词的理解首先要理解上下文 上下文这个名词的出现有很多地方 块级格式上下文 执行上下文 在不
  • 【转载】VC常用小技巧(2)

    项目 如何干净的删除一个类 1 先删除项目中对应的 h和 cpp文件 选中后用 Delete键删除 2 保存后退出项目 到文件夹中删除实际的 h和 cpp文件 3 删除 clw文件 4 重新进入项目 进行全部重建 rebuild all 如
  • 批处理常用命令及用法

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 批处理常用命令及用法大全 阅读本文需要一定的dos基础概念 象 盘符 文件 目录 文件夹 子目录 根目录 当前目录每个命令的完整说明请加 参数参考微软的帮助文档可以看到 在
  • 前端 - 实习两个星期总结

    文章目录 吐槽 总结 新人建议 项目学习到的 今天已经是菜鸟实习的第二个星期了 怎么说呢 反正就是进的一个不大不小的厂 做着不难不易的事 菜鸟现在主要做的就是适配 现在就来总结一下 不过这之前 菜鸟不得不吐槽一波 吐槽 1 菜鸟进的是一家国
  • kvm常见故障及解决

    一 启动虚拟机Connection reset by peer virsh start vmhost1error Failed to start domain vmhost1error Unable to read from monitor
  • 浙江大学计算机学院最权威的老师,浙江大学计算机科学与技术专业导师介绍:郑能干...

    姓名 郑能干 性别 男 职称 副教授 在岗性质 全职在岗 学院 系 计算机科学与技术学院 招生资格类别 硕士生导师 研究方向 人工智能嵌入式系统神经信息工程普适计算 Email zng cs zju edu cn 个人简介 郑能干 男 19
  • 【计算机视觉】深度学习框架-Keras

    文章目录 1 从零开始训练网络 1 1 搭建网络基本架构 1 2 构建训练网络 1 3 启动训练网络并测试数据 2 用Keras实现一个简单神经网络 2 1 Keras简介 2 2 MNIST手写数字识别 详细解释步骤 2 2 1 数据的加
  • C++内存管理(3)——内存池

    1 默认内存管理函数的不足 为什么使用内存池 利用默认的内存管理操作符 new delete 和函数 malloc free 在堆上分配和释放内存会有一些额外的开销 系统在接收到分配一定大小内存的请求时 首先查找内部维护的内存空闲块表 并且
  • [tensorflow] eval和run的区别

    在tensorflow中 eval和run都是获取当前结点的值的一种方式 在使用eval时 若有一个 t 是Tensor对象 调用t eval 相当于调用sess run t 一下两段代码等效 float tensor tf cast tf
  • 毕设系列 - java web 项目获取方式说明

    文章目录 1 项目获取地址 2 项目包含内容 2 1 整体项目内容 3 样例 基于java web的网上招聘系统的设计与实现 3 1 系统研究背景 3 2 系统研究意义 3 3 开发环境 3 4 系统设计 3 4 1 系统设计模块 3 4
  • AOSP>设计>测试>(第三节)兼容性测试套件CTS

    AOSP gt 设计 gt 测试 gt 兼容性测试套件CTS 第三节 兼容性测试套件 CTS 概览 工作流程 测试用例的类型 涵盖的领域 设置CTS 物理环境 蓝牙 LE 信标 相机 GPS GNSS WLAN 和 IPv6 Wi Fi R
  • 基于MATLAB实现语音信号加噪与去噪的低通滤波器

    基于MATLAB实现语音信号加噪与去噪的低通滤波器 一 概述 在语音信号处理中 由于外界环境的干扰或传输过程中的噪声引入 可能导致语音信号质量下降 为了提高语音信号的清晰度和可懂度 需要对信号进行去噪处理 本文将介绍如何使用MATLAB实现
  • 启明智显分享

    提示 启明智显专为智能产品提供一站式彩屏显示 连接 云端服务 APP软件开发 维护等解决方案 帮厂商快速实现硬件的智能化 作为启明云端旗下方案公司 我们用心整理了开发小伙伴在开发过程中可能会遇到的问题以及快速上手的简明教程 同时也用心整理了
  • 最小二乘法 python实现

    最小二乘法适用于对处理的一堆数据 不必精确的经过每一点 而是根据图像到每个数据点的距离和最小确定函数 最小二乘法逼近的最简单的例子是根据一组观测值对 x1 y1 x2 y2 xn yn 来拟合一条直线 直线的数学表达式为 下面是一元线性拟合