最小二乘法的应用.docx
《最小二乘法的应用.docx》由会员分享,可在线阅读,更多相关《最小二乘法的应用.docx(22页珍藏版)》请在冰豆网上搜索。
最小二乘法的应用
最小二乘法的应用
精仪学院吕晓明1011202024
一、应用背景
在智能交通卡口算法中,精确的车辆宽度统计对车辆信息采集有着极其重要的意义。
根据近大远小的成像原理,可以得知车牌在纵向上距离与车牌的大小成线性关系,而车牌的大小与车辆的大小是一个固定的比值K,因此我们可以通过测定车牌在图片的不同的纵向位置的实际大小或宽度,来达到此位置车辆宽度的估计。
一种方法是采用人工在图片中标定的方法来实现,人工标定主观性较强,随意性较大且不精确,往往会对结果造成很大的误差。
另一种是采用一种适当的数值分析方法,由于纵向位置与车牌大小成线性关系,所以可以根据样本空间中的多组数据,找出一条最佳的拟合曲线来进行估计。
这种方法可靠性强,也有利于进行误差分析。
这里我们采用第二种方法-最小二乘法。
最小二乘法(又称最小平方法)是一种数学优化技术。
它通过最小化误差的平方和寻找数据的最佳函数匹配。
利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。
在项目中,由于算法已经实现了车牌的定位,所以根据最小二乘法得到的线性方程可以通过车牌的宽度,按比例去计算出车辆的宽度。
图1通过车牌宽度预估的车辆宽度效果图(白天)
图2通过车牌宽度定位的车辆宽度效果图(晚上)
二、算法描述
最小二乘法是通过一组观测实验数据
来确定
与
的关系
,即在
,使
,式中,
为点
处的权函数,上述最佳平方逼近曲线拟合方法称为最小二乘法,而S(x)即为所要找的函数关系。
曲线拟合中最基本和最常用的是直线拟合。
设x和y之间的函数关系由直线方程
y=a0+a1x
(1)
给出。
式中有两个待定参数,a0代表截距,a1代表斜率。
对于等精度测量所得到的N组数据(xi,yi),i=1,2……,N,xi值被认为是准确的,所有的误差只联系着yi。
下面利用最小二乘法把观测数据拟合为直线。
1.直线参数的估计
前面指出,用最小二乘法估计参数时,要求观测值yi的偏差的加权平方和为最小。
对于等精度观测值的直线拟合来说,由式(0-0-3)可使
(2)
最小即对参数a(代表a0,a1)最佳估计,要求观测值yi的偏差的平方和为最小。
根据式(0-0-8)的要求,应有
整理后得到正规方程组
解正规方程组便可求得直线参数a0和a1的最佳估计值
和
。
即
(3)
(4)
2.拟合结果的偏差
由于直线参数的估计值
和
是根据有误差的观测数据点计算出来的,它们不可避免地存在着偏差。
同时,各个观测数据点不是都准确地落地拟合线上面的,观测值yi与对应于拟合直线上的
这之间也就有偏差。
首先讨论测量值yi的标准差S。
考虑式(0-0-6),因等精度测量值yi所有的
都相同,可用yi的标准偏差S来估计,故该式在等精度测量值的直线拟合中应表示为
(5)
已知测量值服从正态分布时,
服从自由度v=N-2的x2分布,其期望值
由此可得yi的标准偏差
(6)
3.相关系数及其显著性检验
当我们把观测数据点(xi,yi)作直线拟合时,还不大了解x与y之间线性关系的密切程度。
为此要用相关系数ρ(x,y)来判断。
其定义已由式(0-0-12)给出,现改写为另一种形式,并改用r表示相关系数,得
(7)
式中
和
分别为x和y的算术平均值。
r值范围介于-1与+1之间,即-1≤r≤1。
当r>0时直线的斜率为正,称正相关;当r<0时直线的斜率为负,称负相关。
当|r|=1时全部数据点(xi,yi)都落在拟合直线上。
若r=0则x与y之间完全不相关。
r值愈接近±1则它们之间的线性关系愈密切。
三、算法实现
实际采集得到的数据中,如下图所示,并不是所有车牌都能定位准确,所以会出现干扰数据,在处理过程中,我们采用首先通过一次线性最小二乘法得到初始值,通过通过迭代方法去除干扰数据,减少误差。
其中车牌宽度和纵坐标的关系为Y=aX+b,Y方向为车牌在纵向的坐标,实际数据中左上角为(0,0).X为在不同位置的车牌宽度。
通过使用最小二乘法,可以得到线性系数a,b。
这样对任意位置Y,都可以得出X的值。
图1车牌定位效果图
图2车牌误定位效果图一
图2车牌误定位效果图二
满足要求
不满足要求
图4算法流程图
算法具体如下:
1.首先进行的是数据提取操作,将文本文件中有用的数字数据提取出来,生成样本,便于进行算法处理。
以下是数据提取的代码:
%%第一部分(处理数据)
clear;
clc;
fid=fopen('e:
\车牌宽度序列.txt','r');
fidout=fopen('e:
\处理过的数据.txt','w');
n=1;
num=0;
while(~feof(fid))%重组数据
tline=fgets(fid);
num=num+1;
disp(tline);
if(tline
(1)==''&&tline
(2)=='i'&&length(tline)>25)%判断数据特征
fprintf(fidout,'%s',tline);
end
end
fclose(fid);
fclose(fidout);
2.将生成的样本中的数据转换成数组数据,其中Matrix是生成的矩阵,第一列是表示第几辆车,第二列表示是第几个车道,三、四、五、六列分别表示的是车牌的左坐标,上坐标,右坐标,下坐标。
%%第二部分(最小二乘法处理)
clear;
clc;
fid=fopen('e:
\处理过的数据.txt','r');
while(~feof(fid))%重组数据
Matrix=fscanf(fid,'id(%d),index(%d),LocRect(%d,%d,%d,%d)',[6inf]);
Matrix=Matrix';
end
num=size(Matrix,1);
3.假设车牌的纵向位置为Y方向,车牌的宽度为X的值,每个车牌的纵向位置用车牌中心的一个点来表示,计算出每个车牌的纵向位置与车牌宽度坐标对carYAxis,carWidth。
%计算车纵坐标与车牌宽度
fori=1:
num
carYAxis(i)=Matrix(i,4)+(Matrix(i,6)-Matrix(i,4))/2;
carWidth(i)=Matrix(i,5)-Matrix(i,3)+1;
End
4.使用最小二乘法对每一对carYAxis,carWidth进行拟合,根据成像原理,我们可以得知纵向位置与车牌宽度是是线性关系。
所以我们这里使用的是线性拟合,即令polyfit中第三个参数为1。
ite=3;%迭代次数
fig=1;
while(ite>0)
[p,s]=polyfit(carWidth,carYAxis,1);%p=[a,b]
a=p
(1);
b=p
(2);
x=linspace(70,125,20);
y=polyval(p,x);%y=ax+b
figure(fig);
plot(carWidth,carYAxis,'.',x,y);
title('拟合图像');
xlabel('车牌的宽度');
ylabel('车的纵向距离');
5.由于样本集中有错误的车牌定位数据,这将导致拟合结果出现偏差,如图4所示,为一次拟合的结果,我们可以看出,周围偏离较远的点即为错误的样本点,很明显,拟合出来的直线不是所需要的理想直线。
所以这里我们需要使用一种方法来将错误的点进行去除。
由于错误的样本点为少数且多数偏离拟合直线较远,所以我们可以在一次拟合之后,令每一个坐标点向拟合直线做垂线,然后将垂线的距离进行排列,将垂线距离最远的样本数据集个数10%的点定义为错误样本点且去除,然后迭代重新拟合,经过两次拟合之后的结果可以达到理想的结果,如图4图5所示,图4是去除一次的效果,图五是去除两次的效果。
if(ite==1)
break;
end
fori=1:
num
d(i)=abs((a*carWidth(i)-carYAxis(i)+b)/(a^2+1)^(1/2));
end
[d,i]=sort(d);%排序
num=fix(num*0.9);%取前90%的的值作为有效值
forn=1:
num
tempX(n)=carWidth(i(n));
tempY(n)=carYAxis(i(n));
end
d=[];
i=[];
carWidth=[];%清空数组
carYAxis=[];
forn=1:
num%重塑数组
carWidth(n)=tempX(n);
carYAxis(n)=tempY(n);
end
tempX=[];
tempY=[];
ite=ite-1;
fig=fig+1;
End、
6.拟合的效果通常采用标准误差与相关指数的方法来衡量。
经过三次迭代我们共选取257个有效点,根据公式可以计算出系数a=-14.408786,b=1681.913427y上标准误差Sigma=19.120959相关指数RR=-0.992802
%拟合效果和精度检验
yh=polyval(p,carWidth);
Q=sum((carYAxis-yh).^2);
SGM=sqrt(Q/(n-2));
%RR=sum((yh-mean(carYAxis)).^2)/sum((carYAxis-mean(carYAxis)).^2);
top=sum((carWidth-mean(carWidth)).*(carYAxis-mean(carYAxis)));
bottom=(sum((carWidth-mean(carWidth)).^2)*sum((carYAxis-mean(carYAxis)).^2))^(1/2);
RR=top/bottom;%相关系数
fprintf(1,'计算得到的系数a=%3.6f,b=%3.6f\n',p
(1),p
(2))
fprintf('\n')
fprintf(1,'y上标准误差Sigma=%3.6f\n',SGM)
fprintf('\n')
fprintf(1,'相关指数RR=%3.6f\n',RR)
fprintf('\n')
disp(p);
fclose(fid);
图4.一次拟合图像
图5.二次拟合图像
图6.三次拟合图像
附件:
测试数据
说明:
示例:
id(0),index
(1),LocRect(1330,485,1413,511)
这个数据中,id表示第几辆车,index表示第几个车道,LocRect中分别是车牌的(左坐标,上坐标,右坐标,下坐标)
通过这个数据,
X=l32right-l32left+1=1413–1330+1(宽度);
Y=l32top+(l32bottom-l32top)/2=485+(511-485)/2(纵向坐标)
id
(1),index(0),LocRect(686,573,808,599)
id
(1),index(0),LocRect(671,545,796,571)
id
(1),index(0),LocRect(667,515,743,541)
id
(1),index(0),LocRect(651,485,727,511)
id
(1),index(0),LocRect(622,453,756,481)
id
(1),index(0),LocRect(612,421,698,447)
id
(1),index(0),LocRect(593,385,681,413)
id
(1),index(0),LocRect(573,347,662,375)
id
(1),index(0),LocRect(551,307,644,335)
id
(2),index(0),LocRect(531,263,624,293)
id
(1),index(0),LocRect(503,219,603,249)
id
(1),index(0),LocRect(471,171,585,199)
id
(1),index(0),LocRect(453,119,555,149)
id
(1),index(0),LocRect(424,63,529,93)
id
(1),index(0),LocRect(388,3,500,35)
id
(2),index
(1),LocRect(1555,577,1630,601)
id
(2),index
(1),LocRect(1560,569,1635,593)
id
(2),index
(1),LocRect(1564,561,1641,585)
id
(2),index
(1),LocRect(1569,551,1644,577)
id
(2),index
(1),LocRect(1574,543,1651,569)
id
(2),index
(1),LocRect(1580,535,1658,561)
id
(2),index
(1),LocRect(1585,527,1662,553)
id
(2),index
(1),LocRect(1592,519,1669,545)
id
(2),index
(1),LocRect(1598,511,1676,537)
id
(2),index
(1),LocRect(1605,503,1686,527)
id
(2),index
(1),LocRect(1611,493,1693,519)
id
(2),index
(1),LocRect(1619,485,1701,511)
id(3),index(0),LocRect(909,569,1000,593)
id(3),index(0),LocRect(904,531,984,555)
id(3),index(0),LocRect(892,491,973,515)
id(3),index(0),LocRect(878,447,962,473)
id(3),index(0),LocRect(864,403,950,429)
id(3),index(0),LocRect(847,355,938,381)
id(3),index(0),LocRect(831,303,925,331)
id(3),index(0),LocRect(812,247,911,275)
id(3),index(0),LocRect(794,185,895,215)
id(3),index(0),LocRect(773,119,879,149)
id(3),index(0),LocRect(752,45,862,77)
id(4),index
(1),LocRect(923,523,1001,549)
id(4),index
(1),LocRect(908,475,988,501)
id(4),index
(1),LocRect(891,425,978,451)
id(4),index
(1),LocRect(857,311,949,339)
id(4),index
(1),LocRect(837,245,934,275)
id(5),index
(1),LocRect(815,175,917,205)
id(4),index
(1),LocRect(791,97,898,129)
id(4),index
(1),LocRect(764,11,877,43)
id(5),index(0),LocRect(735,579,827,603)
id(5),index(0),LocRect(733,537,810,563)
id(5),index(0),LocRect(717,493,800,519)
id(5),index(0),LocRect(703,443,789,471)
id(5),index(0),LocRect(688,393,777,419)
id(5),index(0),LocRect(672,337,764,365)
id(5),index(0),LocRect(653,277,751,305)
id(6),index(0),LocRect(636,211,734,241)
id(5),index(0),LocRect(611,141,717,171)
id(5),index(0),LocRect(591,63,696,93)
id(6),index
(1),LocRect(1118,573,1195,597)
id(6),index
(1),LocRect(1115,529,1192,557)
id(6),index
(1),LocRect(1106,483,1188,511)
id(6),index
(1),LocRect(1098,435,1184,461)
id(6),index
(1),LocRect(1091,381,1180,409)
id(6),index
(1),LocRect(1082,325,1176,353)
id(6),index
(1),LocRect(1073,263,1171,293)
id(7),index
(1),LocRect(1062,195,1165,227)
id(6),index
(1),LocRect(1051,121,1159,153)
id(6),index
(1),LocRect(1039,39,1152,73)
id(7),index
(1),LocRect(1104,349,1193,375)
id(7),index
(1),LocRect(1094,289,1189,317)
id(7),index
(1),LocRect(1076,157,1173,187)
id(7),index
(1),LocRect(1057,79,1167,111)
id(8),index(0),LocRect(633,601,720,625)
id(8),index(0),LocRect(619,563,695,587)
id(8),index(0),LocRect(596,525,676,549)
id(8),index(0),LocRect(573,483,655,507)
id(8),index(0),LocRect(547,439,632,465)
id(8),index(0),LocRect(519,391,607,417)
id(8),index(0),LocRect(490,339,580,367)
id(8),index(0),LocRect(456,283,552,311)
id(9),index(0),LocRect(421,221,520,251)
id(8),index(0),LocRect(382,157,486,185)
id(8),index(0),LocRect(339,83,448,115)
id(8),index(0),LocRect(293,3,407,35)
id(9),index
(1),LocRect(1057,559,1150,585)
id(9),index
(1),LocRect(1058,523,1138,547)
id(9),index
(1),LocRect(1051,481,1132,507)
id(9),index
(1),LocRect(1043,437,1126,463)
id(9),index
(1),LocRect(1033,391,1121,419)
id(9),index
(1),LocRect(1023,341,1115,369)
id(9),index
(1),LocRect(1013,289,1107,317)
id(10),index
(1),LocRect(1002,233,1100,263)
id(9),index
(1),LocRect(990,173,1092,203)
id(9),index
(1),LocRect(976,107,1084,139)
id(9),index
(1),LocRect(963,37,1075,69)
id(10),index
(1),LocRect(1109,583,1185,607)
id(10),index
(1),LocRect(1104,545,1182,569)
id(10),index
(1),LocRect(1097,503,1178,529)
id(10),index
(1),LocRect(1089,461,1173,487)
id(10),index
(1),LocRect(1082,415,1168,441)
id(10),index
(1),LocRect(1072,367,1163,393)
id(10),index
(1),LocRect(1063,315,1157,343)
id(11),index
(1),LocRect(1051,415,1131,437)
id(10),index
(1),LocRect(1053,259,1149,287)
id(11),index
(1),LocRect(1041,363,1124,387)
id(12),index
(1),LocRect(1041,199,1142,227)
id(10),index
(1),LocRect(1028,133,1134,163)
id(10),index
(1),LocRect(1014,59,1126,91)
id(12),index
(1),LocRect(1274,585,1360,605)
id(12),index
(1),LocRect(1252,551,1359,573)
id(12),index
(1),LocRect(1249,515,1360,537)
id(12),index
(1),LocRect(1248,475,1361,499)
id(12),index
(1),LocRect(1245,433,1362,457)
id(12),index
(1),LocRect(1261,389,1339,413)
id(13),index
(1),LocRect(1111,335,1201,363)
id(12),index
(1),LocRect(1256,343,1364,367)
id(12),index
(1),LocRect(1257,295,1365,319)
id(14),index
(1),LocRect(1095,231,1194,263)
id(14),index
(1),LocRect(1254,243,1341,267)
id(12),index
(1),LocRect(1253,189,1370,213)
id(12),index
(1),LocRect(1250,131,1372,155)
id(13),index
(1),LocRect(1067,55,1176,89)
id(12),index
(1),LocRect(1249,67,1373,93)
id(14),index(0),Lo