社区
数据结构与算法
帖子详情
随机散列的N个点,求一条直线,所有点到直线的距离之和最小。请教此算法的思路!
tanggula
2008-03-03 12:23:01
如题,请达人指点,或者大家一起讨论下!
...全文
1849
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)
JAVA近百种
算法
大全
最近找到的JAVA近百种
算法
大全 分享一下 java
算法
大全,有近100多种常见
算法
的源代码,是学习JAVA
算法
的难得资料,需要的童鞋来下载吧!
计算经纬度
距离
,点到
直线
的
距离
,点到点的
距离
计算经纬度
距离
,点到
直线
的
距离
,点到点的
距离
一、计算经纬度
距离
1.1 Java1.2 scala1.3 scala计算两个Gps点之间的
距离
二、经纬度和
距离
之间的计算2.1 角度计算 一、计算经纬度
距离
根据坐标点经纬度计算两点间
距离
。(单位:km) 1.1 Java public static void main(String[] args) { System.out.println(g...
最小
生成树构造
算法
--Prim
算法
,Kruskal
算法
(C语言)
最小
生成树
最小
生成树(minimum spanning tree)是由n个顶点,n-1条边,将一个连通图连接起来,且使权值
最小
的结构。
最小
生成树可以用Prim(普里姆)
算法
或kruskal(克鲁斯卡尔)
算法
求
出。 我们将以下面的带权连通图为例讲解这两种
算法
的实现: 注:由于测试输入数据较多,程序可以采用文件输入 Prim(普里姆)
算法
时间复杂度:O(N^2)(N为
最大
最小
距离
算法
(K-MEANS K-medoids )聚类
算法
的结合运用
聚类
算法
通常会得到一种分类,将n
个点
聚合成k类,同一聚类(即插槽簇)中的对象相似度较高;而不同类中的对象相似度较小。 聚类
算法
的基本流程如下: (1)从n个节点中选择 k 个节点作为初始聚类中心。(2)将剩余节点根据它们与这k个聚类中心的代价大小,分别将它们分配给与其代价
最小
的(聚类中心所代表的)聚类。(3)更新聚类的聚类中心。不断重复(2)(3)这一过程将剩下其它节点分配完毕。(4)排序,将
算法
——
随机
化
算法
~计算圆周率的近似值
题目: 下面介绍一个用
随机
投点法计算圆周率的近似值的
算法
,利用圆与其外切正方形的面积之比来计算π的近似值。 题解
思路
: 半径为1的圆的1/4是一个扇形,是边长为1的正方形的一部分。k=πrr/4/rr=π/4;可得π=4k。这里用
随机
投点法来计算K的近似值,从而得到π的近似值。在正方形中投掷n
个点
,每
个点
落在正方形中每个位置的机会均等,然后记录有多少点落在正方形内,其中落在扇形内的点的个数m与总数...
数据结构与算法
33,028
社区成员
35,336
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章