0/1分数与最优比率生成树

0/1分数与最优比率生成树

分数问题为
m i n λ = f ( x ) = a ( x ) b ( x ) ( x ϵ S ) min\lambda=f(x)=\frac{a(x)}{b(x)}(x\epsilon S) minλ=f(x)=b(x)a(x)(xϵS)
其中 x是向量。
我们需要求向量X以使得 λ \lambda λ最小。
现在看这样一个问题,一个图中,每个边都由两个权值分别是cost花费和value收益,我们现在需要让
∑ i ϵ V v a l u e i ∑ i ϵ V c o s t i = λ \frac{\sum_{i\epsilon V}{value_i}}{\sum_{i\epsilon V}{cost_i}}=\lambda iϵVcostiiϵVvaluei=λ
最小(最小一样)
其中V是图中一个生成树的点的集合
现在设 x i x_i xi取值为0和1,代表第i个边选择与不选,一会我们所求的所有i共同构成一个生成树,所以简化下,去掉公式中的 i ϵ V i\epsilon V iϵV变成
(1) ∑ v a l u e i ∗ x i ∑ c o s t i ∗ x i = λ \frac{\sum{value_{i}*x_i}}{ \sum{cost_i*x_i}}=\lambda \tag{1} costixivalueixi=λ(1)
现在设函数
f ( r ) = ∑ v a l u e i ∗ x i − r ∗ ∑ c o s t i ∗ x i f(r) = \sum{value_i*x_i}-r*\sum{cost_i}*x_i f(r)=valueixircostixi
自变量为r
其中函数 f ( x ) f(x) f(x)单调递减
现在我们令 f ( x ) = 0 f(x)=0 f(x)=0此时r就是我们希望求得 λ \lambda λ
所以现在我们考虑,给定一组 x i x_i xi总能找到一个 r r r使得 f ( r ) = 0 f(r)=0 f(r)=0(一次函数嘛,很容易理解),那么此时得 r r r就是我们希望求得 λ \lambda λ,当然此时得 λ \lambda λ不一定满足最小条件,但最起码它符合等式(1),那么我们如何求使得 r r r最小呢,(已下得 λ \lambda λ r r r是一回事儿)考虑使用二分问题求解,我们可以想到如果我们给定一个 λ \lambda λ太小,比 λ m i n \lambda_{min} λmin都小(尽管我们没有求出来 λ m i n \lambda_{min} λmin,但它一定存在),那么无论 x i x_i xi集合如何取值, f ( f( f(\lambda ) &gt; 0 )&gt;0 )>0恒成立,所以此时我们要让 λ \lambda λ变大一些,如果 λ &gt; λ m a x \lambda&gt; \lambda_{max} λ>λmax,那么无论 x i x_i xi取什么集合,f( λ \lambda λ)<0恒成立,此时很显然要让 λ \lambda λ变小一些,如果 λ \lambda λ正好使得使得 f ( λ ) = 0 f(\lambda)=0 f(λ)=0,那么此时我们让 λ \lambda λ在变大一些,看看能不能新得 λ \lambda λ满足等式(1),如果满足就再增大,所以我们可以根据二分来求解此问题。
再看一个几何解释。我们任意给定一组 x i x_i xi,那么原函数 f ( x ) f(x) f(x)为一个一次函数,现在我们给定很多组 x i x_i xi
如下图
在这里插入图片描述
现在我们知道每条直线与x轴得交点值即为每一个生成树得 ∑ i ϵ V v a l u e i ∑ i ϵ V c o s t i = λ \frac{\sum_{i\epsilon V}{value_i}}{\sum_{i\epsilon V}{cost_i}}=\lambda iϵVcostiiϵVvaluei=λ 值(也就是把相应得那个生成树的value相加除以cost相加)我们想要求得最大的 λ \lambda λ也就是图上最右边的那条直线与x轴的交点,现在我们令L=0,R=inf,mid=(L+R)/2,我们把mid带入到每条直线上去,也就是 f ( m i d ) f(mid) f(mid),选择 f ( m i n ) f(min) f(min)最大的那一条直线,然后看看 f ( m i d ) f(mid) f(mid)是否大于0,

  1. 如果 f ( m i d ) &gt; 0 f(mid)&gt;0 f(mid)>0,说明此时mid有些小,存在更大的 λ &gt; \lambda&gt; λ>mid,令L=mid
  2. 如果 f ( m i d ) &lt; 0 f(mid)&lt;0 f(mid)<0,说明此时mid有些大,所有生成树集合的 λ \lambda λ值都不能达到这么大,令R=mid
  3. 若果 f ( m i d ) = 0 f(mid)=0 f(mid)=0,此时就是原问题的最优解

现在考虑给定一个mid,如何求得最大的那根直线的 f ( m i n ) f(min) f(min),所以给定一个 λ \lambda λ我们要求最大的 f ( λ ) f(\lambda) f(λ),也就是
m a x ( f ( λ ) ) = m a x ( ∑ v a l u e i ∗ x i − r ∗ ∑ c o s t i ∗ x i ) max(f(\lambda))=max(\sum{value_i*x_i}-r*\sum{cost_i}*x_i) max(f(λ))=max(valueixircostixi)
m a x ( ∑ v a l u e i ∗ x i − r ∗ ∑ c o s t i ∗ x i ) = m a x ( ∑ ( v a l u e i − r ∗ c o s t i ) ∗ x i ) max(\sum{value_i*x_i}-r*\sum{cost_i}*x_i)=max(\sum{(value_i-r*cost_i)*x_i}) max(valueixircostixi)=max((valueircosti)xi),因为每一组 x i x_i xi都是一个最小生成树的集合,所以我们只需要设 w i − v a l u e i − r ∗ c o s t i w_i-value_i-r*cost_i wivalueircosti,然后再用 w i w_i wi当作图中边的权值构建最小生成树,最小生成树的权值和就是最后的 m a x ( f ( λ ) ) max(f(\lambda)) max(f(λ))


DinkelBach定理
我们现在考虑一种替代二分的方法,如果 m a x f ( λ ) &gt; 0 maxf(\lambda)&gt;0 maxf(λ)>0,那么我我们直接将那条直线的横截距赋值给 λ \lambda λ是收敛速度更快呢?如果 m a x f ( λ ) &lt; 0 maxf(\lambda)&lt;0 maxf(λ)<0,那么我们任何让横截据赋值给 λ \lambda λ,那么 λ \lambda λ仍然能够变小和二分的效果一样,所以我们可以考虑每次把横截据赋值给 λ \lambda λ直到 λ \lambda λ不变为止。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用 OpenCvSharp 进行 SURF 特征匹配时,可以按以下步骤计算匹配分数: 1. 读入图像:首先使用 OpenCvSharp 加载需要匹配的两张图像。 2. 提取特征点和特征向量:使用 SURF 算法提取两张图像中的特征点和特征向量。 3. 特征匹配:使用 FlannBasedMatcher 进行特征点匹配,得到匹配对。 4. 计算匹配分数:根据匹配对计算匹配分数,可以使用 distance 进行距离计算,也可以使用 Lowe's ratio 进行比率测试。 示例代码: ``` // 读入图像 Mat img1 = Cv2.ImRead("img1.png", ImreadModes.Color); Mat img2 = Cv2.ImRead("img2.png", ImreadModes.Color); // 提取特征点和特征向量 SURF surfDetector = SURF.Create(500, 4, 2, true, true); KeyPoint[] keypoints1, keypoints2; Mat descriptor1, descriptor2; surfDetector.DetectAndCompute(img1, null, out keypoints1, descriptor1); surfDetector.DetectAndCompute(img2, null, out keypoints2, descriptor2); // 特征匹配 FlannBasedMatcher matcher = new FlannBasedMatcher(); DMatch[] matches = matcher.Match(descriptor1, descriptor2); // 计算匹配分数 double max_dist = 0; double min_dist = 100; for (int i = 0; i < descriptor1.Rows; i++) { double dist = matches[i].Distance; if (dist < min_dist) min_dist = dist; if (dist > max_dist) max_dist = dist; } List<DMatch> goodMatches = new List<DMatch>(); for (int i = 0; i < descriptor1.Rows; i++) { if (matches[i].Distance <= Math.Max(2 * min_dist, 0.02)) { goodMatches.Add(matches[i]); } } double matchScore = (double)goodMatches.Count / (double)descriptor1.Rows; ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值