当前位置 博文首页 > level2c nc 文件做线性拟合:y=ax+b_简朴的博客:python SMAP

    level2c nc 文件做线性拟合:y=ax+b_简朴的博客:python SMAP

    作者:[db:作者] 时间:2021-08-17 09:44

    最近再处理卫星盐度数据时,通过时空匹配以及质量控制之后,需要对所得数据进行拟合分析。进而分析其误差分布、原因等。
    根据学习,python中自带线性拟合的函数,使用起来较为方便快捷~
    下面介绍两组实现方式:
    一、numpy.linalg.lstsq
    具体参数链接为:numpy.linalg.lstsq
    总之,这个库的目的是将最小二乘解返回线性矩阵方程
    举一个例子,现有两组数据,我们最终想法是通过一些嘈杂的数据点拟合一条线,y = mx + c:

    x = np.array([0, 1, 2, 3])
    
    y = np.array([-1, 0.2, 0.9, 2.1])
    

    我们可以将线方程改写为y = Ap,其中A = [[x 1]]和p = [[m],[c]],
    使用lstsq求解p

    A = np.vstack([x, np.ones(len(x))]).T
    #通过上述函数可以得到A:
    A
    array([[ 0.,  1.],
           [ 1.,  1.],
           [ 2.,  1.],
           [ 3.,  1.]])
    
    m, c = np.linalg.lstsq(A, y, rcond=None)[0]
    
    m, c
    (1.0 -0.95) # may vary``
    

    得到我们需要的系数之后,绘制数据和拟合线:

    import matplotlib.pyplot as plt
    
    _ = plt.plot(x, y, 'o', label='Original data', markersize=10)
    
    _ = plt.plot(x, m*x + c, 'r', label='Fitted line')
    
    _ = plt.legend()
    
    plt.show()
    

    在这里插入图片描述
    明白了大致过程之后,对自己的数据进行相应的套用即可(我这里是对所需要的两套盐度数据进行拟合):

    import numpy as np
    import pandas as pd
    filename='G:\\select\\2020prof.csv'
    data=pd.read_csv(filename)
    smap_sss=data['smap_sss']
    argo_sss=data['argo_sss']
    x0 = np.linspace(0,50)  
    y0=x0
    # 创建画板-绘图
    plt.rcParams['font.sans-serif']=['SimHei'] 
    fig2=plt.figure(figsize=(30,10))#设置一个画板,将其返还给fig
    fig2.tight_layout()#使均匀分布
    # argo vs smap
    ax1 = fig2.add_subplot(1,3,1,)
    # ax1.grid()#添加网格线,true
    cm = plt.cm.get_cmap('jet',8)#加入色标
    cb=ax1.scatter(argo_sss,smap_sss,c=pres,cmap = cm,vmin=0,vmax=4,marker='*',s=10)#绘制散点图
    ax1.plot(x0,y0)#绘制一条1:1的曲线
    ax1.set_title('SMAP vs Argo',fontsize=30)#设置标题
    ax1.set_ylabel('SMAP 盐度(psu)',fontsize=30)
    ax1.set_xlabel('Argo 盐度(psu)',fontsize=30)#设置x轴标签
    ax1.annotate('Std=0.97', (0.6, 0.2), xycoords='axes fraction', fontsize=25,color="k")#添加文本
    ax1.tick_params(labelsize=20)#设置x轴、y轴单位字体大小
    #===========拟 合======================================
    A1 = np.vstack([argo_sss, np.ones(len(argo_sss))]).T
    m1, c1 = np.linalg.lstsq(A1, smap_sss, rcond=None)[0]
    ax1.plot(argo_sss, m1*argo_sss + c1, 'r',linestyle=':',linewidth=5)
    ax1.set_ylim((25, 40))#将Y轴范围设定在(25, 40)
    ax1.set_xlim((25, 40))
    ax1.annotate(' Y = 0.45580X + (19.09928)', (0, 0.4), xycoords='axes fraction',\
                 fontsize=20,color="k",rotation=28)
    
    

    在这里插入图片描述

    怎么样,效果不错吧~

    二、调用LinearRegression 函数(普通最小二乘线性回归)

    LinearRegression参数说明

    sklearn.linear_model.LinearRegression(*, fit_intercept=True, normalize=False, copy_X=True, n_jobs=None, positive=False)
    LinearRegression使用系数w =(w1,…,wp)拟合线性模型,以最小化数据集中观察到的目标与通过线性近似预测的目标之间的平方余数.
    话不多说,直接上代码,具体的参数传递可以去参数说明中查看~

    import pandas as pd
    import numpy as np
    from sklearn.linear_model import LinearRegression 
    filename='G:\\select\\2020prof.csv'
    data=pd.read_csv(filename)
    smap_sss=data['smap_sss']
    argo_sss=data['argo_sss']
    fig=plt.figure(figsize=(8,8))
    ax=fig.add_subplot()
    x2=argo_sss.reshape((-1, 1))
    y2=ref_sss.reshape((-1, 1))
    reg = LinearRegression().fit(x2, y2)
    r=reg.score(x2, y2)
    print("一元回归方程为:  Y = %.5fX + (%.5f)" % (reg.coef_[0][0], reg.intercept_[0]))
    cm = plt.cm.get_cmap('jet',8)
    cb=ax.scatter(argo_sss,smap_sss,c=pres,cmap = cm,vmin=0,vmax=4,marker='*',s=10)
    ax.plot(x2, reg.predict(x2), color='lightskyblue', linewidth=1,linestyle='-')
    plt.show()
    

    在这里插入图片描述

    		                            
                               一个努力学习python的海洋小白
                                水平有限,欢迎指正!!!
                                欢迎评论、收藏。
    
    
    
    
    cs
    下一篇:没有了