【问题标题】:How to do two-dimensional regression analysis in Python?如何在 Python 中进行二维回归分析?
【发布时间】:2018-04-09 20:54:33
【问题描述】:

首先,我对 Python 不熟悉,对 Python 代码的机制我还勉强了解。但是我需要通过 Python 做一些统计分析。

我尝试了很多方法来弄清楚,但我失败了。

  • 基本上,我有 3 个数据数组(假设这些数组是 XYZ)。
  • 我对 (X, Y) 和 (Z, Y) 进行了一些分析,制作了散点图并与数据进行了最佳拟合以查看相关性。
  • №1 和 №2 很简单。
  • 现在我需要从图表中查看边缘,该边缘是XZ 的组合。所以,我做了方程式(见下文)。

import pylab as pl
import numpy as np
from pylab import *
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt


s = np.loadtxt('New_list3.txt')
s = s.T

x = s[1]
y = s[2]
z = s[4]

upper_error = s[5]
lower_error = s[6]
asymmetric_error = [lower_error, upper_error]

def func(X, a1, a2, a3):
    x1, y1 = X

    return a1 * x1 + a2 * y1 + a3

popt, pcov = curve_fit(func,(x,y),z)
new_x=func((x,y),popt[0],popt[1],0)
new_y=z
new_z = np.polyfit(new_x,new_y,1)

p = np.poly1d(new_z)

plt.plot(func((x, y), popt[0], popt[1], 0), z, '.k')
pl.plot(new_x, p(new_x), "r-")
plt.errorbar(new_x, z ,yerr=asymmetric_error, ecolor='b', capsize=3, marker ='o', fmt='none')

print popt    
plt.show()

现在我无法从y = a1 * x + a2 * z + a3 的公式中找出错误。我找到了a1a2a3 的最佳值。但是,不是错误。

如何找到a1a2a3 的“错误”?

【问题讨论】:

  • 您应该使用scipyscikit-learn 构建线性回归。
  • @E.Z.非常感谢您的评论。你能用我的代码举一些例子吗?那会很开心。
  • @E.Z.,感谢您编辑问题。小题外话:对于标题,Stack Overflow 上的主流风格倾向于句子而不是标题。

标签: python plot regression linear-regression


【解决方案1】:

这是使用 scipy.optimize.curve_fit 拟合曲面的示例 Python 代码,它制作了原始数据的 3D 散点图、错误的 3D 散点图、曲面图和等高线图。将其更改为使用您自己的数据和函数,您应该完成了。

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)')

【讨论】:

  • 非常感谢您的帮助。它似乎也很有帮助,但是,我需要从 x,z 组合的方程中得到错误。
  • 这就是我的示例代码计算并绘制错误的原因。
  • 谢谢詹姆斯!实际上,我刚开始学习 python,所以我可能需要很长时间才能理解您的代码。有什么可能的方法来获取错误?或者你能修改一下我的代码吗?如果你能做到,我猜你可以救我的命。非常感谢你
  • 我的例子中倒数第二行代码计算错误,它是“absError = zData - EquationFunc((xData,yData), *popt)”
猜你喜欢
  • 2018-11-28
  • 1970-01-01
  • 1970-01-01
  • 2014-02-14
  • 2013-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多