前言
由于IDL要考试所以记录下5个程序和他们的语法过程,也权当是复习了,其实写过一遍之后一下就记住了,尽量注解详细一些,主要是我的老巢被人发现了,只能方便你我他了。
需求分析
首先,定义好文件名,并且利用read_csv的function读入csv,读入的data是一个结构体,即struct,所以需要点号去访问,是个2个数组组合成的结构体看下图
fn = 'C:\Users\黄\Desktop\scatterdata.csv'
data = read_csv(fn) ;csv读出来的是一个结构体需要抽变量的话需要用括号
x = data.(0)
y = data.(1)
所以用x = data.(0)拿出矩阵来,field1,field2就是字段。
读出来之后进行绘图,绘图用的函数绘图法,即scatterplot,需要一个变量去记录这些信息(figure,axes,axis…)是一个结构体,所以用p
p = scatterplot(x,y,dimensions = [1200,500],xtitle='x',ytitle='y',symbol = '+',$
SYM_COLOR = 'red',position=[0.1,0.12,0.45,0.95] )
;y = kx + b一元线性方程
;regress函数所以a为k,b为偏移量,correlation为相关系数,yfit是拟合之后给出的y值。即经过这个方程给出的y值所以会有偏差
a = regress(x,y,const = b,correlation = r,yfit = y_fitted)
;绘图
;返回最小值和最大值以便绘图
x1 = min(x) ;x1为最小值
y1 = a*x1 + b
x2 = max(x) ;x2为最大值
y2 = a*x2 + b
p1 = plot([x1,x2],[y1,y2],/overplot,/current)
;填充等式在图上,format = '5.3'表示5个字符宽度的单精度数字,保留到小数点后3位
;text为将内容补上去,坐标系为常用坐标系,所以
streq = 'y=' + string(a,format ='(f5.3)') + '*x' + string(b,format='(f5.3)')
streqcorrlation = 'r=' + string(r,format = '(f5.3)')
t1 = text(0.05,4.8,streq,target = p,/data)
t2 = text(0.05,4.6,streqcorrlation,target = p,/data)
dimensions为窗体的大小,symbol为符号的样式,sym_color为符号的颜色
position为矩阵,即返回的是[x1,y1,x2,y2],坐标是归一化的坐标,
regress函数,a为k,b为offset(偏移量),correlation为相关系数,yfit是拟合之后表达式根据原来x计算出的y‘的值。即经过这个拟合方程给出的y值所以会有偏差。
后续填充等式在图上,format = '5.3’表示5个字符宽度的单精度数字,保留到小数点后3位
text为题字,需要注意target需要指定你绘图的对象即p。
/data:如果在数据坐标中指定了输入参数,则设置此关键字。设置此关键字可将文本插入当前数据空间,否则文本将添加到注释图层。
这样就绘制完了第一幅图。
绘制完第一幅图后绘制第二幅图。
p3 = scatterplot(y,y_fitted,position = [0.57,0.12,0.97,0.95],symbol = '+',$
sym_color = 'green',/current,xtitle = 'y' ,ytitle = 'y_fitted')
p4 = plot([3.0,5.0],[3.0,5.0],/current,/overplot)
MAE = mean(abs(y - y_fitted))
RMSE = sqrt(mean((y-y_fitted)^2))
strmae = 'MSE=' + string(MAE,format = '(f5.3)')
strrmse = 'RMSE=' + string(rmse,format = '(f5.3)')
t3 = text(3.15,4.8,strmae,target = p3 ,/data)
t3 = text(3.15,4.6,strrmse,target = p3 ,/data)
p3为axes对象,此时坐标系仍为归一化的坐标,所以x从0.57开始
/current和/overplot必须使用,/current表示在当前的axes即p3绘图,/overplot表示继续绘制,否则会清空原来的图(联想MATLAB绘图这样想的,应该是酱把)。
MAE是平均绝对误差MAE(mean absolute error)是绝对误差的平均值,它其实是更一般形式的误差平均值。
M
A
E
=
∑
i
=
1
n
∣
y
i
−
y
∣
n
MAE=\dfrac{\sum \limits_{i=1}^n |y_i-y|}{n}
MAE=ni=1∑n∣yi−y∣
所以上面的mean函数取平均值,由于
y
y
y 和
y
f
i
t
t
e
d
y_{fitted}
yfitted 都是矩阵,所以求减法之后返回值仍为矩阵,求平均值直接返回整个矩阵平矩值。
而均方根误差 RMSE(root mean squared error),也有资料称为RMSD,也可以测量误差的平均大小,它是预测值和实际观测之间平方差异平均值的平方根。
R
M
S
E
=
∑
i
=
1
T
(
y
^
−
y
)
2
T
RMSE= \dfrac{\sum \limits_{i=1}^T (\hat{y}-y)^2}{T}
RMSE=Ti=1∑T(y^−y)2
写表达式的时候可能容易错,仔细写表达式即可,最后与之前一样标注即可
结果
IDL里显示应该是没问题的,CSDN插图有点问题,鸽了鸽了,跑步去。
MAE、RMSE参考博客:
链接: https://blog.csdn.net/nanhuaibeian/article/details/102746602.