最近再处理卫星盐度数据时,通过时空匹配以及质量控制之后,需要对所得数据进行拟合分析。进而分析其误差分布、原因等。
根据学习,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的海洋小白 水平有限,欢迎指正!!! 欢迎评论、收藏。