【问题标题】:Add regression line and ellipse to a 3D scatter plot in Python在 Python 中将回归线和椭圆添加到 3D 散点图
【发布时间】:2019-01-04 17:47:05
【问题描述】:

我有一个 3D 散点图,它显示了一个名为 data 的数据框。 它通常会生成一个可以与单条线或椭圆相匹配的形状。

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import pandas as pd

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

ax.scatter(data['x'], data['y'], data['z'], c=data['c'])

plt.show()

典型示例(抱歉,我无法分享我的数据...):

所以,现在我想计算一个适合这个点云的多元回归。 有很多文章解释了如何将其与平面配合,但我想将其与线配合。

作为奖励,我还想用椭圆来拟合这些点。因此,它将反映标准偏差,并且更加直观。

【问题讨论】:

  • 这可能会有所帮助...stackoverflow.com/questions/24747643/3d-linear-regression 这只是线性回归。但是,您需要了解一些向量代数才能了解发生了什么。对于您的椭圆,也许stackoverflow.com/questions/7272252/… 会有所帮助。简单的谷歌搜索产生了这些。
  • 我的理解是,平面 2D 椭圆的 3D 空间等价物是具有体积的椭圆体。您的意思是拟合包含所有数据点的最小 3D 椭球吗?
  • user1269942 :我应用了您建议的第一种方法,但我真的不明白。它给了我 Theta,一个包含 3 个分量的向量。我猜它可能是该行的组件,但没有起源... a = data[['x', 'y']].values b = np.ones((data['x'].shape [0],1)) X = np.concatenate((b, a), axis=1) Y = np.vstack(data['z'].values) Theta = np.linalg.pinv(X.T.dot(X )).dot(X.T).dot(Y)
  • James Phillips :是的,我想找到一个最适合示例 3 sigma 数据点的椭圆,所以 ~99%。

标签: python linear-regression pca


【解决方案1】:

我找到了第一个问题的答案,即找到一条最适合点云的线。我在 Python 中改编了this post

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

data = pd.DataFrame([[-1, 15, 2], [2, 6, 8], [5, 4, 20], [1, 5, 20], [3, 9, 12]],
                    columns=['x', 'y', 'z'])
ax.scatter(data['x'], data['y'], data['z'], c='blue')

# Linear regression
X = data[['x', 'y', 'z']].values
Xlen = X.shape[0]
avgPointCloud = 1 / Xlen * np.array([np.sum(X[:, 0]), np.sum(X[:, 1]), np.sum(X[:, 2])])
Xmean = X - avgPointCloud

cov = 1 / Xlen * X.T.dot(Xmean)

t = np.arange(-5, 5, 1)
linearReg = avgPointCloud + cov[:, 0] * np.vstack(t)

ax.plot(linearReg[:, 0], linearReg[:, 1], linearReg[:, 2], 'r', label='Linear Regression')
ax.legend()

plt.show()

【讨论】:

    猜你喜欢
    • 2016-11-14
    • 1970-01-01
    • 2017-03-01
    • 2016-11-01
    • 1970-01-01
    • 2015-01-27
    • 2016-02-24
    • 1970-01-01
    • 2014-12-19
    相关资源
    最近更新 更多