首先简要介绍一下最小二乘法
在我们研究两个变量(x,y)之间的相互关系时,通常可以得到一系列成对的数据(x1,y1.x2,y2… xm,ym);将这些数据描绘在x -y直角坐标系中,若发现这些点在一条直线附近,可以令这条直线方程如y=a0+a1x(式1-1)
现在我们随便给三个点(1,2),(2,2),(3,1),先看一下散点图
x<-c(1,2,3)
y<-c(2,2,1)
#求相关性
Correlation(x,y)
[1]0.9942198
#相关性算法
#Correlation<- function(x,y) {
# len<-length(x)
# if( len != length(y))
# stop("length not equal!")
# x2 <- unlist(lapply(x,function(a) return(a^2)))
# y2 <- unlist(lapply(y,function(a) return(a^2)))
# xy <- x*y
# a <- sum(xy)*len - sum(x)*sum(y)
# b <- sqrt(sum(x2)*len - sum(x)^2)*sqrt(sum(y2)*len - sum(y)^2)
# if( b == 0)
# stop("data is incorrect!")
# return(a/b)
#}
plot(x,y,col="blue",main="最小二乘法曲线拟合",xlab="自变量",xlim=c(0,4))
然后介绍拟合算法,原则是
为建立这直线方程就要确定a0和a1,应用《最小二乘法原理》,将实测值Yi与利用计算值Yj(Yj=a0+a1Xi)(式1-1)的离差(Yi-Yj)的平方和 最小为“优化判据”。
令:φ = (式1-2)
把(式1-1)代入(式1-2)中得:
φ = (式1-3)
当 最小时,可用函数 φ 对a0、a1求偏导数,令这两个偏导数等于零。
∑2(a0 + a1*Xi - Yi)=0(式1-4)
∑2Xi(a0 +a1*Xi - Yi)=0(式1-5)
然后求解出a0,a1,就得到了曲线。
model<-lm(y~x)
model
Call:
lm(formula = y ~ x)
Coefficients:
(Intercept) x
2.667 -0.500
上面的Coefficients的意思就是y=2.667-0.500x,这与我手动算得的
y=8/3-1/2x一致。
ablink(model)