Python 非线性方程与拉格朗日乘数估计
我这几天一直在为这件事苦恼……但一直没有找到解决办法。我数学不好,更别提这种难度了。
我在尝试用Python实现一个关于彩票的最大熵应用,这是我毕业作业的一部分。虽然这个项目的重点是实现一些数据挖掘技术(比如决策树、Apriori算法、K均值聚类),这些我已经完成了,但我还是想尝试一些更高级的东西……不过我想这对我来说实在是太难了。
所以,我的问题是,如何解决以下论文中的非线性方程(8)呢?
参考文献1: http://eprints.ecs.soton.ac.uk/901/01/paper05.pdf
这个方法是基于以下论文的
参考文献2: http://www.stanford.edu/~cover/papers/paper91.pdf
任何帮助(理论上的或其他方面的)都将非常感激。谢谢!
1 个回答
你需要把第7到第9个公式结合起来使用。公式中唯一不确定的就是拉格朗日乘子,也就是那些lambda。其他的部分都依赖于已有的数据,所以它们都是具体的数字。
给定一组lambda的值,你可以计算出G(j,r)和雅可比矩阵J(j,i,r,s)。如果你知道残差和雅可比矩阵,就可以用第9个公式中的牛顿法来找到方程组的根,也就是那些使得G(j,r) = 0的lambda值。
所以,你先对lambda的值做一个初步猜测,然后用这个猜测去计算其他的值,再用这些值来更新你的猜测。处理第7和第8个公式其实没有什么概念上的难度,只需要把值代进去就行了,但因为涉及到很多数字的相加,所以要小心点。
第9个公式有点复杂,因为写得不太清楚。由于这篇论文描述的是一个方程组,你通常会期待解一个线性方程:
J * d_lambda = -G
这里d_lambda是你猜测变化的一个向量,G是函数值的向量,J是雅可比值的矩阵。论文中的符号有点混乱,让本该简单的表达变得不太明了。你可以通过引入一个统一的索引a来替代一对索引i和s,作者在方法讨论中提到过这个变化,并在第4页的第二段给出了计算这个统一索引的公式。
总体来说,步骤变成了(使用统一索引):
- 选择一些lambda作为你的初始猜测。可以是零,或者随机数。
- 计算G(a)和J(a,b)。
- 解一个线性方程组来更新你的猜测。
- 如果更新的值和你的猜测相比很小,就停止。否则,确定新的猜测,然后回到第2步。
用Numpy来实现这个看起来是相当可行的。论文提到过使用并行计算的方法,但那是十多年前的事了;现在看来这个问题要小得多。