代码之家  ›  专栏  ›  技术社区  ›  78282219

scipy.optimize.least\u squares数据到哪里去了?

  •  0
  • 78282219  · 技术社区  · 7 年前

    我试着做一个简单的多元回归分析

    Y = b_1 * X_1 + b_2 * X_2 + b_3 * X_3 + e
    

    sum(beta) = 1
    beta >= 0
    

    我的输入数据如下

    df = pd.DataFrame(np.random.randint(low=0, high=10, size=(100,4)), 
              columns=['Historic Rate', 'Overnight', '1M','3M'])
    
    Y = df['Historic Rate']
    X = df['Overnight','1M','3M]
    

    所以我想使用函数scipy.optimize.least\u squares,就像这样

    scipy.optimize.least_squares(fun, bounds=(0,1),X)
    

    Y - B1*X1 - B2*X2 - B3*X3
    

    我不确定输入数据去哪里估计这个OLS?

    1 回复  |  直到 7 年前
        1
  •  1
  •   joni    7 年前

    你的问题中的beta是什么?假设beta应该是包含b1,…,b3的向量,它只是一个约束优化问题,可以很容易地用 scipy's minimize 这样地:

    import pandas as pd
    import numpy as np
    from scipy.optimize import minimize
    
    # Your Data
    df = pd.DataFrame(np.random.randint(low=0, high=10, size=(100,4)), columns=['Historic Rate', 'Overnight', '1M','3M'])
    Y = np.array(df['Historic Rate'])
    X = np.array(df[['Overnight','1M','3M']])
    
    # Define the Model
    model = lambda b, X: b[0] * X[:,0] + b[1] * X[:,1] + b[2] * X[:,2]
    
    # The objective Function to minimize (least-squares regression)
    obj = lambda b, Y, X: np.sum(np.abs(Y-model(b, X))**2)
    
    # Bounds: b[0], b[1], b[2] >= 0
    bnds = [(0, None), (0, None), (0, None)]
    
    # Constraint: b[0] + b[1] + b[2] - 1 = 0
    cons = [{"type": "eq", "fun": lambda b: b[0]+b[1]+b[2] - 1}]
    
    # Initial guess for b[1], b[2], b[3]:
    xinit = np.array([0, 0, 1])
    
    res = minimize(obj, args=(Y, X), x0=xinit, bounds=bnds, constraints=cons)
    print(f"b1={res.x[0]}, b2={res.x[1]}, b3={res.x[2]}")