2017-10-05 4 views
1

J'ai écrit un code débutant pour calculer les coefficients d'un modèle linéaire simple en utilisant l'équation normale.Implémentation d'équations normales en Python/Numpy

# Modules 
import numpy as np 

# Loading data set 
X, y = np.loadtxt('ex1data3.txt', delimiter=',', unpack=True) 

data = np.genfromtxt('ex1data3.txt', delimiter=',') 

def normalEquation(X, y): 
    m = int(np.size(data[:, 1])) 

    # This is the feature/parameter (2x2) vector that will 
    # contain my minimized values 
    theta = [] 

    # I create a bias_vector to add to my newly created X vector 
    bias_vector = np.ones((m, 1)) 

    # I need to reshape my original X(m,) vector so that I can 
    # manipulate it with my bias_vector; they need to share the same 
    # dimensions. 
    X = np.reshape(X, (m, 1)) 

    # I combine these two vectors together to get a (m, 2) matrix 
    X = np.append(bias_vector, X, axis=1) 

    # Normal Equation: 
    # theta = inv(X^T * X) * X^T * y 

    # For convenience I create a new, tranposed X matrix 
    X_transpose = np.transpose(X) 

    # Calculating theta 
    theta = np.linalg.inv(X_transpose.dot(X)) 
    theta = theta.dot(X_transpose) 
    theta = theta.dot(y) 

    return theta 

p = normalEquation(X, y) 

print(p) 

Utilisation du petit ensemble de données trouvées ici:

http://www.lauradhamilton.com/tutorial-linear-regression-with-octave

-je obtenir les coefficients: [-0,34390603; 0.2124426] en utilisant le code ci-dessus à la place de: [24.9660; 3.3058]. Quelqu'un pourrait-il aider à clarifier où je vais mal?

+0

vous avez votre X et Y autour de la mauvaise façon de l'exemple! Si je les inverse, j'obtiens les réponses que vous suggérez – jeremycg

Répondre

1

Votre implémentation est correcte. Vous n'avez échangé que X et y (regardez de près comment ils définissent x et y), c'est pourquoi vous obtenez un résultat différent. L'appel normalEquation(y, X) donne [ 24.96601443 3.30576144] comme il se doit.

+0

Oh, la honte! Merci à vous deux pour vos réponses. – PS94

+1

Merci pour le conseil @Maxim – PS94

0

Vous pouvez mettre en œuvre l'équation normale comme ci-dessous:

import numpy as np 

X = 2 * np.random.rand(100, 1) 
y = 4 + 3 * X + np.random.randn(100, 1) 

X_b = np.c_[np.ones((100, 1)), X] # add x0 = 1 to each instance 
theta_best = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y) 

X_new = np.array([[0], [2]]) 
X_new_b = np.c_[np.ones((2, 1)), X_new] # add x0 = 1 to each instance 
y_predict = X_new_b.dot(theta_best) 
y_predict 
+0

Vous pouvez également utiliser ['add_constant'] (http://www.statsmodels.org/dev/generated/statsmodels.tools.tools.add_constant.html) pour cela. –