2 различные затраты в многомерной линейной регрессии из-за Numpy - PullRequest
0 голосов
/ 14 апреля 2020

Я начал свое путешествие по ML, пройдя курс машинного обучения Эндрю Нга на Coursera, и попытался реализовать многомерную линейную регрессию, используя Python. Тем не менее, я сталкиваюсь с большими проблемами при разборе данных и преобразовании их в правильный рабочий массив Numpy. Кажется, что существует так много Numpy функций, которые выполняют обработку данных одного и того же типа, что трудно понять, какая функция что делает. Основная причина этого заключается в том, что это влияет на алгоритм, который я запускаю.

Когда я реализую код, используя np.matrix() для преобразования данных в матрицу Numpy, я получаю функцию Cost, равную 2064911681,6185248 . Я получаю ту же функцию стоимости, когда использую np.values вместо np.matrix(). Однако каждое python решение этой проблемы в сети получает функцию стоимости 2105448288.629247 , используя np.newaxis для X и Y. Всякий раз, когда я пытаюсь использовать np.newaxis, я получаю Type Error высказывание Key is Invalid.

Мой вопрос: почему разный анализ данных дает разные функции стоимости, даже если форма данных такая, какой я хочу? Я предоставил свой код ниже. Существует ли единый эффективный и правильный способ преобразования данных в Numpy массивы?

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 

#Load the data

data = pd.read_csv("ex1data2.txt", header=None, names=["Size", "No. of Bedrooms","Price"])
print(data.head(),"\n")

#Initialize columns and size of dataset
cols = data.shape[1]
m = data.shape[0]
theta = np.matrix(np.zeros(cols))
ones = np.ones((m,1))

#Initializing Parameters
alpha = 0.01
iters = 400
cost_list = np.zeros(iters)

#Setting X and Y
X = np.matrix(data.iloc[:,:cols-1])
Y = np.matrix(data.iloc[:,cols-1:])

#Feature Scaling and Adding Ones to X
X = (X - np.mean(X)) / np.std(X)
X = np.hstack((ones, X))

print(f"X Shape: {X.shape} \nY Shape: {Y.shape} \nTheta Shape: {theta.shape} \n")

#Defining Algorithms
def hypothesis(X, theta):
    h = np.dot(X, theta.T)
    return h

def cost_function(X, Y, theta, m):
    squared_error = np.power((hypothesis(X, theta) - Y) , 2)
    J = np.sum(squared_error) / (2*m)
    return J

def gradient_descent(X, Y, theta, m, alpha, iters):
    for i in range(iters):
        error = hypothesis(X, theta) - Y
        temp = np.dot(error.T, X)
        theta = theta - ((alpha/m) * temp)
        cost_list[i] = cost_function(X, Y, theta, m)

    return theta, cost_list

#Printing Initial and Final Values
print(f"Inital Theta = {theta}")
print(f"Inital Cost = {cost_function(X, Y, theta, m)}")

new_theta, cost_list = gradient_descent(X, Y, theta, m, alpha, iters)

print(f"Final Theta = {new_theta}")
print(f"Final Cost = {cost_function(X, Y, new_theta, m)}")

#Plotting Cost vs Iterations
plt.plot(cost_list, color="Red", label="Cost")
plt.xlabel("Iterations")
plt.ylabel("Cost")
plt.title("Cost vs Iterations")
plt.legend()
plt.show()
...