Я начал свое путешествие по 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()