2016-02-04 1 views
-1

Je souhaite créer un tracé 3D représentant une régression multiple comportant deux variables x. Je veux avoir des points de dispersion pour les données y-variables réelles et aussi un plan qui représente la droite de régression générée par mes deux variables x. Le facteur supplémentaire de complication est que toutes les variables sont représentées par des matrices.Comment créer une diffusion 3D avec un plan?

# Variables 
a # 14x1 matrix representing an x variable 
b # 14x1 matrix representing an x variable 
C# 14x1 matrix representing the y variable 
BETAS # 2x1 matrix holding the beta coefficients of the x variables 
z = (BETAS[0]*a + BETAS[1]*b) # the expected value of c based on our regression 
new_array # variable representing the regression line - used previously to plot the regression line in 2d space` 

# Plot in 3d 
from mpl_toolkits.mplot3d import Axes3D 
fig = plt.figure() 
ax = plt.axes(projection='3d') 
plt.hold(True) 
plt.plot(new_array[0], new_array[1], 'red') 
ax.plot_surface(a, b, z) 
plt.show() 

Merci beaucoup!

+0

Salut et bienvenue à SO. S'il vous plaît regardez comment créer un exemple minimal, complet et vérifiable du code pour votre question: http://stackoverflow.com/help/mcve –

+1

par exemple. Au lieu de commenter ce que contient chaque variable, vous pouvez facilement écrire du code pour définir des données aléatoires: a = np.random.rand (14), etc. Dans ce cas, toute personne répondant à votre question peut copier votre code et vous aider à résoudre le problème –

Répondre

0

Afin de trouver les paramètres de régression, vous pouvez utiliser le normal equation:

enter image description here

Lorsque vous traitez avec n fonctionnalités que vous obtiendrez n + 1 paramètres de régression, donc dans votre cas, vous avez thetas. Le plan peut être représenté par l'équation du plan:

p = theta0 + theta1*p1 +theta2*p2 

Afin de tracer le plan, vous devez créer une grille de maillage de points dans votre espace « caractéristique ». Vous pouvez ensuite utiliser la multiplication matricielle pour trouver les points du plan.

multiple regression plane separating points

Voici le code:

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

m = 14 #size of the matrix 

#randomly generated data 
x1 = np.random.uniform(0,10, (m, 1)); 
x2 = np.random.uniform(0,10, (m, 1)); 

y = np.random.uniform(0,1, (m, 1)); 

#combining of the features into a [m x 3] matrix 
X = np.hstack((x1, x2)) 
X = np.hstack((np.ones((m, 1)), X)) 

#calculating of the theta using the normal equation 
theta = np.dot(np.dot(np.linalg.pinv(np.dot(X.transpose(), X)), X.transpose()), y) 

#plane calculation 
k = 10 #size of the plane 

p1, p2 = np.mgrid[:k, :k] 

P = np.hstack((np.reshape(p1, (k*k, 1)), np.reshape(p2, (k*k, 1)))) 
P = np.hstack((np.ones((k*k, 1)), P)) 

plane = np.reshape(np.dot(P, theta), (k, k)); 

#plotting 
fig = plt.figure() 
ax = fig.gca(projection='3d') 

ax.plot(x1[:,0],x2[:,0],y[:,0],'ro') #scatter plot 
ax.plot_surface(p1,p2,plane) #plane plot 

ax.set_xlabel('x1 label') 
ax.set_ylabel('x2 label') 
ax.set_zlabel('y label') 

plt.show()