Нормальное уравнение в Python Требуется улучшение - PullRequest
1 голос
/ 04 апреля 2020

Я новичок в Python и хотел бы написать код для нормального уравнения. Код следующий, пожалуйста, предоставьте некоторые предложения и отзывы о кодировании. Спасибо!

def norm_equ(x, y):
    x_input = pd.DataFrame(x)
    x_input = (x_input - x_input.mean())/x_input.std()
    x_0 = np.ones((len(x_input), 1))
    x_new = np.hstack((x_0, x_input))
    temp1 = np.linalg.pinv(np.dot(np.transpose(x_new), x_new))
    temp2 = np.dot(temp1, np.transpose(x_new))
    theta = np.dot(temp2, y)
    return theta

Мой вопрос о том, как добавить $ X_0 $ в данные? Есть ли другой способ работы, кроме структуры данных data.frame? Спасибо заранее за вашу помощь.

Ответы [ 2 ]

2 голосов
/ 04 апреля 2020

Я привожу несколько примеров того, как использовать numpy, надеюсь, он ответит на ваши вопросы. Как правило, для числовых операций go для numpy и для более общих c операций (строки, агрегирование и т. Д. c) go для pandas. В целом pandas подходит для подготовки данных и передачи их в структуру данных более низкого уровня, такую ​​как numpy, в более сложные вычисления

, которые вы спросили 1), какую структуру данных использовать? go для многомерных массивов в numpy

2) как получить количество столбцов? для np.array вам просто нужно использовать .shape, если это кортеж (dim1, dim2 ....), обычно (n_rows, cols)

3) это np.array 1-го измерения, вот почему у вас есть такая форма (n_rows,), поэтому, если вы напечатаете y, вы увидите вектор ... так что у вас будет только один столбец. Вначале np.arrays может сбить с толку, потому что позволяет вам создавать вещи более обобщенные c, чем векторные или матрицы, такие как тензоры, которые будут np.array формы (x, y, z). Поэтому имеет смысл говорить о столбцах для np.arrays of shape (n_rows, n_cols)

4) если столбец std () равен 0, все экземпляры одинаковы, поэтому в принципе нет смысла применять это нормализация в графе единиц. (просто пропустите это)

Более подробно. Обычно цель стандартизации ваших столбцов состоит в том, чтобы значения в этих столбцах попадали в диапазон значений. То есть между 0 и 1. Это делается в машинном обучении, например, чтобы избежать того, что столбец (функция) ваших обучающих данных, которые имеют большие значения, повлияет больше на модель, чем на другие с меньшими значениями. Вы можете заметить, что применяемая нормализация не заставляет столбцы находиться в [0, 1]. поэтому нормализация, которая вынудит это сделать и не даст ошибку деления, как и другая нормализация (если max и min = 0) будет:

x_raw = (x_raw - x_raw.min())/(x_raw.max() - x_raw.min())
print(x_raw)
import numpy as np
def norm_equ(x, y):
    temp1 = np.linalg.pinv(np.dot(np.transpose(x), x))
    temp2 = np.dot(temp1, np.transpose(x))
    theta = np.dot(temp2, y)
    return theta

# create a matrix 50x10 random matrix
x_raw = np.random.random([50,10])
y = np.random.random([50])
print(x_raw.shape) #-----> (50, 10)
print(y.shape) #-----> (50, ) a vec "50 x 1"

# transform raw input
x_norm = (x_raw - x_raw.mean())/x_raw.std()
x_0 = np.ones((x_norm.shape[0],1))
x_input = np.hstack((x_0, x_norm))
print(x_input.shape) #-----> (51, 11)
theta = norm_equ(x_input, y)
print(theta.shape) #-----> (11, ) 

# load from csv file
arrays_from_file = np.loadtxt(fname="dummy.csv",
                              delimiter=",",
                              skiprows=1)
y = np.random.random([arrays_from_file.shape[0]])
print(arrays_from_file.shape) #-----> (2, 6)
print(y.shape) #-----> (2, )
another_theta = norm_equ(arrays_from_file, y)
print(another_theta.shape) #-----> (6, )


1 голос
/ 04 апреля 2020

Почему вы конвертируете x в DataFrame? Похоже, это должен быть массив numpy с учетом остальной части кода.

Если вам нужен фрейм данных с тремя столбцами, то это будет

df = pd.DataFrame({'x_input': x, 'x_0': 1})
df['x_input_norm'] = df['x_input'] - df['x_input'].mean() / df['x_input'].std()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...