Фиттинг гамма-распределения в Python со скалярным множителем - PullRequest
0 голосов
/ 21 мая 2019

Я выполнил оптимизацию, чтобы минимизировать ошибку полученной модели, однако R-квадрат все еще низок. Я пытаюсь умножить скаляр на полученную модель, чтобы получить лучшее соответствие. Скаляр также будет сгенерирован с помощью оптимизации.

Я сделал это в Excel, используя инструменты решателя, и получил хороший результат, но Python дает мне другой результат.

import numpy as np
import scipy.stats as stats 
from scipy.optimize import leastsq
import sklearn.metrics as metrics

def my_res( params, yData ):
    a, b = params
    xList= range( 1, len(yData) + 1 )
    th = np.fromiter( ( stats.gamma.pdf( x, a, loc=0, scale=b ) for x in  xList ), np.float )
    diff = np.array(th) - np.array( yData )
    return diff

data = [0.030235821,    0.039199333,    0.029218791,    0.017308671]

sol, err = leastsq( my_res, [.4, 1 ], args=( data, ) )

datath = [ stats.gamma.pdf( x, sol[0], loc=0, scale=sol[1]) for x in range(1,5) ]

### the result showed low R-squared
ll=[1,2,3,4,5,6,7,8,9,10]
plop=stats.gamma.pdf(ll, sol[0], loc=0, scale=sol[1])
print ('expected values:')
print(plop)
print(sol)
rscored=metrics.r2_score(data,np.array(plop[0:4]))
print("R-squared without scalar: ",rscored)
##############################################################################
#Code with scalar
def my_res( params, yData ):
    a, b, c = params
    xList= range( 1, len(yData) + 1 )
    th = np.fromiter( ( stats.gamma.pdf( x, a, loc=0, scale=b ) for x in  xList ), np.float )
    diff = np.array(th)*c - np.array( yData )
    return diff

data = [0.030235821,    0.039199333,    0.029218791,    0.017308671]

sol, err = leastsq( my_res, [.4, 1, 0.1 ], args=( data, ) )

datath = [ stats.gamma.pdf( x, sol[0], loc=0, scale=sol[1]) for x in range(1,5) ]

### the result gives the expected answer
ll=[1,2,3,4,5,6,7,8,9,10]
plop=stats.gamma.pdf(ll, sol[0], loc=0, scale=sol[1])
print ('expected values:')
print(plop)
print(sol)
rscored=metrics.r2_score(data,np.array(plop[0:4]))
print("R-squared with scalar: ",rscored)

Скаляр 0,133922081 Альфа 2.928877362 Бета 0,928544745 R ^ 2 0.999996716 Ожидаемые значения: [0,030232481 0,039211057 0,029197912 0,0173232 0,009074871 0,004393961 0,002014991 0,000888009 0,000379637 0,000158458]

...