通过三条曲线拟合指数曲线

时间:2020-09-08 20:56:53

标签: python python-3.x machine-learning curve-fitting

我有三个指数衰减曲线a,b,c:

a = array([650.2120319, 609.6619535, 571.9492203, 536.4599426, 503.3212726,
   472.1334361, 443.0139852, 415.7232848, 390.1294684, 365.9167447,
   343.433587 , 322.1317239, 302.2658523, 283.7633129, 266.2925989,
   249.8895476, 234.6623398, 220.3889574, 206.8540781, 194.1904344,
   182.4447336, 171.3749864, 161.6639733])

b = array([386.859093  , 363.1057122 , 341.013751  , 320.2696555 ,
   300.8559479 , 282.658347  , 265.3412211 , 249.3604781 ,
   234.3815941 , 220.3387028 , 207.1730477 , 194.8310656 ,
   183.2602698 , 172.4127113 , 162.2431877 , 152.7092593 ,
   143.6598195 , 135.2843516 , 127.4347254 , 120.0760134 ,
   113.1775334 , 106.7099584 , 100.6459124 ,  94.92368177,
    89.5520211 ,  84.51545728,  79.79443565,  75.36835286,
    71.21896275,  67.32890953,  63.68192213,  60.26274644,
    56.72601923,  53.73452497,  50.91843661,  48.29522182,
    45.8021524 ,  43.44271232,  41.28436224])

c = array([253.1438049 , 237.5842962 , 223.4726388 , 210.0449322 ,
   197.6531031 , 185.8601106 , 174.9801453 , 165.3012821 ,
   155.7069311 , 146.000609  , 136.8991751 , 128.5749559 ,
   120.6183545 , 113.2631309 , 106.3131019 , 100.3375539 ,
    94.13977619,  88.77665824,  83.61974904,  79.05989667,
    74.63870868,  70.23554633,  66.36631774,  62.99036733,
    59.57308743,  56.37170002,  53.37033682,  50.79469772,
    47.70728605,  44.92402512,  42.6168291 ,  40.18378423,
    38.19254077,  36.03269447,  33.96603301,  32.36296151,
    30.53097086,  28.76291712,  27.14086675,  25.89788202,
    25.21670884,  24.16956037,  23.18960868,  21.91448036,
    20.6066795 ,  19.84840787])

这些曲线我重叠在图中的x轴上

three curves overlaid on x-axis.

我的目标是使三者适合一行以获取封闭式解决方案

Linear Regression Normal equation

首先通过线性拟合(通过自然对数)变换三个曲线的矩阵:

Y = np.concatenate((a,b[:23],c[:23]), axis=1)
Y_log = np.log(Y)

X = np.arange(1, len(Y)+1)

n = len(X)
x_bias = np.ones((n,1))
X = np.reshape(X,(n,1))

x_new = np.append(x_bias,X,axis=1)

x_new_transpose = np.transpose(x_new)
x_new_transpose_dot_x_new = x_new_transpose.dot(x_new)

temp_1 = np.linalg.inv(x_new_transpose_dot_x_new)
temp_2 = x_new_transpose.dot(Y_log)
theta = temp_1.dot(temp_2)

我遇到的问题是,我没有获得三个曲线的单个“最佳”拟合,而是分别获得了每个曲线的拟合,如以下系数所示:

Coefficients :  [[ 6.53802336  6.01193513  5.59246895]
[-0.06344226 -0.06127685 -0.06119578]]

我希望实现图中的蓝色实线所示的线:

best approximation

我在哪里弄错了?

0 个答案:

没有答案