社区
数据结构与算法
帖子详情
随机散列的N个点,求一条直线,所有点到直线的距离之和最小。请教此算法的思路!
tanggula
2008-03-03 12:23:01
如题,请达人指点,或者大家一起讨论下!
...全文
1832
28
打赏
收藏
随机散列的N个点,求一条直线,所有点到直线的距离之和最小。请教此算法的思路!
如题,请达人指点,或者大家一起讨论下!
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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)
算法
学习之
散列
算法
Hash,一般翻译做
散列
、杂凑,或音译为哈希,是把任意长度的输入(又叫做预映射pre-image)通过
散列
算法
变换成固定长度的输出,该输出就是
散列
值。这种转换是一种压缩映射,也就是,
散列
值的空间通常远小于输入的空间,不同的输入可能会
散列
成相同的输出,所以不可能从
散列
值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。(摘自百度百科) ...
给定数轴上n
个点
,找出其中一
个点
使其到其他各
个点
距离
之和
最小
。
答案:最优解是这些数的中位数。 证明: 假设数轴上有7
个点
,取一点A使其右边为4
个点
,左边为3
个点
。A左移
距离
d,则对于右边4
个点
,
距离
共减少4d,左边增加3d,总体
距离
之和
减少了1d。 同理取点B使右边3
个点
,左边4
个点
,向左移动,也可得到
距离
减少。 因此,若该点两边输入点数量不一样,就不是最优解。 当点个数为奇数,最优解是中位数。 当点个数为偶
分治
算法
解决最短
距离
问题
分治
算法
解决最短
距离
题目:题目描述 给定平面上n
个点
,找出其中的一对点的
距离
,使得在这n
个点
的所
有点
对中,该
距离
为所
有点
对中
最小
的 输入格式 第一行:n;2≤n≤200000 接下来n行:每行两个实数:x y,表示一
个点
的行坐标和列坐标,中间用一个空格隔开。 输出格式 仅一行,一个实数,表示最短
距离
,精确到小数点后面4位。 输入输出样例 输入 #1 3 1 1 1 2 2 2 输出 #1 1.0...
图像处理之霍夫变换(
直线
检测
算法
)
图像处理之霍夫变换(
直线
检测
算法
) 霍夫变换是图像变换中的经典手段之一,主要用来从图像中分离出具有某种相同特征的几何 形状(如,
直线
,圆等)。霍夫变换寻找
直线
与圆的方法相比与其它方法可以更好的减少噪 声干扰。经典的霍夫变换常用来检测
直线
,圆,椭圆等。 霍夫变换
算法
思想: 以
直线
检测为例,每个像素坐标点经过变换都变成都
直线
特质有贡献的统一度量,一个简单 的例子如下:
一条
直线
在图
3种
求
点到线段最短
距离
的
算法
3种
求
点到线段最短
距离
的
算法
[原] (2006-08-05 13:31:00) http://blog.sina.com.cn/s/blog_4dacef8501000foz.html 前段时间做东西的时候,因为要用鼠标拾取线段,涉及到了
求
一
个点
到线段最短
距离
的
算法
问题。在网上找了半天,主要提供了两种
算法
,一种是经典型的,直接用高中的几何知道
求
,当然
算法
也巨复杂,要是用几万
数据结构与算法
33,027
社区成员
35,336
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章