数据拟合直线

npuhuxl 2009-12-26 12:33:18
有一组数据要拟合一条直线

定义一个新距离函数
h(d)=d*d/2 d<=C
h(d)=C*(c-d/2) d>C
其中d是数据点与直线的距离(欧式距离),C是常数
d(x,y)=abs(a*x+b*y+c)/sqrt(a*a+b*b);
求直线a*x+b*y+c=0;使得sum(d)最小
应该用什么方法?
...全文
173 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
yymt168 2009-12-30
  • 打赏
  • 举报
回复
1 把方程改写成 y=kx+d形式
2 写出sum(d)的公式(此时可以根据数据进行分段处理),然后sum(d)分别对k,b进行求导并令其分别等于0
联立两个方程,可以解出两个未知数,k,d
3 把k,d转换成a,b,c即可
4 总结:此问题只是最小二乘问题的灵活运用..
绿色夹克衫 2009-12-28
  • 打赏
  • 举报
回复
迭代的方法恐怕有些问题,因为有3个数不确定,迭代的复杂度太高了,
另外不知道会不会出现局部极点的情况,另外如果点散的比较远,以1000划分,恐怕精度也有些问题。

如果是迭代,建议迭代角度和C,做2重迭代,第一重是角度,然后对该线在一定范围内做平移,找出最小值,
这部分,开始的精度可以不那么准,迭代出一定范围之后,在这个范围内用更高的精度再次迭代,
直到达到很高的精度。此方法同样适用于角度的迭代。

[Quote=引用 8 楼 npuhuxl 的回复:]
楼上的意思是不是通过迭代直到sum(h(d))最小(或大致不再变化),求出参数的解?
想法非常好!谢谢你!

同时希望还有人提出其他方法!
[/Quote]
npuhuxl 2009-12-28
  • 打赏
  • 举报
回复
楼上的意思是不是通过迭代直到sum(h(d))最小(或大致不再变化),求出参数的解?
想法非常好!谢谢你!

同时希望还有人提出其他方法!
donkey301 2009-12-28
  • 打赏
  • 举报
回复
(1)我觉得距离是什么形式没有关系,sum(h(d))必然是一个关于a,b,c的函数
f(a,b,c)
那么想要f(a,b,c)最小,只需要让f对a,b,c分别求偏导数等于零就行了,这样就得到三个方程组成的非线性方程组,含有三个未知数,用matlab或者自己写程序迭代求解。
(2)难的是求导数会遇到两个分段函数h(d)和abs(a*x+b*y+c),无法确定参数属于哪段,所以最好有一种方法可以预估d和a*x+b*y+c的范围。可以先用最小二乘法求出a0,b0,c0的值
(3)可以求出d和a0*x+b0*y+c0的范围,从而知道两个分段函数h(d)和abs(a*x+b*y+c)应该取哪段,用(1)的方法求出a,b,c.然后作一个验证,看看d和a*x+b*y+c的范围是不是和你一开始估计的一样。
<1>如果一样,就停止,取a,b,c
<2>如果不一样,那么用a,b,c作为a0,b0,c0重复(3)。我猜测总有一次判断成<1>的。

得到的不一定是最优解,但应该差不多,因为最小二乘法的判据和sum(h(d))都是随d的增加而增加的。
p.s.,实际上没必要三个参数的,直接设a=1好了。


还有一种比较暴力的方法,先用最小二乘法求出a,b,c,最优解应该在这个值的附近,譬如你可以假设不超过10%的范围内,那么把[a-a/10,a+a/10]分成1000等分,[b-b/10,b+b/10]分成1000等分,[c-c/10,c+c/10]分成1000等分,遍历1000*1000*1000个(a,b,c)的组合,求出sum(h(d))的最小值对应的a,b,c
npuhuxl 2009-12-27
  • 打赏
  • 举报
回复
就是要让所有数据点的h和最小!
sum(h(d))最小
bigc2000 2009-12-27
  • 打赏
  • 举报
回复
楼上的,楼上的楼上,都不对,

最小方差,不是距离之和 最小,是距离平方和最小,这两个不是同一概念

h(d)是啥?哪里用到?
cudars 2009-12-27
  • 打赏
  • 举报
回复
用最小二乘法应该可以。
rapo 2009-12-27
  • 打赏
  • 举报
回复
Least Square method should do the trick for you
绿色夹克衫 2009-12-26
  • 打赏
  • 举报
回复
d=2C时,h(d) = 0?
npuhuxl 2009-12-26
  • 打赏
  • 举报
回复
不好意思写错了,应该是:

h(d)=d*d/2 d <=C
h(d)=C*(d-C/2) d>C

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧