4

目的関数の作成
制約の追加

問題は、最初にどのような推測を使用しても、最小化関数はその数値を使用し続けることです。例: 最初の推測に 15 を使用すると、ソルバーは他の数値を試行せず、答えが 15 であると答えます。これはコードに問題があると確信していますが、どこにあるのかはわかりません。

以下のコード:

from scipy.optimize import minimize
import numpy as np
from pandas import *

#----------------------------------------------------
#-------- Create Function ------------
#----------------------------------------------------
def MovingAverage(Input,N,test=0):

    # Create data frame
    df = DataFrame(Input, columns=['Revenue'])

    # Add columns
    df['CummSum'] = df['Revenue'].cumsum()
    df['Mavg'] = rolling_mean(df['Revenue'], N)
    df['Error'] = df['Revenue'] - df['Mavg']
    df['MFE'] = (df['Error']).mean()
    df['MAD'] = np.fabs(df['Error']).mean()
    df['MSE'] = np.sqrt(np.square(df['Error']).mean())
    df['TS'] = np.sum(df['Error'])/df['MAD']

    print N, df.MAD[0]

    if test == 0:
        return df.MAD[0]
    else: return df

#----------------------------------------------------
#-------- Input ------------
#----------------------------------------------------
data = [1,2,3,4,5,5,5,5,5,5,5,5,5,5,5]


#----------------------------------------------------
#-------- SOLVER ------------
#----------------------------------------------------

## Objective Function
fun = lambda x: MovingAverage(data, x[0])

## Contraints
cons = ({'type': 'ineq', 'fun': lambda x:  x[0] - 2}, # N>=2
        {'type': 'ineq', 'fun': lambda x:  len(data) - x[0]}) # N<=len(data)


## Bounds (note sure what this is yet)
bnds = (None,None)

## Solver
res = minimize(fun, 15, method='SLSQP', bounds=bnds, constraints=cons)

##print res
##print res.status
##print res.success
##print res.njev
##print res.nfev
##print res.fun
##for i in res.x:
##    print i
##print res.message
##for i in res.jac:
##    print i
##print res.nit

# print final results
result = MovingAverage(data,res.x,1)
print result

List of possible values:
2 = 0.142857142857,
3 = 0.25641025641,
4 = 0.333333333333,
5 = 0.363636363636,
6 = 0.333333333333,
7 = 0.31746031746,
8 = 0.3125,
9 = 0.31746031746,
10 = 0.333333333333,
11 = 0.363636363636,
12 = 0.416666666667,
13 = 0.487179487179、14
= 0.571428571429、15
= 0.666666666667

4

1 に答える 1

7

以下のプロット (x 軸に 0.1 刻みでプロット) に示すように、関数は整数入力値の間で区分的に一定です。

関数プロット

したがって、導関数はほとんどすべての点でゼロです。そのため、勾配ベースの最小化メソッドは、特定の初期点を極小値として返します。

この状況を救うために、目的関数で補間を使用して、非整数入力値の中間関数値を取得することを考えることができます。これを勾配ベースの最小化と組み合わせると、15 から始まるときに 8 付近のポイントが局所的最小値として検出される可能性があります。

于 2013-01-17T15:37:47.220 に答える