Statistics 有界变量方差最大化

Statistics 有界变量方差最大化,statistics,variance,maximization,Statistics,Variance,Maximization,让x_1,…,x_i,…,x_p是p实数,这样0在评论之后,我对你的问题做了一些数值证明的尝试。还有一些工作要做,但我希望这能让你走上正轨。此外,我使用了python,我不知道这是否适合您。您当然可以在matlab和R中找到类似的方法 我使用了众所周知的方差=E[X^2]-E[X]^2的性质,使导数更容易。(如果您有疑问,请检查) pythonpackagescipy.optimize有一个方法minimize以数值方式最小化函数。您可以选择一种算法来解决问题;我对可能的算法不太熟悉,我在寻找著

让x_1,…,x_i,…,x_p是p实数,这样0在评论之后,我对你的问题做了一些数值证明的尝试。还有一些工作要做,但我希望这能让你走上正轨。此外,我使用了
python
,我不知道这是否适合您。您当然可以在
matlab
R
中找到类似的方法

我使用了众所周知的方差=E[X^2]-E[X]^2的性质,使导数更容易。(如果您有疑问,请检查)

python
package
scipy.optimize
有一个方法
minimize
以数值方式最小化函数。您可以选择一种算法来解决问题;我对可能的算法不太熟悉,我在寻找著名的普通梯度下降法(好吧,至少我希望你知道),我认为封闭式下降法可能是,但老实说,我对细节不是100%确定

最后,我没有确定你要最小化的函数是凸的,也没有确定它是否有局部极小值,但是结果看起来很好

我将在下面用python编写代码,以防有用,但底线是我建议您:

  • 选择您熟悉的语言/软件包
  • 为优化选择一个算法
  • 最好证明函数是凸的(以便解收敛)
  • 设置要进行验证的参数
代码如下。希望能有帮助

我不打算公布导数的代数,我希望你能自己做。你必须考虑到你是最大化的,而不是最小化的,所以你必须乘以-1,我希望解释得很清楚(寻找“最大化”)

设置

In [1]:

from scipy.optimize import minimize
import numpy as np
你要最大化的函数,就是方差(记住技巧E[X^2]-E[X]^2和-1)

该函数对向量
x
的每一个
xi
的导数,(我希望您可以推导并得到相同的结果)

实际上,我在编写这个函数时犯了很多错误,包括在派生函数和python实现中。但是有一个技巧非常有用,那就是用数字的方式检查导数,在每个维度上加上和减去一个小ε,然后计算曲线的斜率。这是一个近似导数的函数

In [72]:

def func_deriv_approx(x, epsilon=0.00001):
    l = []
    for i in range(len(x)):
        x_plus = [x[j]+((j == i)*epsilon) for j in range(len(x))]
        x_minus = [x[j]-((j == i)*epsilon) for j in range(len(x))]
        res = (-1) * (func(x_plus) - func(x_minus)) / (2*epsilon)
        l += [res]
    return l
然后我检查了
func_deriv_approx
func_deriv
的一系列值

以及最小化本身。如果我将值初始化为我们怀疑正确的解决方案,它工作正常,只迭代一次并给出预期结果

In [99]:

res = minimize(func, [0, 0, 10, 10], jac=func_deriv, bounds=[(0,10) for i in range(4)],
               method='SLSQP', options={'disp': True})
Optimization terminated successfully.    (Exit mode 0)
            Current function value: -25.0
            Iterations: 1
            Function evaluations: 1
            Gradient evaluations: 1

In [100]:

print(res.x)
[  0.   0.  10.  10.]
(请注意,您可以使用所需的长度,因为
func
func_deriv
的编写方式可以接受任何长度)

你可以像这样随机初始化

In [81]:

import random
xinit = [random.randint(0, 10) for i in range(4)]

In [82]:

xinit
Out[82]:
[1, 2, 8, 7]
然后最大化就是

In [83]:

res = minimize(func, xinit, jac=func_deriv, bounds=[(0,10) for i in range(4)],
               method='SLSQP', options={'disp': True})
Optimization terminated successfully.    (Exit mode 0)
            Current function value: -25.0
            Iterations: 3
            Function evaluations: 3
            Gradient evaluations: 3
In [84]:

print(res.x)
[  1.27087156e-13   1.13797860e-13   1.00000000e+01   1.00000000e+01]
或者最后,对于长度=100

In [85]:

import random
xinit = [random.randint(0, 10) for i in range(100)]

In [91]:

res = minimize(func, xinit, jac=func_deriv, bounds=[(0,10) for i in range(100)],
               method='SLSQP', options={'disp': True})
Optimization terminated successfully.    (Exit mode 0)
            Current function value: -24.91
            Iterations: 23
            Function evaluations: 22
            Gradient evaluations: 22
In [92]:

print(res.x)
[  2.49143492e-16   1.00000000e+01   1.00000000e+01  -2.22962789e-16
  -3.67692105e-17   1.00000000e+01  -8.83129256e-17   1.00000000e+01
   7.41356521e-17   3.45804774e-17  -8.88402036e-17   1.31576404e-16
   1.00000000e+01   1.00000000e+01   1.00000000e+01   1.00000000e+01
  -3.81854094e-17   1.00000000e+01   1.25586928e-16   1.09703896e-16
  -5.13701064e-17   9.47426071e-17   1.00000000e+01   1.00000000e+01
   2.06912944e-17   1.00000000e+01   1.00000000e+01   1.00000000e+01
  -5.95921560e-17   1.00000000e+01   1.94905365e-16   1.00000000e+01
  -1.17250430e-16   1.32482359e-16   4.42735651e-17   1.00000000e+01
  -2.07352528e-18   6.31602823e-17  -1.20809001e-17   1.00000000e+01
   8.82956806e-17   1.00000000e+01   1.00000000e+01   1.00000000e+01
   1.00000000e+01   1.00000000e+01   3.29717355e-16   1.00000000e+01
   1.00000000e+01   1.00000000e+01   1.00000000e+01   1.00000000e+01
   1.43180544e-16   1.00000000e+01   1.00000000e+01   1.00000000e+01
   1.00000000e+01   1.00000000e+01   2.31039883e-17   1.06524134e-16
   1.00000000e+01   1.00000000e+01   1.00000000e+01   1.00000000e+01
   1.77002357e-16   1.52683194e-16   7.31516095e-17   1.00000000e+01
   1.00000000e+01   3.07596508e-17   1.17683979e-16  -6.31665821e-17
   1.00000000e+01   2.04530928e-16   1.00276075e-16  -1.20572493e-17
  -3.84144993e-17   6.74420338e-17   1.00000000e+01   1.00000000e+01
  -9.66066818e-17   1.00000000e+01   7.47080743e-17   4.82924982e-17
   1.00000000e+01  -9.42773478e-17   1.00000000e+01   1.00000000e+01
   1.00000000e+01   1.00000000e+01   1.00000000e+01   5.01810185e-17
  -1.75162038e-17   1.00000000e+01   6.00111991e-17   1.00000000e+01
   1.00000000e+01   7.62548028e-17  -6.90706135e-17   1.00000000e+01]

是不是有一半的值等于0,另一半等于b?谢谢,我觉得这很合理。你知道怎么证明吗?Ups!我的代数有点生疏了。。。(此外,我还必须学会如何用符号来写答案!)只是拿了一张纸,并且只能证明,对于偶数
p
,上面选择的值的方差是(1/2)*b^2。也许用数值方法。。。但这真的很奇怪!你真的需要证明吗?我不想给你添太多麻烦,但是如果你能给你的过程画一个大纲,或者给我一个链接来解释这一点,那将是非常有帮助的。我真的很感谢你的帮助!谢谢。如果你已经读过我的答案;我终于找到了问题所在,所以我将大规模地编辑它,不尊重我的原始文本。请在几分钟后再次检查。这真的很有帮助,非常感谢!!是的,我理解Python,基本上复制了你的想法。还感谢您提供有关衍生品的信息。现在我想我会再次学习代数。现在我做了!对不起,我不太习惯这里的系统,再次非常感谢!
In [83]:

res = minimize(func, xinit, jac=func_deriv, bounds=[(0,10) for i in range(4)],
               method='SLSQP', options={'disp': True})
Optimization terminated successfully.    (Exit mode 0)
            Current function value: -25.0
            Iterations: 3
            Function evaluations: 3
            Gradient evaluations: 3
In [84]:

print(res.x)
[  1.27087156e-13   1.13797860e-13   1.00000000e+01   1.00000000e+01]
In [85]:

import random
xinit = [random.randint(0, 10) for i in range(100)]

In [91]:

res = minimize(func, xinit, jac=func_deriv, bounds=[(0,10) for i in range(100)],
               method='SLSQP', options={'disp': True})
Optimization terminated successfully.    (Exit mode 0)
            Current function value: -24.91
            Iterations: 23
            Function evaluations: 22
            Gradient evaluations: 22
In [92]:

print(res.x)
[  2.49143492e-16   1.00000000e+01   1.00000000e+01  -2.22962789e-16
  -3.67692105e-17   1.00000000e+01  -8.83129256e-17   1.00000000e+01
   7.41356521e-17   3.45804774e-17  -8.88402036e-17   1.31576404e-16
   1.00000000e+01   1.00000000e+01   1.00000000e+01   1.00000000e+01
  -3.81854094e-17   1.00000000e+01   1.25586928e-16   1.09703896e-16
  -5.13701064e-17   9.47426071e-17   1.00000000e+01   1.00000000e+01
   2.06912944e-17   1.00000000e+01   1.00000000e+01   1.00000000e+01
  -5.95921560e-17   1.00000000e+01   1.94905365e-16   1.00000000e+01
  -1.17250430e-16   1.32482359e-16   4.42735651e-17   1.00000000e+01
  -2.07352528e-18   6.31602823e-17  -1.20809001e-17   1.00000000e+01
   8.82956806e-17   1.00000000e+01   1.00000000e+01   1.00000000e+01
   1.00000000e+01   1.00000000e+01   3.29717355e-16   1.00000000e+01
   1.00000000e+01   1.00000000e+01   1.00000000e+01   1.00000000e+01
   1.43180544e-16   1.00000000e+01   1.00000000e+01   1.00000000e+01
   1.00000000e+01   1.00000000e+01   2.31039883e-17   1.06524134e-16
   1.00000000e+01   1.00000000e+01   1.00000000e+01   1.00000000e+01
   1.77002357e-16   1.52683194e-16   7.31516095e-17   1.00000000e+01
   1.00000000e+01   3.07596508e-17   1.17683979e-16  -6.31665821e-17
   1.00000000e+01   2.04530928e-16   1.00276075e-16  -1.20572493e-17
  -3.84144993e-17   6.74420338e-17   1.00000000e+01   1.00000000e+01
  -9.66066818e-17   1.00000000e+01   7.47080743e-17   4.82924982e-17
   1.00000000e+01  -9.42773478e-17   1.00000000e+01   1.00000000e+01
   1.00000000e+01   1.00000000e+01   1.00000000e+01   5.01810185e-17
  -1.75162038e-17   1.00000000e+01   6.00111991e-17   1.00000000e+01
   1.00000000e+01   7.62548028e-17  -6.90706135e-17   1.00000000e+01]