在scikit-learn

时间:2019-04-26 05:32:18

标签: python scikit-learn

我想将单个变量的以下功能适合数据: 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)?

0 个答案:

没有答案