使用附加变量进行回归以进行优化

我得到了由 X 和 Y 点组成的数据(x_1,...x_n; y1,...y_n)。


我想使用两个基函数将 X 拟合到 Y:max(x,mu_1)和min(x,mu_2)


换句话说,我想估计以下等式:


y_i = a_1*max(x_i,mu_1)+a_2*min(x_i,mu_2)

我想找到 mu_1并且mu_2上面的拟合是最好的。我的意思是这样的mu_1和mu_2,这样,当我适合y以平方剩余的X总和被最小化。


或者我可以说我需要a_1, a_2, mu_1,mu_2以便最小化上述拟合的残差平方和。


我尝试执行以下操作:


我创建了两个参数的函数(mu_1 and mu_2),返回 Y 到 X 的拟合质量。然后我尝试使用scipy.optimize.minimize. 这是代码:


import numpy as np

from scipy.optimize import minimize

from sklearn.linear_model import LinearRegression


###Create X and Y

X = np.random.normal(10,1,size = 10000)

Y = np.random.normal(20,1,size = 10000)


###Create function that estimates quality of fit


def func(mu_1,mu_2):

   ### basis functions

   regressor_1 = np.maximum(X,mu_1).reshape(-1,1)

   regressor_2 = np.minimum(X,mu_2).reshape(-1,1)

   x_train = np.hstack((regressor_1,regressor_2))


   model = LinearRegression().fit(x_train,Y)


   ###I didnt find how to extract sum of squared residual, but I can get R 

   squared, so I thought that minimizing SSR is the same as maximizing R 

   squared and it is the same as minimizing -R^2


   objective = model.score(x_train,Y)

   return -1*objective


### Now I want to find such mu_1 and mu_2 that minimize "func"

minimum = minimize(func,0,0)

minimum.x

它不起作用。我真的很感激任何帮助。


慕慕森
浏览 205回答 1
1回答

守候你守候我

这个图形拟合器使用您的功能,它似乎可以满足您的要求。import numpy, scipy, matplotlibimport matplotlib.pyplot as pltfrom scipy.optimize import curve_fitimport warningsxData = numpy.array([1.1, 2.2, 3.3, 4.4, 5.0, 6.6, 7.7])yData = numpy.array([1.1, 20.2, 30.3, 60.4, 50.0, 60.6, 70.7])def func(x, a_1, a_2, mu_1, mu_2):    retArray = []    for x_i in x: # process data points individually        val = a_1*max(x_i,mu_1) + a_2*min(x_i,mu_2)        retArray.append(val)    return retArray# turn off the curve_fit() "covariance estimation" warningwarnings.filterwarnings("ignore")# these are the same as the scipy defaultsinitialParameters = numpy.array([1.0, 1.0, 1.0, 1.0])# curve fit the test datafittedParameters, pcov = curve_fit(func, xData, yData, initialParameters)modelPredictions = func(xData, *fittedParameters) absError = modelPredictions - yDataSE = numpy.square(absError) # squared errorsMSE = numpy.mean(SE) # mean squared errorsRMSE = numpy.sqrt(MSE) # Root Mean Squared Error, RMSERsquared = 1.0 - (numpy.var(absError) / numpy.var(yData))print('Parameters:', fittedParameters)print('RMSE:', RMSE)print('R-squared:', Rsquared)print()########################################################### graphics output sectiondef ModelAndScatterPlot(graphWidth, graphHeight):    f = plt.figure(figsize=(graphWidth/100.0, graphHeight/100.0), dpi=100)    axes = f.add_subplot(111)    # first the raw data as a scatter plot    axes.plot(xData, yData,  'D')    # create data for the fitted equation plot    xModel = numpy.linspace(min(xData), max(xData))    yModel = func(xModel, *fittedParameters)    # now the model as a line plot    axes.plot(xModel, yModel)    axes.set_xlabel('X Data') # X axis data label    axes.set_ylabel('Y Data') # Y axis data label    plt.show()    plt.close('all') # clean up after using pyplotgraphWidth = 800graphHeight = 600ModelAndScatterPlot(graphWidth, graphHeight)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python