社区
数据结构与算法
帖子详情
随机散列的N个点,求一条直线,所有点到直线的距离之和最小。请教此算法的思路!
tanggula
2008-03-03 12:23:01
如题,请达人指点,或者大家一起讨论下!
...全文
1802
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)
秒懂---LDA
算法
线性判别分析LDA原理总结 在主成分分析(PCA)原理总结中,我们对降维
算法
PCA做了总结。这里我们就对另外一种经典的降维方法线性判别分析(Linear Discriminant Analysis, 以下简称LDA)做一个总结。LDA在模式识别领域(比如人脸识别,舰艇识别等图形图像识别领域)中有非常广泛的应用,因此我们有必要了解下它的
算法
原理。 在学习LDA之前
C/C++笔试题(很多)
微软亚洲技术中心的面试题!!! 1.进程和线程的差别。 线程是指进程内的一个执行单元,也是进程内的可调度实体. 与进程的区别: (1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位 (2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行 (3)拥有资源:进程是拥有资源的独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源. (4)系
高负载高并发网站架构分析
由于自己正在做一个高性能大用户量的论坛程序,对高性能高并发服务器架构比较感兴趣,于是在网上收集了不少这方面的资料和大家分享。希望能和大家交流 msn: defender_ios@hotmail.com ——————————————————————————————————————— 初创网站与开源软件 6 谈谈大型高负载网站服务器的优化心得! 8 Lighttpd+S
面试文档(自用)
ccc
[转]高负载并发网站架构分析
由于自己正在做一个高性能大用户量的论坛程序,对高性能高并发服务器架构比较感兴趣,于是在网上收集了不少这方面的资料和大家分享。希望能和大家交流 msn: defender_ios@hotmail.com ——————————————————————————————————————— ? 初创网站与开源软件 6 ? 谈谈大型高负载网站服务器的优化心得! 8 ? Lighttpd+Squid+Apach
数据结构与算法
33,025
社区成员
35,334
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章