我正在分析算法在对输入变量的小扰动下的性能。我包含了一些 python 代码来帮助使我的问题更具体,但原则上这是一个关于回归分析中变量转换的问题。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from numpy.polynomial.polynomial import polyfit
from scipy.optimize import curve_fit
df = pd.read_csv("https://tinyurl.com/qulhd3w")
x = df.eps
y = df.dist
plt.loglog(x, y, 'x', label='Distance to Solution')
# Try for example, a linear model
func = lambda t, alpha, beta: alpha * t + beta
popt, pcov = curve_fit(func, x, y)
poly = np.poly1d(popt)
yfit = lambda x: poly(x)
plt.plot(x, yfit(x))
plt.show()
我的 x 变量似乎有一个对数分布,我的 y 变量也是如此。loglog 图中的关联似乎有点 sigmoid,但对于我的大部分域来说是线性的,所以我想我会从尝试添加线性回归线开始。
我意识到数据相当嘈杂,所以我天真地尝试从仅对均值执行回归开始。
means = df.groupby('eps').mean()
[x, y] = [means.index, means.dist]
plt.loglog(x, y)
func = lambda t, a, b, c, d: a * t**3 + b * t**2 + c * t + d
popt, pcov = curve_fit(func, 10**x, 10**y)
poly = np.poly1d(popt)
yfit = lambda x: np.log10(poly(10**x))
plt.plot(x, yfit(x))
结果对于指数变换线性回归也不是很好。回归似乎对接近 0 的值不够敏感。我应该尝试加权最小二乘之类的方法吗?
为了在这个日志空间中执行回归,我需要如何转换我的变量?我试图通过采取和使它们近似线性,但没有得到很好的结果。理想情况下,我可能想要拟合类似逻辑趋势模型的东西,这可以通过将“func”行替换为
func = lambda t, alpha, beta, gamma: alpha / (1 + beta * np.exp(-gamma * t))