2014-03-24 10 views
1

3 개의 변수가 있습니다. Market_Price, Hours, Age.Scipy - 최적화. 두 변수 사이의 비율 찾기

최적화를 사용하여 각 변수와 Market_Price 사이의 관계를 찾았습니다.

데이터 :

hours = [1000, 10000, 11000, 11000, 15000, 18000, 37000, 24000, 28000, 28000, 42000, 46000, 50000, 34000, 34000, 46000, 50000, 56000, 64000, 64000, 65000, 80000, 81000, 81000, 44000, 49000, 76000, 76000, 89000, 38000, 80000, 69000, 46000, 47000, 57000, 72000, 77000, 68000] 

market_Price = [30945, 28974, 27989, 27989, 36008, 24780, 22980, 23997, 25957, 27847, 36000, 25588, 23980, 25990, 25990, 28995, 26770, 26488, 24988, 24988, 17574, 12995, 19788, 20488, 19980, 24978, 16000, 16400, 18988, 19980, 18488, 16988, 15000, 15000, 16998, 17499, 15780, 8400] 

age = [2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 7, 8, 8, 8, 8, 8, 13,] 

I 파생 관계가 있었다 :

시간 = 로그 market_price하기 = 로그 (H) * H1 + H2,

연령 market_price하기 (a) * A1 + a2

여기서, h1, h2, a1, a2는 Scipy 's Optimize Curve Fit을 사용하여 찾습니다.

이제 모든 3을 하나의 계산으로 결합하여 나이와 시간을 사용하여 market_price를 결정할 수 있습니다.

내가 지금까지 해왔 던 방식은 어느 조합이 가장 작은 표준 편차를 가지는지 결정함으로써이 둘 사이의 비율을 찾는 것입니다.

std_divs = [] 
for ratio in ratios:  
    n = 0 
    price_difference_final = [] 
    while n < len(prices): 
     predicted_price = (log(h)*h1+h1)*ratio + (log(a)*a1+a1)*(1-ratio) 
     price_difference_final.append(prices[n] - predicted_price) 
     n += 1 
    data = np.array(price_difference_final) 
    std_divs.append(np.std(data)) 
std_div = min(std_divs) 
optimum_ratio = ratios[std_divs.index(min(std_divs))] 

당신이 볼 수 있듯이, 나는 우아한 솔루션이 아닌 무차별 한 힘으로이를 수행합니다.

더구나 이제는 3의 관계가 단일 비율 인 대신 표현 될 수 없다는 것을 알았습니다. 비율은 슬라이딩해야합니다. 연도가 증가할수록 시장 가격과 관련하여 연령/연령 비율이 감소합니다.

불행히도 Scipy 's Curve Fit을 사용하여 구현할 수 없었습니다. 한 쌍의 배열 만 허용하기 때문입니다.

가장 좋은 방법을 생각해보십시오.

답변

2

당신이 curve_fithoursage 데이터를 모두 전달할 수 있습니다이 경우, more than one dimension와 배열을 만들 수 있습니다. 이러한 예는 다음과 같을 수 있습니다

import numpy as np 
from scipy.optimize import curve_fit 

hours = [1000, 10000, 11000, 11000, 15000, 18000, 37000, 24000, 
      28000, 28000, 42000, 46000, 50000, 34000, 34000, 46000, 
      50000, 56000, 64000, 64000, 65000, 80000, 81000, 81000, 
      44000, 49000, 76000, 76000, 89000, 38000, 80000, 69000, 
      46000, 47000, 57000, 72000, 77000, 68000] 

market_Price = [30945, 28974, 27989, 27989, 36008, 24780, 22980, 
       23997, 25957, 27847, 36000, 25588, 23980, 25990, 
       25990, 28995, 26770, 26488, 24988, 24988, 17574, 
       12995, 19788, 20488, 19980, 24978, 16000, 16400, 
       18988, 19980, 18488, 16988, 15000, 15000, 16998, 
       17499, 15780, 8400] 

age = [2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 
     4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 7, 
     8, 8, 8, 8, 8, 13] 

combined = np.array([hours, market_Price]) 

def f(): 
    # Some function which uses combined where 
    # combined[0] = hours and combined[1] = market_Price 
    pass 

popt, pcov = curve_fit(f, combined, market_Price) 
+0

와우! 네가 그렇게 할 수 있는지 몰랐다. 무리 감사! – DGDD

1

이 이미 존재하는 한 다중 회귀 문제는, 당신은 당신의 자신의 코드를 작성할 필요가 없습니다 수 있습니다 :

http://wiki.scipy.org/Cookbook/OLS

참고 : 결국 당신은 5 개의 매개 변수가 없습니다 h1, h2, a1, a2, ratio. 다음 세 가지만 있습니다 : h2*ratio+a2*(1-ratio)h1*ratioa1*(1-ratio)

In [26]: 

y=np.array(market_Price) 
x=np.log(np.array([hours, age])).T 
In [27]: 

mymodel=ols(y, x, 'Market_Price', ['Hours', 'Age']) 
In [28]: 

mymodel.p # return coefficient p-values 
Out[28]: 
array([ 1.32065700e-05, 3.06318351e-01, 1.34081122e-05]) 
In [29]: 

mymodel.summary() 

============================================================================== 
Dependent Variable: Market_Price 
Method: Least Squares 
Date: Mon, 24 Mar 2014 
Time: 15:40:00 
# obs:     38 
# variables:   3 
============================================================================== 
variable  coefficient  std. Error  t-statistic  prob. 
============================================================================== 
const   45838.261850  9051.125823  5.064371  0.000013 
Hours   -1023.097422  985.498239  -1.038152  0.306318 
Age   -8862.186475  1751.640834  -5.059363  0.000013 
============================================================================== 
Models stats       Residual stats 
============================================================================== 
R-squared    0.624227   Durbin-Watson stat 1.301026 
Adjusted R-squared 0.602754   Omnibus stat   2.999547 
F-statistic   29.070664   Prob(Omnibus stat) 0.223181 
Prob (F-statistic) 0.000000   JB stat    1.807013 
Log likelihood  -366.421766   Prob(JB)    0.405146 
AIC criterion   19.443251   Skew     0.376021 
BIC criterion   19.572534   Kurtosis    3.758751 
==============================================================================