我想将单个变量的以下功能适合数据: f(x)= Cx ^(-2)
,C是未知参数。我确实知道底层真实数据具有这种功能形式。
但是,数据中有许多异常值,因此我想使用RANSAC来很好地拟合异常值。问题是我不知道如何在sklearn中定义要与RANSAC配合使用的功能。
我尝试使用PolynomialFeatures进行操作,从某种意义上说,它可以很好地拟合数据,但是可以为数据提供不同的功能: g(x)= A + Bx + Cx ^ 2
我的拟合g(x)的例子:
import matplotlib.pyplot as plt
import numpy as np
from sklearn.linear_model import RANSACRegressor
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import PolynomialFeatures
def g_like(x, C, noise, n_outliers):
y = C*x**2
rnd = np.random.RandomState(123456)
error = noise*rnd.randn(x.size)
outliers = rnd.randint(0, x.size, n_outliers)
error[outliers] *= 50.
return y + error
C_true = 8.6
noise = 1e3
x_min = 120.
x_max = 190.
x_t = np.linspace(x_min, x_max, 30)
y_t = g_like(x_t, C_true, noise, 4)
poly = PolynomialFeatures(2)
ransac = RANSACRegressor()
model = make_pipeline(poly, ransac)
model.fit(x_t[:, np.newaxis], y_t)
x_pred = np.linspace(x_min, x_max)
y_pred = model.predict(x_pred[:, np.newaxis])
print ransac.estimator_.coef_
print ransac.estimator_.intercept_
plt.plot(x_t, y_t, 'bo')
plt.plot(x_pred, y_pred, linewidth=3)
该代码看起来很合适,并且输出的值确实不错。但是,我不适合我感兴趣的模型。
有没有一种方法只能拟合二次项,而不能拟合其他项,即g(x)= Cx ^ 2?换句话说,强制A和B都为零,同时允许C变化。
有没有一种方法可以适应我的实际需求,即f(x)= Cx ^(-2)?