Как рисовать 3D-плоскость с помощью PCA В python?

seong park спросил: 28 марта 2018 в 02:18 в: python
X = np.array([[24,13,38],[8,3,17],[21,6,40],[1,14,-9],[9,3,21],[7,1,14],[8,7,11],[10,16,3],[1,3,2],
    [15,2,30],[4,6,1],[12,10,18],[1,9,-4],[7,3,19],[5,1,13],[1,12,-6],[21,9,34],[8,8,7],
  [1,18,-18],[15,8,25],[16,10,29],[7,0,17],[14,2,31],[3,7,0],[5,6,7]])
pca = PCA(n_components=1)pca.fit(X)
a = pca.components_[0][0] # a
b = pca.components_[0][1] # b
c = pca.components_[0][2] # cdef average(values):
    if(values) ==0:
        return None
    return sum(values, 0.0) / len(values)x_mean = average(x) # For an approximation
y_mean = average(y)
z_mean = average(z)
d = -(a * x_mean + b * y_mean + c * z_mean)

so -0.375978766054x + 0.10612154283y -0.920531469111z + 15.1366572005 = 0

Собственно, я не уверен, что это правильно.

I хотите нарисовать плоскость в этой ситуации, используя библиотеку matplotlib.

Как я могу это кодировать?

1 ответ

Ahmed Fasih ответил: 28 марта 2018 в 11:22

Первый главный компонент не определяет плоскость, он определяет вектор в трех измерениях. Вот как визуализировать его в 3D: код начинается с вашего, а затем имеет этапы построения:

import numpy as np
from sklearn.decomposition import PCAX = np.array([[24, 13, 38], [8, 3, 17], [21, 6, 40], [1, 14, -9], [9, 3, 21], [7, 1, 14],
              [8, 7, 11], [10, 16, 3], [1, 3, 2], [15, 2, 30], [4, 6, 1], [12, 10, 18], [1, 9, -4],
              [7, 3, 19], [5, 1, 13], [1, 12, -6], [21, 9, 34], [8, 8, 7], [1, 18, -18],
              [15, 8, 25], [16, 10, 29], [7, 0, 17], [14, 2, 31], [3, 7, 0], [5, 6, 7]])pca = PCA(n_components=1)
pca.fit(X)## New code below
p = pca.components_
centroid = np.mean(X, 0)
segments = np.arange(-40, 40)[:, np.newaxis] * pimport matplotlib
matplotlib.use('TkAgg') # might not be necessary for you
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
plt.ion()fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
scatterplot = ax.scatter(*(X.T))
lineplot = ax.plot(*(centroid + segments).T, color="red")
plt.xlabel('x')
plt.ylabel('y')
plt.savefig('result.png', dpi=150)

(Обратите внимание, что приведенный выше код был автоматически отформатирован с помощью yapf, который я Настоятельно рекомендуем.) Результирующая цифра: