多维数据的统计回归
Statistical regression on multi-dimensional data
我有一组 (x, y, z)
格式的数据,其中 z
是一些涉及 x
和 y
的公式的输出。我想找出公式是什么,我的互联网研究表明统计回归是实现此目的的方法。
但是,我在研究时发现的所有示例都只处理二维数据集 (x, y)
,这对我的情况没有用。上述例子似乎也没有提供一种方法来查看结果公式是什么,它们只是提供了一个函数,用于根据不在训练数据集中的数据预测未来的输出。
所需的精度水平是 z
的公式需要产生实际值 +/- 0.5 以内的结果。
谁能告诉我如何做我想做的事?请注意,我并不是要就要使用的软件库提出具体建议。
如果公式是线性函数,请查看此 tutorial。它使用 普通最小二乘法 来拟合您的数据,这是非常强大的。
假设你有数据点 (x1, y1, z1), (x2, y2, z2), ..., (xn, yn, zn),将它们转换成三个独立的 numpy 数组 X, Y 和Z.
import numpy as np
X = np.array([x1, x2, ..., xn])
Y = np.array([y1, y2, ..., yn])
Z = np.array([z1, z2, ..., zn])
然后,用ols
装起来!
import pandas
from statsmodels.formula.api import ols
# Your data.
# Z = a*X + b*Y + c
data = pandas.DataFrame({'x': X, 'y': Y, 'z': Z})
# Fit your data with ols model.
model = ols("Z ~ X + Y", data).fit()
# Get your model summary.
print(model.summary())
# Get your model parameters.
print(model._results.params)
# should be approximately array([c, a, b])
如果提供更多变量
在 DataFrame
中添加任意多的变量。
# Your data.
data = pandas.DataFrame({'v1': V1, 'v2': V2, 'v3': V3, 'v4': V4, 'z': Z})
参考
您需要使用的最基本的工具是多元线性回归。基本方法将 z 建模为 x 和 y 的线性函数,在它们之上添加高斯噪声 e:f(x,y) = a1*x + a2*y + a3 然后将 z 生成为 f(x, y) + e,其中 e 通常是方差未知的零均值高斯分布。您需要找到系数 a1、a2 和偏差 a3,它们通常使用最大似然估计,然后归结为高斯假设下的普通最小二乘法。它具有封闭式解析解。
既然您可以访问 Python,请查看 scikit-learn 中的线性回归:
http://scikit-learn.org/stable/modules/linear_model.html#ordinary-least-squares
如果您可以重用 GitHub 上现有的 Python 3 tkinter GUI 应用程序的代码,请看一下使用我的 tkInterFit 项目拟合您提到的线性多项式曲面方程 - 它会还创建拟合曲面和等高线图。 GitHub 源代码位于 https://github.com/zunzun/tkInterFit,具有 BSD 许可证。
我有一组 (x, y, z)
格式的数据,其中 z
是一些涉及 x
和 y
的公式的输出。我想找出公式是什么,我的互联网研究表明统计回归是实现此目的的方法。
但是,我在研究时发现的所有示例都只处理二维数据集 (x, y)
,这对我的情况没有用。上述例子似乎也没有提供一种方法来查看结果公式是什么,它们只是提供了一个函数,用于根据不在训练数据集中的数据预测未来的输出。
所需的精度水平是 z
的公式需要产生实际值 +/- 0.5 以内的结果。
谁能告诉我如何做我想做的事?请注意,我并不是要就要使用的软件库提出具体建议。
如果公式是线性函数,请查看此 tutorial。它使用 普通最小二乘法 来拟合您的数据,这是非常强大的。
假设你有数据点 (x1, y1, z1), (x2, y2, z2), ..., (xn, yn, zn),将它们转换成三个独立的 numpy 数组 X, Y 和Z.
import numpy as np
X = np.array([x1, x2, ..., xn])
Y = np.array([y1, y2, ..., yn])
Z = np.array([z1, z2, ..., zn])
然后,用ols
装起来!
import pandas
from statsmodels.formula.api import ols
# Your data.
# Z = a*X + b*Y + c
data = pandas.DataFrame({'x': X, 'y': Y, 'z': Z})
# Fit your data with ols model.
model = ols("Z ~ X + Y", data).fit()
# Get your model summary.
print(model.summary())
# Get your model parameters.
print(model._results.params)
# should be approximately array([c, a, b])
如果提供更多变量
在 DataFrame
中添加任意多的变量。
# Your data.
data = pandas.DataFrame({'v1': V1, 'v2': V2, 'v3': V3, 'v4': V4, 'z': Z})
参考
您需要使用的最基本的工具是多元线性回归。基本方法将 z 建模为 x 和 y 的线性函数,在它们之上添加高斯噪声 e:f(x,y) = a1*x + a2*y + a3 然后将 z 生成为 f(x, y) + e,其中 e 通常是方差未知的零均值高斯分布。您需要找到系数 a1、a2 和偏差 a3,它们通常使用最大似然估计,然后归结为高斯假设下的普通最小二乘法。它具有封闭式解析解。
既然您可以访问 Python,请查看 scikit-learn 中的线性回归: http://scikit-learn.org/stable/modules/linear_model.html#ordinary-least-squares
如果您可以重用 GitHub 上现有的 Python 3 tkinter GUI 应用程序的代码,请看一下使用我的 tkInterFit 项目拟合您提到的线性多项式曲面方程 - 它会还创建拟合曲面和等高线图。 GitHub 源代码位于 https://github.com/zunzun/tkInterFit,具有 BSD 许可证。