首页 > 解决方案 > Python中的正规方程需要改进

问题描述

我是 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 数据结构之外,还有其他工作方式吗?预先感谢您的帮助。

标签: pythonpandasnumpydataframe

解决方案


我举了一些如何使用 numpy 的例子,希望它能回答你的问题。一般来说,对于数值运算,请使用 numpy,而对于更通用的操作(字符串、聚合等),请使用 pandas。一般来说,pandas 适合准备数据并将其传递给更底层的数据结构,例如 numpy 以进行更重的计算

您问 1) 使用哪种数据结构?在 numpy 中查找多维数组

2)如何获得列数?对于 np.array 你只需要使用 .shape,它通常是 (dim1, dim2 .... ) 的元组 (n_rows, cols)

3) 是一维的 np.array,这就是为什么你有这样的形状 (n_rows, ) 所以如果你打印 y 你会看到一个向量......所以你只有一列。np.arrays 一开始可能会令人困惑,因为它允许您创建比向量或矩阵更通用的东西,例如张量,这将是一个形状为 (x, y, z) 的 np.array。所以谈论 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, )



推荐阅读