解读python cvxpy下SDP问题编程

 更新时间:2022年12月17日 12:04:26   作者:zy123457  
这篇文章主要介绍了解读python cvxpy下SDP问题编程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

python cvxpy下SDP问题编程

最近在做定位算法的复现问题,遇到了

Source Localization in Wireless Sensor Networks From Signal Time-of-Arrival Measurements

里面的一个半正定优化算法,因此选用cvxpy库实现。

官方文档[cvxpy]的例程复现的算法都很简单,因此对该问题的借鉴意义不大。

算法如下


对我而言,首先的难度就是拼接矩阵后的半正定约束条件,起初是另设立两个矩阵变量,然后按部就班的增加限制条件。但最后求得的数据千奇百怪,与预测位置没有任何关系。

后来不断尝试更改约束限制的表达形式,但均无效果。

后来输出了每个变量的值查看,发现Q元素的物理意义为预测距离的平方,但是求出来的Q矩阵元素往往极大,因此擅自添加了一个约束条件,限制Q的最大元素在预测距离平方的量级上,完美解决问题。

附上代码

class Program_t:

    def __init__(self,bt):
        self.BT = bt
        self.BT_x = [b[0] for b in self.BT]
        self.BT_y = [b[1] for b in self.BT]
        self.T=[b[2] for b in self.BT]
        self.number = len(bt)
        
    def LS_steps(self):
        num = len(self.T)
        up_control = 2*max(self.T)**2#限制最大元素量级
        Q = cp.Variable((num,num))#待求变量
        tao = cp.Variable((num,1))#生成矩阵形式后面才可以拼接
        y_ = cp.Variable((2,1))
        y_s = cp.Variable((1,1))#矩阵形式用于拼接
        yita = 0.000005*sum(self.T) / num#论文给出的参数选择,可更改常数
        G = np.eye(num)-np.ones((num,num))
        t = np.array([self.T]).T
        expr1 = cp.trace((cp.transpose(G)) @ G @ (Q- cp.multiply(2,t @ (cp.transpose(tao)))+t @ (cp.transpose(t))))
        expr2 = yita*cp.sum(Q)
        expr = expr1+ expr2#目标函数
        Q_ = cp.bmat([[Q,tao],[cp.transpose(tao),[[1]]]])#拼接矩阵
        Y = cp.bmat([[np.eye(2),y_],[cp.transpose(y_),y_s]])#拼接矩阵
        constraints = [Q_ >> 0, Y >> 0, cp.max(Q)<=up_control]#限制条件Q半正定,Y半正定,Q最大元素小于上限(这个约束非常重要,是我自己加上去的)
        for i in range(num):
            X = np.array([self.BT_x[i],self.BT_y[i],-1]).T
            constraints += [Q[i, i] == cp.transpose(X) @ Y @ X]#约束条件
            for j in range(i+1,num):
                X_j = np.array([self.BT_x[j], self.BT_y[j],-1]).T
                constraints += [Q[i, j] >= cp.abs(cp.transpose(X) @ Y @ X_j)]#约束条件
        obj = cp.Minimize(expr)
        prob = cp.Problem(obj, constraints)
        prob.solve()
        position = y_.value
        print(expr1.value)#输出值
        print(expr2.value)
        print(prob.value)#输出值
        print(prob.status)#输出状态
        print(position)
        return position
       	

总结

1.理论算法与编程实现永远不等,不能轻易照搬,具体实现过程中要结合实际情况进行考虑,当求得的结果与预计相差很多时,可以尝试增加数值约束,因为计算机仿真只是近似,不是理论上的完美条件。

2.编程实现调用库时,最好按照库的标准写,如本例中矩阵点乘可以用numpy 的dot或者cvxpy的@,以及转置的.T和cp.transpose().但是dot有时会产生意想不到的情况,平白增加工作量。

3.复现算法时必须要对算法有深入理解,否则难以发现问题所在。

4.不要轻易怀疑工具包的问题,经过大量使用的工具包一定比你的感觉可靠。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • python3基于TCP实现CS架构文件传输

    python3基于TCP实现CS架构文件传输

    这篇文章主要为大家详细介绍了python3基于TCP实现CS架构文件传输,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • kaggle+mnist实现手写字体识别

    kaggle+mnist实现手写字体识别

    这篇文章主要为大家详细介绍了kaggle+mnist实现手写字体识别,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • 详解Django缓存处理中Vary头部的使用

    详解Django缓存处理中Vary头部的使用

    这篇文章主要介绍了详解Django缓存处理中Vary头部的使用,Django是最具人气的Python web开发框架,需要的朋友可以参考下
    2015-07-07
  • OpenCV黑帽运算(BLACKHAT)的使用

    OpenCV黑帽运算(BLACKHAT)的使用

    本文主要介绍了OpenCV黑帽运算(BLACKHAT)的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • python中xlrd模块的使用详解

    python中xlrd模块的使用详解

    这篇文章主要介绍了python中xlrd模块的使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • Python 实现数据结构中的的栈队列

    Python 实现数据结构中的的栈队列

    这篇文章主要介绍了Python 实现数据结构中的的栈,队列,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-05-05
  • Python RabbitMQ消息队列实现rpc

    Python RabbitMQ消息队列实现rpc

    这篇文章主要介绍了python 之rabbitmq实现rpc,主要实现客户端通过发送命令来调用服务端的某些服务,服务端把结果再返回给客户端,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • Python实现照片卡通化

    Python实现照片卡通化

    animegan2-pytorch机器学习项目可以实现照片动漫化,本文将为大家详细介绍一下如何使用这一项目,感兴趣的小伙伴快来跟随小编一起学习吧
    2021-12-12
  • Python可变参数*args和**kwargs用法实例小结

    Python可变参数*args和**kwargs用法实例小结

    这篇文章主要介绍了Python可变参数*args和**kwargs用法,结合实例形式总结分析了Python中可变参数*args和**kwargs的功能、区别与具体使用技巧,需要的朋友可以参考下
    2018-04-04
  • python密码学黑客攻击RSA密码

    python密码学黑客攻击RSA密码

    这篇文章主要为大家介绍了python密码学黑客攻击RSA密码,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05

最新评论