社区
数据结构与算法
帖子详情
随机散列的N个点,求一条直线,所有点到直线的距离之和最小。请教此算法的思路!
tanggula
2008-03-03 12:23:01
如题,请达人指点,或者大家一起讨论下!
...全文
1975
28
打赏
收藏
随机散列的N个点,求一条直线,所有点到直线的距离之和最小。请教此算法的思路!
如题,请达人指点,或者大家一起讨论下!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
28 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
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
打赏
举报
回复
比较牛,收藏了。
大王派我去巡山
2008-03-04
打赏
举报
回复
是旋转那条经过坐标原点的直线
=============================
谁说这条直线一定经过坐标原点?
tanggula
2008-03-04
打赏
举报
回复
是旋转那条经过坐标原点的直线
tanggula
2008-03-04
打赏
举报
回复
我也觉得,在可以容忍的精度下,去旋转坐标,然后把所有可能都计算出来,找出合适的。
这样算法简单,不需要去考虑公式,而且在精度合适的情况下,计算量也是有限的。
qiu5208
2008-03-04
打赏
举报
回复
旋转坐标,
在不同的坐标位置,进行线性回归即可。
tanggula
2008-03-04
打赏
举报
回复
我对这些数学公式已经很陌生了,要补习下才能去写代码。
呵呵,再贪心一把,
请有兴趣的朋友按diyme贴出的理论用c或者c++把此算法实现一下。
大王派我去巡山
2008-03-04
打赏
举报
回复
呵呵,可以贴图,那就来个完整的:
tanggula
2008-03-04
打赏
举报
回复
感谢dlyme找到的这篇论文,
上面的理论(如果正确的话 ,目前还不能理解)应该是解决问题的比较好的方法。
必经过已知点中的两点,感性的去想像,有点想不通,呵呵!
大王派我去巡山
2008-03-04
打赏
举报
回复
"全最小一乘法",看到了这样奇怪的名称。
CSDN的blog里找不到图片链接地址了,贴图试一下,不行大家只好自己去连接地址看了。
tanggula
2008-03-04
打赏
举报
回复
恩,dlyme怀疑的对。
忽略了一个因素,虽然可以经过一点,但是那个点也是未知的,这个判断也就没有价值了。
本意是把经过的那个点作为坐标原点,其它做坐标转换,希望能够简化问题。
qiu5208写的很详细,试试看能否走的通。
大王派我去巡山
2008-03-04
打赏
举报
回复
上面的朋友说的和前面提到的最小二乘法一样,求出来的结果是
距离的平方和
最小,而精益求精的楼主要的是
距离和
最小:)
看到一篇论文是专门针对这个问题的。前面的讨论中已经说到了“过其中某个已知点一定能找到满足要求的直线”,论文中进一步证明了“这样的直线还会经过另一个已知点”(关于这个问题的证明感觉作者描述得很乱,但应该还是能看出头绪的)。因而最终的算法就成了遍历所有已知点中两点连成的直线,距离和最小的那个同时也就是满足要求的直线。
由于用到了大量的数学公式,所以只能贴图了。大家看这里的链接:
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的范围。
大王派我去巡山
2008-03-04
打赏
举报
回复
楼主上面说的都是经过其中的某个/些已知点一定能找到满足要求的直线,那和坐标原点有什么关系?
JiangHongTao
2008-03-04
打赏
举报
回复
有两条可以证明:
1,那条直线两侧的点数是相同的
原因:那条直线向点数多的那一侧平行移动,点到直线的距离之和是在递减,直到直线两侧的点数相同时。
2,那条直线两侧的点数相同时,与直线平行移动它时,总距离不变,直到与一个点相交。
原因不用解释了。
所以一定存在一条必过一点的符合条件的直线。
----------------------------------------------------------------------------
应该是线两侧的点之差等于线上的点。
tanggula
2008-03-04
打赏
举报
回复
有两条可以证明:
1,那条直线两侧的点数是相同的
原因:那条直线向点数多的那一侧平行移动,点到直线的距离之和是在递减,直到直线两侧的点数相同时。
2,那条直线两侧的点数相同时,与直线平行移动它时,总距离不变,直到与一个点相交。
原因不用解释了。
所以一定存在一条必过一点的符合条件的直线。
tanggula
2008-03-03
打赏
举报
回复
有人给了点提示:
把所有点都包含在内,再以这个圆的圆心为原点,做直线,旋转,利用枚举,最后找到线
大王派我去巡山
2008-03-03
打赏
举报
回复
的确,最小二乘法计算的是方差,出来的是距离的平方和最小,并不是直接的距离之和,但处理起来要方便得多。
我猜楼主也只是为了找到一条直线,在某种度量方式下与各点最接近,一定要是距离和吗?
tanggula
2008-03-03
打赏
举报
回复
ZFelix的提议不错,
但直线平移过程中总距离不变,应该有一个前提是直线两侧的点数相同,也就是说总共应该是偶数个点。
不过不必是绝对精确的,可以忽略这个因素。
之后的分段讨论,确定符号,求导数。。。可以再详细解释一下吗?
加载更多回复(8)
2D圆形
随机
分布
如何画出又快又多的圈圈。命题一个游戏:在一个平面、一定时间内消灭一定的目标。要实现这个游戏,我们首先要确定,这些元素使用什么形状判定有效点击范围。因为按照图示形状又复杂又没必要,选择一个近似的规则几何图形即可。在这里,我们使用圆形作为目标的形状。假设世界观是圆形互不重叠。那么会有一下两种可能性:目标大小是否相同;目标是否静止。复杂度依次递增。本文主要针对目标大小相同、目标静止的情况进行探讨,并会附...
Redis
可以存储3种类型的值SETMSETSETEXGETMGETTTLSET key value:新建或覆盖,返回OKGET key:获取key对应valueMSET key1 value1 key2 value2 ...:批量新建或覆盖,返回OKMSET key1 key2 ...:批量获取key对应value,不存在返回nilSETEX key seconds value:设置自动失效的键值对,新建或覆盖,返回OK。
Linux
多线程、shell语句、网络编程、mysql数据库、git远程仓库以及redis数据库与缓存的总结性学习
软考——架构师笔记
该文章可作为系统架构设计师考试的参考笔记。
高校技术转移办公室人员如何提升成果转化效率?.docx
高校技术转移办公室人员如何提升成果转化效率?
数据结构与算法
33,025
社区成员
35,335
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章