微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何正确确定模型的参数?

如何解决如何正确确定模型的参数?

如何找到模型的参数?

模型是:y = a * log(x + b) + c 我想找到 a,b,c.

当然 xy 是一组数字(假设它是随机的,因为它不是我的整个解决方案)。

我正在考虑使用 numpy.polyfit 函数,但并没有过多考虑要输入哪些参数以及接下来要做什么。

有人能或多或少地告诉我应该怎么做吗?

解决方法

为了讨论寻找模型的参数,您需要某种损失函数(要最小化的函数)。否则你的参数可以是任何东西,你可以说你已经成功找到了模型的参数。

一旦你有了那个损失函数,你就可以使用像梯度下降这样的算法。我建议为此使用 TensorFlow。您首先需要使用 TensorFlow 的操作定义模型(它们几乎拥有一切),以便他们的算法找到如何最小化损失函数。以下是您的操作方法:

import tensorflow as tf

# I need to use Layer to be able to add parameters by hand
class CustomModel(tf.keras.layers.Layer):
    def __init__(self):
        super(CustomModel,self).__init__()
        
        self.b = self.add_weight(name="b",shape=[1],dtype=tf.float32,trainable=True)
        self.c = self.add_weight(name="c",trainable=True)
     
     def call(self,x):
         return tf.math.log(x + self.b) + self.c

model = CustomModel()

然后您可以使用损失函数编译模型并在 (x,y) 对上训练它。

model.compile(loss=SOME_LOSS_FUNCTION,optimizer="adam")
model.fit(x=x,y=y,batch_size=SOME_BATCH_SIZE,epochs=SOME_EPOCHS)

值得一提的是,如果您的问题只是某种形式的回归,您可以将损失设置为 tf.keras.losses.MeanSquaredError()。

在简单情况下可能更好的替代方法是手动计算导数,然后实现它们。这将允许您继续使用 numpy 操作。然而,TensorFlow 可以让您利用 GPU 或 TPU,因此可以说您应该使用它或任何其他流行的 ML 框架。

,

scipy.optimize.curve_fit 正是您所需要的——您将想要拟合的函数、一个自变量向量和一个观测向量传递给它,该函数返回一个观测参数向量和一个协方差矩阵。 enter image description here

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

a0,b0,c0 = 3,2,7
x = np.linspace(0,10,1001)
y0 = a0 * np.log(x+b0) + c0
y1 = y0 + np.random.randn(1001)/5

(a1,b1,c1),cov = curve_fit(lambda x,a,b,c: a*np.log(x+b)+c,x,y1)

fig,(ax1,ax2) = plt.subplots(2,1)
ax1.plot(x,y1,label='Measured')
ax2.plot(x,y0,label='"True",a=%.3f,b=%.3f,c=%.3f'%(a0,c0))
ax2.plot(x,a1*np.log(x+b1)+c1,label='Recovered,c=%.3f'%(a1,c1))
ax1.legend()
ax2.legend()
plt.show()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。