随机散列的N个点,求一条直线,所有点到直线的距离之和最小。请教此算法的思路!

tanggula 2008-03-03 12:23:01
如题,请达人指点,或者大家一起讨论下!
...全文
1229 28 打赏 收藏 举报
写回复
28 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
qinhua998 2011-02-22
fz = (5 * (t1 * da1 + t2 * da2 + t3 * da3 + t4 * da4 + t5 * da5) - (t1 + t2 + t3 + t4 + t5) * (da1 + da2 + da3 + da4 + da5));
fm = (5 * (Math.Pow(t1, 2) + Math.Pow(t2, 2) + Math.Pow(t3, 2) + Math.Pow(t4, 2) + Math.Pow(t5, 2)) - Math.Pow((t1 + t2 + t3 + t4 + t5), 2));
b = fz / fm;

fz = ((Math.Pow(t1, 2) + Math.Pow(t2, 2) + Math.Pow(t3, 2) + Math.Pow(t4, 2) + Math.Pow(t5, 2)) * (da1 + da2 + da3 + da4 + da5) -
(t1 + t2 + t3 + t4 + t5) * (t1 * da1 + t2 * da2 + t3 * da3 + t4 * da4 + t5 * da5));
fm = (5 * (Math.Pow(t1, 2) + Math.Pow(t2, 2) + Math.Pow(t3, 2) + Math.Pow(t4, 2) + Math.Pow(t5, 2)) - Math.Pow((t1 + t2 + t3 + t4 + t5), 2));
a = fz / fm;
  • 打赏
  • 举报
回复
qiu5208 2008-03-05
比较牛,收藏了。
  • 打赏
  • 举报
回复
是旋转那条经过坐标原点的直线
=============================

谁说这条直线一定经过坐标原点?
  • 打赏
  • 举报
回复
tanggula 2008-03-04
是旋转那条经过坐标原点的直线
  • 打赏
  • 举报
回复
tanggula 2008-03-04
我也觉得,在可以容忍的精度下,去旋转坐标,然后把所有可能都计算出来,找出合适的。
这样算法简单,不需要去考虑公式,而且在精度合适的情况下,计算量也是有限的。
  • 打赏
  • 举报
回复
qiu5208 2008-03-04
旋转坐标,
在不同的坐标位置,进行线性回归即可。
  • 打赏
  • 举报
回复
tanggula 2008-03-04
我对这些数学公式已经很陌生了,要补习下才能去写代码。

呵呵,再贪心一把,
请有兴趣的朋友按diyme贴出的理论用c或者c++把此算法实现一下。
  • 打赏
  • 举报
回复
呵呵,可以贴图,那就来个完整的:








  • 打赏
  • 举报
回复
tanggula 2008-03-04
感谢dlyme找到的这篇论文,
上面的理论(如果正确的话 ,目前还不能理解)应该是解决问题的比较好的方法。

必经过已知点中的两点,感性的去想像,有点想不通,呵呵!
  • 打赏
  • 举报
回复
"全最小一乘法",看到了这样奇怪的名称。
CSDN的blog里找不到图片链接地址了,贴图试一下,不行大家只好自己去连接地址看了。

  • 打赏
  • 举报
回复
tanggula 2008-03-04
恩,dlyme怀疑的对。
忽略了一个因素,虽然可以经过一点,但是那个点也是未知的,这个判断也就没有价值了。

本意是把经过的那个点作为坐标原点,其它做坐标转换,希望能够简化问题。

qiu5208写的很详细,试试看能否走的通。
  • 打赏
  • 举报
回复
上面的朋友说的和前面提到的最小二乘法一样,求出来的结果是距离的平方和最小,而精益求精的楼主要的是距离和最小:)

看到一篇论文是专门针对这个问题的。前面的讨论中已经说到了“过其中某个已知点一定能找到满足要求的直线”,论文中进一步证明了“这样的直线还会经过另一个已知点”(关于这个问题的证明感觉作者描述得很乱,但应该还是能看出头绪的)。因而最终的算法就成了遍历所有已知点中两点连成的直线,距离和最小的那个同时也就是满足要求的直线。


由于用到了大量的数学公式,所以只能贴图了。大家看这里的链接:
http://blog.csdn.net/dlyme/archive/2008/03/04/2147099.aspx
  • 打赏
  • 举报
回复
qiu5208 2008-03-04
好就没用了,把算法写出来,复习了一边。

写的很乱,如果看不明白的话,就直接用最后的公式即可。


''''''''''''''''''''''''''''''''


1,有n个点他们的坐标是(X1,Y1),(X2,Y2)....(Xi,Yi).

2.设有一条符合条件的直线Ys=ax+b, 现在把各点的Xi值代入x的,就会得到与直线距离为0的点Ys1,Ys2,……Ysi

3.把Y1-Ys1,Y2-Ys2,.....Yi-Ysi,得到各实际点到直线的垂直距离e1,e2,...ei

4,垂直距离e1,e2,...ei因为有正负,相加的话会相互抵消,所以把他们平方(就是传说中的方差),
得出总偏差E=e1^2+e2^2+....+ei^2

5.整理上面几条
E=(Y1-Ys1)^2+.....
E=【Y1-(aX1+b)】^2+......【Yi-(aXi+b)】^2
得到最终公式:
E=∑(Yi-axi-b)^2
6.看上面公式,现在就是求出a,b 为何值是,E最小,
换句话说,直线方程Ys=ax+b的a、b为何值时,所有点到这条直线的总距离最短。

7.轮到导数出场了,高中数学学过,单一个函数的导数函数的值=0时,就是它的极值,
这里是最小值。
以a为自变量对公式求导: dE/da=2∑(Yi-aXi-b)xi
以b为自变量对公式求导:dE/db=-2∑(Yi-aXi-b)
8.令导函数=0
2∑(Yi-aXi-b)xi=0
-2∑(Yi-aXi-b)=0
9.整理上面
(∑Xi^2)a+(∑Xi)b=∑YiXi
(∑Xi)a+nb=∑Yi 'n是点的个数

10.未知量是a,b,解方程。
轮到线性代数出场。用行列式解方程法即可。


解出a,b得:

a=(∑YiXi*n-∑Xi*∑Yi)/(∑Xi^2*n-∑Xi^2)
b=(∑Xi^2*∑Yi-∑YiXi*∑Xi)/(∑Xi^2*n-∑Xi^2)


11,把求得a,b代入Ys=ax+b,就是需要的直线。






  • 打赏
  • 举报
回复
JiangHongTao 2008-03-04
假设存在直线Y=K*X+B
对于每个点(PX,PY)可以在直线Y= K*X+PY-K*PX上。
则必然存在通过原点的直线Y=1/K*X,
使得每个点(PX,PY)可以转换为:
直线Y= K*X+PY-K*PX与Y=1/K*X的交点(NPX,NPY)
并且点(PX,PY)到直线Y=K*X+B与点(NPX,NPY)到直线Y=K*X+B的距离相等。
由于所有的点(NPX,NPY)均在直线Y=1/K*X上,因此可以求出使得距离最短的B,并且距离最短之和为每次计算剩余点中距离最长的点的距离并相加。
这样就能得到公式D=F(K),求K使得D最小。
在根据红色部分求出B的范围。
  • 打赏
  • 举报
回复
楼主上面说的都是经过其中的某个/些已知点一定能找到满足要求的直线,那和坐标原点有什么关系?
  • 打赏
  • 举报
回复
JiangHongTao 2008-03-04
有两条可以证明:
1,那条直线两侧的点数是相同的
原因:那条直线向点数多的那一侧平行移动,点到直线的距离之和是在递减,直到直线两侧的点数相同时。
2,那条直线两侧的点数相同时,与直线平行移动它时,总距离不变,直到与一个点相交。
原因不用解释了。

所以一定存在一条必过一点的符合条件的直线。
----------------------------------------------------------------------------
应该是线两侧的点之差等于线上的点。
  • 打赏
  • 举报
回复
tanggula 2008-03-04
有两条可以证明:
1,那条直线两侧的点数是相同的
原因:那条直线向点数多的那一侧平行移动,点到直线的距离之和是在递减,直到直线两侧的点数相同时。
2,那条直线两侧的点数相同时,与直线平行移动它时,总距离不变,直到与一个点相交。
原因不用解释了。

所以一定存在一条必过一点的符合条件的直线。
  • 打赏
  • 举报
回复
tanggula 2008-03-03
有人给了点提示:
把所有点都包含在内,再以这个圆的圆心为原点,做直线,旋转,利用枚举,最后找到线
  • 打赏
  • 举报
回复
的确,最小二乘法计算的是方差,出来的是距离的平方和最小,并不是直接的距离之和,但处理起来要方便得多。

我猜楼主也只是为了找到一条直线,在某种度量方式下与各点最接近,一定要是距离和吗?
  • 打赏
  • 举报
回复
tanggula 2008-03-03
ZFelix的提议不错,
但直线平移过程中总距离不变,应该有一个前提是直线两侧的点数相同,也就是说总共应该是偶数个点。
不过不必是绝对精确的,可以忽略这个因素。

之后的分段讨论,确定符号,求导数。。。可以再详细解释一下吗?
  • 打赏
  • 举报
回复
加载更多回复
相关推荐
发帖
数据结构与算法
加入

3.2w+

社区成员

数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
申请成为版主
帖子事件
创建了帖子
2008-03-03 12:23
社区公告
暂无公告