如何在Python中进行二维回归分析?
首先,我不熟悉Python,我仍然几乎不了解Python代码的机制。但是我需要通过Python做一些统计分析 我试过很多方法想弄明白,但我失败了如何在Python中进行二维回归分析?,python,plot,regression,linear-regression,Python,Plot,Regression,Linear Regression,首先,我不熟悉Python,我仍然几乎不了解Python代码的机制。但是我需要通过Python做一些统计分析 我试过很多方法想弄明白,但我失败了 基本上,我有3个数据数组(假设这些数组是X,Y,Z) 我用(X,Y)和(Z,Y)做了一些分析,制作散点图,并与数据进行最佳拟合以查看相关性 №1及№2.这很容易 现在我需要从图中看到视图上的边,这是一个结合了X和Z的边。所以,我做了一个等式(见下文) 现在我无法从方程中找出误差,它是y=a1*x+a2*z+a3。我找到了a1、a2、a3的最佳值。
- 基本上,我有3个数据数组(假设这些数组是
,X
,Y
)Z
- 我用(
,X
)和(Y
,Z
)做了一些分析,制作散点图,并与数据进行最佳拟合以查看相关性李>Y
- №1及№2.这很容易
- 现在我需要从图中看到视图上的边,这是一个结合了
和X
的边。所以,我做了一个等式(见下文)Z
现在我无法从方程中找出误差,它是
y=a1*x+a2*z+a3
。我找到了a1
、a2
、a3
的最佳值。然而,并不是错误
如何找到
a1
、a2
、a3
的“错误”?下面是一个示例Python代码,它使用scipy.optimize.curve\u拟合曲面,并生成原始数据的三维散点图、错误的三维散点图、曲面图和等高线图。将此更改为使用您自己的数据和函数,您应该这样做
import numpy, scipy
import scipy.optimize
import matplotlib
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm # to colormap 3D surfaces from blue to red
import matplotlib.pyplot as plt
graphWidth = 800 # units are pixels
graphHeight = 600 # units are pixels
# 3D contour plot lines
numberOfContourLines = 16
def SurfacePlot(equationFunc, data, params):
f = plt.figure(figsize=(graphWidth/100.0, graphHeight/100.0), dpi=100)
matplotlib.pyplot.grid(True)
axes = Axes3D(f)
x_data = data[0]
y_data = data[1]
z_data = data[2]
xModel = numpy.linspace(min(x_data), max(x_data), 20)
yModel = numpy.linspace(min(y_data), max(y_data), 20)
X, Y = numpy.meshgrid(xModel, yModel)
Z = equationFunc(numpy.array([X, Y]), *params)
axes.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.coolwarm, linewidth=1, antialiased=True)
axes.scatter(x_data, y_data, z_data) # show data along with plotted surface
axes.set_title('Surface Plot (click-drag with mouse)') # add a title for surface plot
axes.set_xlabel('X Data') # X axis data label
axes.set_ylabel('Y Data') # Y axis data label
axes.set_zlabel('Z Data') # Z axis data label
plt.show()
plt.close('all') # clean up after using pyplot or else thaere can be memory and process problems
def ContourPlot(equationFunc, data, params):
f = plt.figure(figsize=(graphWidth/100.0, graphHeight/100.0), dpi=100)
axes = f.add_subplot(111)
x_data = data[0]
y_data = data[1]
z_data = data[2]
xModel = numpy.linspace(min(x_data), max(x_data), 20)
yModel = numpy.linspace(min(y_data), max(y_data), 20)
X, Y = numpy.meshgrid(xModel, yModel)
Z = equationFunc(numpy.array([X, Y]), *params)
axes.plot(x_data, y_data, 'o')
axes.set_title('Contour Plot') # add a title for contour plot
axes.set_xlabel('X Data') # X axis data label
axes.set_ylabel('Y Data') # Y axis data label
CS = matplotlib.pyplot.contour(X, Y, Z, numberOfContourLines, colors='k')
matplotlib.pyplot.clabel(CS, inline=1, fontsize=10) # labels for contours
plt.show()
plt.close('all') # clean up after using pyplot or else thaere can be memory and process problems
def ScatterPlot(data, title):
f = plt.figure(figsize=(graphWidth/100.0, graphHeight/100.0), dpi=100)
matplotlib.pyplot.grid(True)
axes = Axes3D(f)
x_data = data[0]
y_data = data[1]
z_data = data[2]
axes.scatter(x_data, y_data, z_data, depthshade=False, color='k')
axes.set_title(title)
axes.set_xlabel('X Data')
axes.set_ylabel('Y Data')
axes.set_zlabel('Z Data')
plt.show()
plt.close('all') # clean up after using pyplot or else thaere can be memory and process problems
def EquationFunc(data, *params):
p0 = params[0]
p1 = params[1]
return p0 + numpy.sqrt(data[0]) + numpy.cos(data[1] / p1)
if __name__ == "__main__":
# raw data
xData = numpy.array([1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0])
yData = numpy.array([11.0, 12.1, 13.0, 14.1, 15.0, 16.1, 17.0, 18.1, 90.0])
zData = numpy.array([1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.0, 9.9])
pInitial = (1.0, 1.0)
popt, pcov = scipy.optimize.curve_fit(EquationFunc,(xData,yData),zData, p0=pInitial)
dataForPlotting = [xData, yData, zData]
ScatterPlot([xData, yData, zData], 'Data Scatter Plot (click-drag with mouse)')
SurfacePlot(EquationFunc, [xData, yData, zData], popt)
ContourPlot(EquationFunc, [xData, yData, zData], popt)
absError = zData - EquationFunc((xData,yData), *popt)
ScatterPlot([xData, yData, absError], 'Error Scatter Plot (click-drag with mouse)')
您应该使用或建立线性回归。@E.Z.非常感谢您的评论。你能举例说明我的代码吗?那太好了。@E.Z.,谢谢你编辑这个问题。小旁白:对于标题,堆栈溢出的流行样式倾向于句子大小写而不是标题大小写。非常感谢您的帮助。这似乎也很有帮助,但是,我需要从x,z组合的方程中得到误差。这就是为什么我的示例代码计算并绘制误差。谢谢James!实际上,我刚刚开始学习python,所以我可能需要很长时间才能理解您的代码。有没有可能得到错误的方法?或者你能修改一下我的代码吗?如果你能这么做,我想你可以救我的命。非常感谢,在我的示例中,下一行代码计算错误,它是“absError=zData-equalationfunc((扩展数据,yData),*popt)”
import numpy, scipy
import scipy.optimize
import matplotlib
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm # to colormap 3D surfaces from blue to red
import matplotlib.pyplot as plt
graphWidth = 800 # units are pixels
graphHeight = 600 # units are pixels
# 3D contour plot lines
numberOfContourLines = 16
def SurfacePlot(equationFunc, data, params):
f = plt.figure(figsize=(graphWidth/100.0, graphHeight/100.0), dpi=100)
matplotlib.pyplot.grid(True)
axes = Axes3D(f)
x_data = data[0]
y_data = data[1]
z_data = data[2]
xModel = numpy.linspace(min(x_data), max(x_data), 20)
yModel = numpy.linspace(min(y_data), max(y_data), 20)
X, Y = numpy.meshgrid(xModel, yModel)
Z = equationFunc(numpy.array([X, Y]), *params)
axes.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.coolwarm, linewidth=1, antialiased=True)
axes.scatter(x_data, y_data, z_data) # show data along with plotted surface
axes.set_title('Surface Plot (click-drag with mouse)') # add a title for surface plot
axes.set_xlabel('X Data') # X axis data label
axes.set_ylabel('Y Data') # Y axis data label
axes.set_zlabel('Z Data') # Z axis data label
plt.show()
plt.close('all') # clean up after using pyplot or else thaere can be memory and process problems
def ContourPlot(equationFunc, data, params):
f = plt.figure(figsize=(graphWidth/100.0, graphHeight/100.0), dpi=100)
axes = f.add_subplot(111)
x_data = data[0]
y_data = data[1]
z_data = data[2]
xModel = numpy.linspace(min(x_data), max(x_data), 20)
yModel = numpy.linspace(min(y_data), max(y_data), 20)
X, Y = numpy.meshgrid(xModel, yModel)
Z = equationFunc(numpy.array([X, Y]), *params)
axes.plot(x_data, y_data, 'o')
axes.set_title('Contour Plot') # add a title for contour plot
axes.set_xlabel('X Data') # X axis data label
axes.set_ylabel('Y Data') # Y axis data label
CS = matplotlib.pyplot.contour(X, Y, Z, numberOfContourLines, colors='k')
matplotlib.pyplot.clabel(CS, inline=1, fontsize=10) # labels for contours
plt.show()
plt.close('all') # clean up after using pyplot or else thaere can be memory and process problems
def ScatterPlot(data, title):
f = plt.figure(figsize=(graphWidth/100.0, graphHeight/100.0), dpi=100)
matplotlib.pyplot.grid(True)
axes = Axes3D(f)
x_data = data[0]
y_data = data[1]
z_data = data[2]
axes.scatter(x_data, y_data, z_data, depthshade=False, color='k')
axes.set_title(title)
axes.set_xlabel('X Data')
axes.set_ylabel('Y Data')
axes.set_zlabel('Z Data')
plt.show()
plt.close('all') # clean up after using pyplot or else thaere can be memory and process problems
def EquationFunc(data, *params):
p0 = params[0]
p1 = params[1]
return p0 + numpy.sqrt(data[0]) + numpy.cos(data[1] / p1)
if __name__ == "__main__":
# raw data
xData = numpy.array([1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0])
yData = numpy.array([11.0, 12.1, 13.0, 14.1, 15.0, 16.1, 17.0, 18.1, 90.0])
zData = numpy.array([1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.0, 9.9])
pInitial = (1.0, 1.0)
popt, pcov = scipy.optimize.curve_fit(EquationFunc,(xData,yData),zData, p0=pInitial)
dataForPlotting = [xData, yData, zData]
ScatterPlot([xData, yData, zData], 'Data Scatter Plot (click-drag with mouse)')
SurfacePlot(EquationFunc, [xData, yData, zData], popt)
ContourPlot(EquationFunc, [xData, yData, zData], popt)
absError = zData - EquationFunc((xData,yData), *popt)
ScatterPlot([xData, yData, absError], 'Error Scatter Plot (click-drag with mouse)')