当前位置: 首页 > news >正文

滤波笔记一:卡尔曼滤波(Kalman Filtering)详解

本笔记是总结了B站DR_CAN的卡尔曼滤波器的课程,他的B站主页为:DR_CAN的个人空间_哔哩哔哩_bilibili

PS:虽然我不是学自控的,但是老师真的讲的很好! 

目录

Lesson1 递归算法

Lesson2 数学基础_数据融合_协方差矩阵_状态空间方程

Lesson3 卡尔曼增益的详细推导

Lesson4 误差的协方差矩阵Pe的数学推导

 Lesson5 直观理解卡尔曼滤波以及一个实例

当计算误差Wk大于测量误差Vk时

当计算误差Wk小于测量误差Vk时

本例的python代码

突然想到一个问题:如何确定卡尔曼滤波要迭代多少次呢?

总结一下

1.算法迭代的五个步骤

2.算法的python代码实现


Lesson1 递归算法

 

 

Lesson2 数学基础_数据融合_协方差矩阵_状态空间方程

 

 

Lesson3 卡尔曼增益的详细推导

 

 

 

Lesson4 误差的协方差矩阵Pe的数学推导

 

 

 Lesson5 直观理解卡尔曼滤波以及一个实例

 

 

 

 下面具体看一下,之前反复提到过:如果模型计算误差Wk小,最终的估计值就更偏向计算值;

                                                           如果测量误差Vk小,最终的估计值就更偏向于测量值。

而在这个示例中,Wk/Vk的偏差是以其协方差矩阵来反映的(主对角线是方差)。

当计算误差Wk大于测量误差Vk时

Wk的协方差矩阵为Q,Vk的协方差矩阵为R:

 结果图:

结果分析:

真实的实际速度是蓝色曲线,最终的估计速度即为后验估计速度,是黄色曲线。对比它们之间的偏差能够看出估计值与实际值之间的误差,从而判断算法的准确度。

在最优化方法中我们知道:最优估计有不同的准则,比如:最小二乘估计、最小方差估计、极大后验估计等等。具体内容不赘述。

我们要知道,如果没有不确定性(即Wk和Vk),那么估计值就是实际值(精准估计)。

卡尔曼滤波中采用的就是使得误差的方差最小为最优估计准则因为如果后验估计值和真实值越接近,那么误差ek的变化就很小,即误差ek的方差很小。

进一步推导,考虑到误差ek会有很多不同的分量(因为状态量不同,比如说此例子中就是有状态量X1表示位置,状态量X2表示速度,那么它们就分别有误差e1和e2)。要使得总误差方差最小,那么误差各个分量的方差之和加起来就要最小。而“误差各分量的方差之和”正好是误差的协方差矩阵的主对角线之和——迹。

故此我们引入了Wk的协方差矩阵为Q,Vk的协方差矩阵为R。然后其方差越大时,说明误差越大,即越不可以相信。所以此处计算误差较大,可以看到先验估计速度(灰色)偏离实际速度(蓝色)的程度要大于测量速度(红色)偏离实际速度(蓝色的程度)。

所以最后的估计值——后验估计速度(黄色)曲线也是更为接近测量速度(红色)曲线。

一种通俗的理解方式就是:建模计算值和测量值都是不准确的,两者的不准确程度分别以计算误差的方差测量误差的方差来衡量,方差越大越不可以相信。在两个不准确的值的基础上尽量准确估计,就是谁方差越小,越相信谁,越靠近谁。

当计算误差Wk小于测量误差Vk时

 结果分析:

由于此时测量误差的方差较大,导致测量值很不可信,其变化的程度可以看到也很离谱。但是由于后验估计值(黄色)更为依赖模型计算值(灰色),所以后验估计值也没离实际值(蓝色)太远。

而这,正是卡尔曼滤波的作用:在不准确之中得到最准确的估计值。

本例的python代码

源代码来源:B站用户东爱北的GitHub​​​​​​https://github.com/liuchangji/2D-Kalman-Filter-Example_Dr_CAN_in_python

我对其中的源码做了注释,以及对一个小错误进行了修改(产生符合高斯分布的变量时,scale输入的应该是标准差,而协方差矩阵里面主对角线上面是方差,所以要开根号,要注意开完根号要保证其类型仍为np.float) 



import numpy as np
import math
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号


#定义一个产生符合高斯分布的函数,均值为loc=0.0,标准差为scale=sigma,输出的大小为size
def gaussian_distribution_generator(sigma):
    return np.random.normal(loc=0.0,scale=sigma,size=None)

# 状态转移矩阵,上一时刻的状态转移到当前时刻
A = np.array([[1,1],[0,1]])

# 过程噪声w协方差矩阵Q,P(w)~N(0,Q),噪声来自真实世界中的不确定性
Q = np.array([[0.01,0],[0,0.01]])

# 测量噪声协方差矩阵R,P(v)~N(0,R),噪声来自测量过程的误差
R = np.array([[1,0],[0,1]])

# 传输矩阵/状态观测矩阵H
H = np.array([[1,0],[0,1]])

# 控制输入矩阵B
B = None

# 初始位置和速度
X0 = np.array([[0],[1]])

# 状态估计协方差矩阵P初始化
P =np.array([[1,0],[0,1]])

if __name__ == "__main__":
    #---------------------初始化-----------------------------
    #真实值初始化 这里还要再写一遍np.array是保证它的类型是数组array
    X_true = np.array(X0)
    #后验估计值Xk的初始化
    X_posterior = np.array(X0)
    #第k次误差的协方差矩阵的初始化
    P_posterior = np.array(P)

    #创建状态变量的真实值的矩阵 状态变量1:速度 状态变量2:位置
    speed_true = []
    position_true = []

    #创建测量值矩阵
    speed_measure = []
    position_measure = []

    #创建状态变量的先验估计值
    speed_prior_est = []
    position_prior_est = []

    #创建状态变量的后验估计值
    speed_posterior_est = []
    position_posterior_est = []

    #---------------------循环迭代-----------------------------
    #设置迭代次数为30次

    for i in range(30):
        #--------------------建模真实值-----------------------------

        # 生成过程噪声w w=[w1,w2].T(列向量)
        # Q[0,0]是过程噪声w的协方差矩阵的第一行第一列,即w1的方差,Q[1,1]是协方差矩阵的第二行第二列,即为w2的方差
        # python的np.random.normal(loc,scale,size)函数中scale输入的是标准差,所以要开方
        Q_sigma = np.array([[math.sqrt(Q[0,0]),Q[0,1]],[Q[1,0],math.sqrt(Q[1,1])]])
        w = np.array([[gaussian_distribution_generator(Q_sigma[0, 0])],
                      [gaussian_distribution_generator(Q_sigma[1, 1])]])
        # print('00',Q[0,0],'它的类型是',type(Q[0,0]))
        # print('开根号的00', Q_sigma[0, 0], '它的类型是', type(Q_sigma[0, 0]))
        # print('00的平方根',math.sqrt(Q[0,0]),"它的类型是",type(math.sqrt(Q[0,0])))
        # print('w[',i,']=',w)

        # 真实值X_true 得到当前时刻的状态;之前我一直在想它怎么完成从Xk-1到Xk的更新,实际上在代码里面直接做迭代就行了,这里是不涉及数组下标的!!!
        #dot函数用于矩阵乘法,对于二维数组,它计算的是矩阵乘积
        X_true = np.dot(A, X_true) + w

        # 速度的真实值是speed_true 使用append函数可以把每一次循环中产生的拼接在一起,形成一个新的数组speed_true
        speed_true.append(X_true[1,0])
        position_true.append(X_true[0,0])
        #print(speed_true)


        # --------------------生成观测值-----------------------------
        # 生成过程噪声
        R_sigma = np.array([[math.sqrt(R[0,0]),R[0,1]],[R[1,0],math.sqrt(R[1,1])]])
        v = np.array([[gaussian_distribution_generator(R_sigma[0,0])],[gaussian_distribution_generator(R_sigma[1,1])]])

        # 生成观测值Z_measure 取H为单位阵
        Z_measure = np.dot(H, X_true) + v
        speed_measure.append(Z_measure[1,0]),
        position_measure.append(Z_measure[0,0])

        # --------------------进行先验估计-----------------------------
        # 开始时间更新
        # step1:基于k-1时刻的后验估计值X_posterior建模预测k时刻的系统状态先验估计值X_prior
        # 此时模型控制输入U=0
        X_prior = np.dot(A, X_posterior)
        # 把k时刻先验预测值赋给两个状态分量的先验预测值 speed_prior_est = X_prior[1,0];position_prior_est=X_prior[0,0]
        # 再利用append函数把每次循环迭代后的分量值拼接成一个完整的数组
        speed_prior_est.append(X_prior[1,0])
        position_prior_est.append(X_prior[0,0])

        # step2:基于k-1时刻的误差ek-1的协方差矩阵P_posterior和过程噪声w的协方差矩阵Q 预测k时刻的误差的协方差矩阵的先验估计值 P_prior
        P_prior_1 = np.dot(A, P_posterior)
        P_prior = np.dot(P_prior_1, A.T) + Q

        # --------------------进行状态更新-----------------------------
        # step3:计算k时刻的卡尔曼增益K
        k1 = np.dot(P_prior, H.T)
        k2 = np.dot(H, k1) + R
        #k3 = np.dot(np.dot(H, P_prior), H.T) + R  k2和k3是两种写法,都可以
        K = np.dot(k1, np.linalg.inv(k2))

        # step4:利用卡尔曼增益K 进行校正更新状态,得到k时刻的后验状态估计值 X_posterior
        X_posterior_1 = Z_measure -np.dot(H, X_prior)
        X_posterior = X_prior + np.dot(K, X_posterior_1)
        # 把k时刻后验预测值赋给两个状态分量的后验预测值 speed_posterior_est = X_posterior[1,0];position_posterior_est = X_posterior[0,0]
        speed_posterior_est.append(X_posterior[1,0])
        position_posterior_est.append(X_posterior[0,0])

        # step5:更新k时刻的误差的协方差矩阵 为估计k+1时刻的最优值做准备
        P_posterior_1 = np.eye(2) - np.dot(K, H)
        P_posterior = np.dot(P_posterior_1, P_prior)

    # ---------------------再从step5回到step1 其实全程只要搞清先验后验 k的自增是隐藏在循环的过程中的 然后用分量speed和position的append去记录每一次循环的结果-----------------------------

    # 可视化显示 画出速度比较和位置比较
    if True:
        # 画出1行2列的多子图
        fig, axs = plt.subplots(1,2)
        #速度
        axs[0].plot(speed_true,"-",color="blue",label="速度真实值",linewidth="1")
        axs[0].plot(speed_measure,"-",color="grey",label="速度测量值",linewidth="1")
        axs[0].plot(speed_prior_est,"-",color="green",label="速度先验估计值",linewidth="1")
        axs[0].plot(speed_posterior_est,"-",color="red",label="速度后验估计值",linewidth="1")
        axs[0].set_title("speed")
        axs[0].set_xlabel('k')
        axs[0].legend(loc = 'upper left')


        #位置
        axs[1].plot(position_true,"-",color="blue",label="位置真实值",linewidth="1")
        axs[1].plot(position_measure,"-",color="grey",label="位置测量值",linewidth="1")
        axs[1].plot(position_prior_est,"-",color="green",label="位置先验估计值",linewidth="1")
        axs[1].plot(position_posterior_est,"-",color="red",label="位置后验估计值",linewidth="1")
        axs[1].set_title("position")
        axs[1].set_xlabel('k')
        axs[1].legend(loc = 'upper left')

        #     调整每个子图之间的距离
        plt.tight_layout()
        plt.figure(figsize=(60, 40))
        plt.show()

 结果图1(迭代30次):

图2(迭代60次):

 图1结果分析:

本次实例中,取了过程噪声的协方差矩阵为Q=[0.01,0;0,0.01],即过程噪声的方差为0.01。取了测量噪声的协方差矩阵为R=[1,0;0,1],即测量噪声的方差为1。根据最小方差估计准则,此时过程噪声方差小于测量噪声的误差,则先验估计值比测量值更可靠。

我们看图:

在速度的分析图中,明显看到速度测量值(灰色)偏离速度真实值(蓝色)的程度大于速度先验估计值(绿色)偏离速度真实值(蓝色)的程度,而经过卡尔曼滤波之后,后验估计值(红色)并没有非常偏离真实值(蓝色)。这就是因为此时卡尔曼滤波更为相信先验估计值。

位置分析同理。

突然想到一个问题:如何确定卡尔曼滤波要迭代多少次呢?

网上说不一定是迭代越多次越准确,由于采用最小方差估计准则,所以我想到了去看误差ek的协方差矩阵的迹,迹越小越好(误差分量的方差之和越小)。然后我又加了几行代码:

# 创建误差的协方差矩阵的迹
    tr_P_posterior = []

# 误差的协方差矩阵的迹,迹越小说明估计越准确
        # print('ek1的方差:',P_posterior[0,0],'ek2的方差',P_posterior[1,1])

        tr_P_posterior.append(P_posterior[0,0]+P_posterior[1,1])

 #误差的协方差的迹
        axs[2].plot(tr_P_posterior,"-",color="blue",label="误差的迹",linewidth="1")

60次迭代的图: 

可以看到,基本上在20次左右,误差的迹就已经收敛至min值了。

于是我把迭代次数调整成20次:

可以看到,大约在十几次的时候,误差的迹就收敛至极限值(约为0.38左右)

那么就是说,刚开始迭代时,卡尔曼滤波器的误差还是挺大的(方差之和大约为1) ,随着迭代的进行,滤波器误差逐步减少至最低点,此后的误差维持在这个点(误差无法完全消除,只存在最小误差),即预测精度达到最优值。

总结一下

1.算法迭代的五个步骤

2.算法的python代码实现

我自己从头开始写的时候最难受的点应该就是因为太久不碰后端,逻辑上会很卡,然后忘记了append函数的作用,搞得我一直在纠结怎么从k-1时刻更新到k时刻,在想是不是要对矩阵做下标的更新什么的,循环迭代这里卡了很久。还有就是对状态变量、先验估计量、后验估计量、协方差矩阵的先验估计量和后验估计量以及它们之间的关系、它们与时刻k、k-1之间的关系不熟。

其实在代码中,我们看一下这五个公式,对于当前时刻k:

step1中的(k-1)时刻的后验估计就是上一次step4估计得到的结果,它们是同一个变量X_posterior;

step2中的 Pk-1就是上一次step5计算得到的结果,它们是同一个变量P_posterior;

step3中的Pk先验,就是本次的step2计算得到的结果,它们是同一个变量P_prior;

step4中的Xk先验,就是本次的step1计算得到的结果,它们是同一个变量X_prior;

其次就是,我们要画图表示出速度、位置的迭代变化,就需要记录下每一次迭代产生的速度值和变量值,然后对它们进行可视化。

最后就是,如果你对先验、后验、时刻搞不清,用英文写清楚变量意思!!不要光贪图简洁!

相关文章:

利用Python求斐波那契数列的第N项以及前N项和(循环、递归、集合)

著名的斐波那契数列,即从第三项开始,每一项都等于前两项之和。 之前写过利用Java语言来编写,由于最近正在学Python,所以将自己的想法记录在此,有需要的朋友可以参考一下。 写在前面:这里的三个方法其实思…...

一文速学(十八)-数据分析之Pandas处理文本数据(str/object)各类操作+代码一文详解(三)

目录 前言 一、子串提取 提取匹配首位子串 提取所有匹配项(extractall)...

Python数据分析-数据预处理

数据预处理 文章目录数据预处理1.前言2.数据探索2.1缺失值分析2.2 异常值分析2.2.1 简单统计量分析2.2.2 3$\sigma$原则2.2.3 箱线图分析2.3 一致性分析2.4 相关性分析3.数据预处理3.1 数据清洗3.1.1 缺失值处理3.1.2 异常值处理3.2 数据集成3.2.1 实体识别3.2.2 冗余属性识别3…...

【Python】AES加解密代码,文章还有加密串等你来解密,等你来挑战

🍦🍦写这篇AES文章也是有件趣事,有位小伙伴发了段密文,看看谁解密速度快,学过Python的小伙伴一下子就解开来了,内容也挺有趣的。 🍟🍟原来加解密也可以这么有趣,虽然看起…...

朴素贝叶斯模型及案例(Python)

目录 1 朴素贝叶斯的算法原理 2 一维特征变量下的贝叶斯模型 3 二维特征变量下的贝叶斯模型 4 n维特征变量下的贝叶斯模型 5 朴素贝叶斯模型的sklearn实现 6 案例:肿瘤预测模型 6.1 读取数据与划分 6.1.1 读取数据 6.1.2 划分特征变量和目标变量 6.2 模型…...

python之Tkinter详解

Python之Tkinter详解 文章目录Python之Tkinter详解1、Tkinter是什么2、Tkinter创建窗口①导入 tkinter的库 ,创建并显示窗口②修改窗口属性③创建按钮④窗口内的组件布局3、Tkinter布局用法①基本界面、label(标签)和button(按钮)用法②entry(输入)和text(文本)用法…...

【python】python进行debug操作

文章目录前言一、debug环境介绍二、debug按钮介绍2.1、step into:单步执行(遇到函数也是单步)2.2、step over:单步执行(遇到函数,全部运行)2.3、step into my code:(直接跳到下一个断点)2.4、st…...

Python安装tensorflow过程中出现“No matching distribution found for tensorflow”的解决办法

在Pycharm中使用pip install tensorflow安装tensorflow时报错: ERROR: Could not find a version that satisfies the requirement tensorflow(from versions: none) ERROR: No matching distribution found for tensorflow搜了好多帖子有的说可能是网络的问题&…...

pandas中的read_csv参数详解

1.官网语法 pandas.read_csv(filepath_or_buffer, sepNoDefault.no_default**,** delimiterNone**,** headerinfer’, namesNoDefault.no_default**,** index_colNone**,** usecolsNone**,** squeezeFalse**,** prefixNoDefault.no_default**,** mangle_dupe_colsTrue**,** dty…...

Python — — turtle 常用代码

目录 一、设置画布 二、画笔 1、画笔属性 2、绘图命令 (1) 画笔运动命令 (2) 画笔控制命令 (3) 全局控制命令 (4) 其他命令 3. 命令详解 三、文字显示为一个圆圈 四、画朵小花 一、设置画布 turtle为我们展开用于绘图区域,我们可以设置它的…...

【我是土堆 - PyTorch教程】学习随手记(已更新 | 已完结 | 10w字超详细版)

目录 1. Pytorch环境的配置及安装 如何管理项目环境? 如何看自己电脑cuda版本? 安装Pytorch 2. Python编辑器的选择、安装及配置 PyCharm PyCharm神器 Jupyter(可交互) 3. Python学习中的两大法宝函数 说明 实战操…...

“OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized.”解决方法总结

一、问题描述 跑了点神经网络的代码,想画几个激活函数的图像,代码如下: 运行后报了以下错误: 翻译如下: OMP:错误 #15:正在初始化 libiomp5md.dll,但发现 libiomp5md.dll 已经初…...

python3.11.2安装 + pycharm安装

下载 :https://www.python.org/ 2.双击下载的软件: 3.进入安装界面 下一步,点击 是 上一步点击后就看到如下: 安装成功了,接下来检测一下:cmd 安装pycharm PyCharm是一种Python IDE(Integr…...

Python中numpy.polyfit的用法详解

numpy中polyfit的用法 参数 polyfit(x, y, deg, rcondNone, fullFalse, wNone, covFalse):x:M个采样点的横坐标数组; y:M个采样点的纵坐标数组;y可以是一个多维数组,这样即可拟合相同横坐标的多个多项式; deg:多项式…...

彻底解决Python包下载慢问题

python默认使用的是国外镜像,有时候下载非常慢,最快的办法就是在下载命令中增加国内源: 常用的国内源如下: 清华大学:https://pypi.tuna.tsinghua.edu.cn/simple/ 阿里云:http://mirrors.aliyun.com/pypi/…...

Anaconda 使用指南,少走弯路

​​​​​​​anaconda包管理器和环境管理器,强烈建议食用 1.下载 官网下载太慢可选用镜像下载 官网下载 :Anaconda | Individual Editionhttps://www.anaconda.com/products/distribution 镜像下载:Index of /anaconda/archive/ | 清华大…...

使用stable diffusion webui时,安装gfpgan失败的解决方案(windows下的操作)

1.问题描述 初次打开stable diffusion webui时,需要安装gfpgan等github项目。但在安装gfpgan时,显示RuntimeError: Couldnt install gfpgan 2.解决方案 无法安装gfpgan的原因是网络问题,就算已经科学上网,并设置为全局&#x…...

Python 中导入csv数据的三种方法

这篇文章主要介绍了Python 中导入csv数据的三种方法,内容比较简单,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下微点阅读小编收集的文章介绍。 Python 中导入csv数据的三种方法,具体内容如下所示: 1、通过…...

相关性分析、相关系数矩阵热力图

相关性 相关性分析是研究两组变量之间是否具有线性相关关系,所以做相关性分析的前提是假设变量之间存在线性相关性,得到的结果也是描述变量间的线性相关程度。除此之外,相关性分析方法还会有其他的假设条件。而灰色关联度分析首先对数据量要求…...

【python123】题目答案整理 ------更多答案见专栏

目录 二老鼠打洞 来自计算机的问候-任意数量参数 自定义幂函数 来自计算机的问候-多参函数 编写函数输出自除数 最大素数 求数列前n项的平方和 生兔子 计算圆周率——割圆法 数列求前n项和 素数: *如有错误请私聊纠正 二老鼠打洞 nint(input()) # 每日打…...

Python编程题汇总

Python编程复习 1.1找出列表中单词最长的一个 找出列表中单词最长的一个def test():a ["hello", "world", "yoyo", "congratulations"]length len(a[0])# 在列表中循环for i in a:if len(i) > length:length ireturn length p…...

Matplotlib详解

视频教程 1.什么是matplotlib matplotlib: 最流行的Python底层绘图库,主要做数据可视化图表,名字取材于MATLAB,模仿MATLAB构建 2.样例 2.1折线图 eg:假设一天中每隔两个小时(range(2,26,2))的气温(℃)分别是[15,13,14.5,17,20,25,26,26,…...

Jetson AGX Orin安装Anaconda、Cuda、Cudnn、Pytorch、Tensorrt最全教程

文章目录一:Anaconda安装二:Cuda、Cudnn安装三:Pytorch安装四:Tensorrt安装一:Anaconda安装 Jetson系列边缘开发板,其架构都是arm64,而不是传统PC的amd64,深度学习的环境配置方法大…...

pytorch入门篇2 玩转tensor(查看、提取、变换)

上一篇博客讲述了如何根据自己的实际需要在pytorch中创建tensor:pytorch入门篇1——创建tensor,这一篇主要来探讨关于tensor的基本数据变换,是pytorch处理数据的基本方法。 文章目录1 tensor数据查看与提取2 tensor数据变换2.1 重置tensor形状…...

随机森林算法

随机森林1.1定义1.2随机森林的随机性体现的方面1.3 随机森林的重要作用1.4 随机森林的构建过程1.5 随机森林的优缺点2. 随机森林参数描述3. 分类随机森林的代码实现1.1定义 随机森林是一种有监督学习算法,是以决策树为基学习器的集成学习算法。随机森林非常简单&am…...

实证分析 | 中介效应检验原理与Stata代码实现

前言 本文是温忠鳞和叶宝娟2014年刊载于《心理科学进展》的论文《中介效应分析:方法和模型发展》的简要笔记与拓展。 温忠麟、叶宝娟:《中介效应分析:方法和模型发展》,《心理科学进展》,2014年第5期 中介效应检验 要…...

几个代码画出漂亮的词云图,python最简单的词云图教程(建议收藏)

在开始编写程序之前,我们先了解一下词云图的作用,我们拿到一篇文章,想得到一些关键词,但文章篇幅很大,无法短时间得到关键词,这时我们可以通过程序将文章中的每个词组识别出来,统计每个词组出现…...

mac m1,m2 安装 提供GPU支持的pytorch和tensorflow

mac m1,m2 安装 提供GPU支持的pytorch和tensorflowAnaconda安装测试Pytorch参考链接安装步骤安装 Xcode创建conda环境测试加速效果注意Tensorflow参考链接安装步骤安装 Xcode指定安装环境加速效果测试The Endmac m1 刚出的时候,各种支持都不完善。那时候要使用conda…...

如何用Python优雅的合并两个Dict

假设有两个dict x和y,合并成一个新的dict,不改变 x和y的值,例如 x {a: 1, b: 2}y {b: 3, c: 4} 期望得到一个新的结果Z,如果key相同,则y覆盖x。期望的结果是 >>> z {a: 1, b: 3, c: 4} 在PEP448中&#xff…...

python读取文件的几种方式

下面是不同场景较为合适的数据读取方法: 1.python内置方法(read、readline、readlines) 纯文本格式或非格式化、非结构化的数据,常用语自然语言处理、非结构文本解析、应用正则表达式等后续应用场景下,Python默认的三…...

python常用模块大全

目录 时间模块time() 与 datetime()random()模块os模块sys模块tarfile用于将文件夹归档成 .tar的文件shutil 创建压缩包,复制,移动文件zipfile将文件或文件夹进行压缩 shelve 模块 json和pickle序列化hashlib 模块subprocess 模块re模块 时间模块time() 与 datetime() time()模…...

成本降低90%,OpenAI正式开放ChαtGΡΤ

今天凌晨,OpenAI官方发布ChαtGΡΤ和Whisper的接囗,开发人员现在可以通过API使用最新的文本生成和语音转文本功能。OpenAI称:通过一系列系统级优化,自去年12月以来,ChαtGΡΤ的成本降低了90%;现在OpenAI用…...

Python:ModuleNotFoundError错误解决

前言: 大家都知道python项目中需要导入各种包(这里的包引鉴于java中的),官话来讲就是Module。 而什么又是Module呢,通俗来讲就是一个模块,当然模块这个意思百度搜索一下都能出来,Python 模块(…...

python案例——利用python画图

1、画直线 问题描述: 利用python中的 turtle (海龟绘图)模块提供的函数绘制直线 算法设计: turtle.penup(): 画笔抬起turtle.color(): 设置颜色turtle.goto(): 画笔移动到下一目标turtle.pendown(): …...

pandas.DataFrame设置某一行为表头(列索引),设置某一列为行索引,按索引取多行多列

pandas读取文件 pandas.DataFrame 设置索引 pandas.DataFrame 读取单行/列,多行多列 pandas.DataFrame 添加行/列 利用pandas处理表格类型数据,快捷方便,不常用但是有的时候又是必要技能,在这里记录一下一些常用函数和自己的踩坑…...

主成分分析(PCA)算法模型实现及分析(MATLAB实现)PCA降维

主成分分析(PCA)算法模型实现及分析(源码在文章后附录)1 引言2 关于PCA原理和算法实现2.1 PCA基本原理2.2 协方差计算2.3 PCA实现步骤  (1)PCA算法实现步骤  (2)基于特征值分解协…...

python 识别图片验证码/滑块验证码准确率极高的 ddddocr 库

前言 验证码的种类有很多,它是常用的一种反爬手段,包括:图片验证码,滑块验证码,等一些常见的验证码场景。 识别验证码的python 库有很多,用起来也并不简单,这里推荐一个简单实用的识别验证码的…...

华为OD机试 - 称砝码(Java JS Python)

题目描述 现有n种砝码,重量互不相等,分别为 m1,m2,m3…mn ; 每种砝码对应的数量为 x1,x2,x3...xn 。现在要用这些砝码去称物体的重量(放在同一侧),问能称出多少种不同的重量。 输入描述 对于每组测试数据: 第一行:n --- 砝码的种数(范围[1,10]) 第二行:m1 m2 m3 ... m…...

DataFrame转化为json的方法教程

网络上有好多的教程,讲得不太清楚和明白,我用实际的例子说明了一下内容,附档代码,方便理解和使用 DataFrame.to_json(path_or_bufNone, orientNone, date_formatNone, double_precision10, force_asciiTrue, date_unitms, defau…...

requests库的使用(一篇就够了)

urllib库使用繁琐,比如处理网页验证和Cookies时,需要编写Opener和Handler来处理。为了更加方便的实现这些操作,就有了更为强大的requests库。 request库的安装 requests属于第三方库,Python不内置,因此需要我们手动…...

Pytorch+PyG实现MLP

文章目录前言一、导入相关库二、加载Cora数据集三、定义MLP网络四、定义模型五、模型训练六、模型验证七、结果完整代码前言 大家好,我是阿光。 本专栏整理了《图神经网络代码实战》,内包含了不同图神经网络的相关代码实现(PyG以及自实现&a…...

PYcharm怎么用,一篇教会你

文章目录一、界面介绍二、设置中文(无需汉化包)三、常用快捷键四、Python 标识符和关键字1、标识符2、 关键字五、行和缩进六、Python 引号七、Python注释1、单行注释2、多行注释八、Python空行九、输入和输出1、print 输出2、input 输入十、多行语句一、…...

如何在pycharm中使用anaconda的虚拟环境

最近项目中有许多同学咨询如何在pycharm中使用anaconda的虚拟环境(envs),这里就给大家简单介绍一下。 首先我们需要安装anaconda,这里就不在追述了,网上安装教程非常多。anaconda的安装路径大家需要记着因为后面会使用…...

Pytorch环境安装+Pycharm环境安装

我的配置: CUDA版本:11.7 Pytorch版本:1.13.0 Anaconda版本:anaconda3.2022.10(64-bit) Pycharm版本:2022社区版 具体配置过程如下: 1.Anaconda安装 本次安装的anaconda为win6…...

csapp第三章(2) --- 程序的机器级表示

csapp第三章(1) --- 程序的机器级表示https://blog.csdn.net/m0_63488627/article/details/129470787?spm1001.2014.3001.5501本章大纲 目录 3.4.过程 3.4.1运行中的栈 3.4.2转移控制 3.4.3数据传送 3.4.4栈上的局部存储 3.4.5栈的递归实现 3.5.数组分配和访问 3.6结…...

使用Ananconda进行Pytorch配置

为什么选择pytorch: 活跃度:逐渐形成了完整的开发生态,资源多。动态图:动态图架构,且运行速度较快。代码简洁:易于理解,设计优雅,易于调试。 可能有的疑惑: 深度学习框架太多不知道…...

python实现定时任务的8种方式详解

在日常工作中,常常会用到需要周期性执行的任务,一种方式是采用 Linux 系统自带的 crond 结合命令行实现。另外一种方式是直接使用Python。 当每隔一段时间就要执行一段程序,或者往复循环执行某一个任务,这就需要使用定时任…...

强大的数据分析工具——Pandas操作、易错点、知识点三万字详解

一、 Pandas数据结构 1.Series 2.DataFrame 3.从DataFrame中查询出Series DataFrame: 二维数据、整个表格、多行多列 Series:一维数据,一行或者一列 import pandas as pd import numpy as np 1、Series Series是一种类似于一维数组的对象,它由一组数…...

第一章 使用 matplotlib 绘制折线图

系列文章目录 第一章 使用 matplotlib 绘制折线图 第二章 使用 matplotlib 绘制条形图 第三章 使用 matplotlib 绘制直方图 第四章 使用 matplotlib 绘制散点图 第五章 使用 matplotlib 绘制饼图 第六章 使用 matplotlib 绘制热力图 第七章 使用 matplotlib 绘制堆叠条形图 第…...

jupyter notebook运行代码没反应且in[ ]没有*

前言: 在刚解决jupyter notebook打不开网页的问题后,我迫不及待地写了Python的代码,看看运行的结果如何。于是,我输入了print("Hello, world"),期待地点了一下运行,结果它直接跳到下一行了......…...