我有一组数据点对(y,x)
。
我想使用表单
y = c * x * log2(x)
我想找到c的值。
Matlab lsqcurvefit
不适用于此。它似乎停留在当地的最佳状态。
有关如何操作的任何建议吗?
谢谢!
答案 0 :(得分:3)
正如cdbitesky所写,估算c
的最简单方法是计算逐点比率并采用均值:
c_est = mean(y ./ (x .* log2(x)));
另一种方法是使用Matlab的矩阵除法,它执行最小二乘拟合:
c_est = y / (x .* log2(x));
估算c
的最佳方法只有在您了解了数据(如果有的话)与理想方程y = c * x * log2(x)
的偏差时才能得出。您的数据是否被加性噪声或乘法性损坏?这种噪音来自哪里?等
答案 1 :(得分:1)
使用一些权重w[k]
,计算总和
yxlx
超过w[k]*y[k]*x[k]*log2(x[k])
和
xlx2
超过w[k]*sqr(x[k]*log2(x[k]))
,其中sqr(u)=u*u
。
然后c
的估算值为yxlx/xlx2
。
可以选择标准砝码w[k]=1
或调整砝码
w[k]=1/( 1+sqr( x[k]*log2(x[k]) ) )
甚至更适应
w[k]=1/( 1+sqr( x[k]*log2(x[k]) ) +sqr( y[k] ) )
因此x,y的较大值不会过度影响估计值。对于某些中间策略,将这些表达式的平方根作为权重。
数学:这些公式是由估计问题的公式作为加权最小二乘问题得出的
sum[ w(x,y)*(y-c*f(x))^2 ] over (x,y) in Data
扩展为
sum[ w(x,y)*y^2 ]
-2*c* sum[ w(x,y)*y*f(x) ]
+ c^2 * sum[ w(x,y)*f(x)^2 ] over (x,y) in Data
最小值位于
c = sum[ w(x,y)*y*f(x) ] / sum[ w(x,y)*f(x)^2 ]
w(x,y)应该与(x,y)处的误差方差近似相反,所以如果你期望误差的大小一致,那么w(x,y)= 1,如果错误增长与x和y成正比,那么w(x,y)= 1 /(1 + x ^ 2 + y ^ 2)或类似是一个明智的选择。