Python—Numpy学习之【转置T函数】、【点积dot函数】、【调换顺序tranpose函数】、【轴调换 swapaxes函数】、【modf函数】

本文介绍了Python Numpy库中的一些关键操作,包括T函数用于矩阵转置,dot函数执行点积运算,transpose函数通过指定顺序调整矩阵轴,swapaxes函数交换轴的顺序,以及modf函数如何分离浮点数的小数和整数部分。通过实例详细解释了这些函数的工作原理和应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. T函数
功能:转置

2. dot函数
功能:两个矩阵进行**“点积”运算**
在这里插入图片描述

3. tanspose函数
transpose英文意思为调换顺序,理解起来有一点麻烦,但是明白了以后就很简单了。
以三维矩阵为例,三维矩阵有(x,y,z)三个维度,对应到每个数据上都有它特定的位置(0,1,2),如果输入:arr.transpose(2,1,0),就是将(x,y,z)→(z,y,x),即每个数据(0,1,2)→(2,1,0)。 在这里插入图片描述
以12所处的位置为例,在arr中位于arr[1,1,0],而经过(0,1,2)→(2,1,0)的调换,在arr3中应该位于arr3[0,1,1],经过验证,是这样的
在这里插入图片描述
备注:原来的arr是(2,2,4)矩阵,经过arr.transpose(2,1,0)运算后 ,确实也变成了(4,2,2)矩阵

4. swapaxes函数

<think>嗯,我现在需要帮用户完成这段Python代码中的lr函数。用户的问题是关于线性回归的,使用正规方程来求参数theta,然后计算均方误差。让我仔细看一下代码结构。 首先,函数的参数部分有问题。参数注释里x_train是训练集,但x_test被注释为训练集标签,这明显是错的。正确的参数应该是x_train(训练集特征)、y_train(训练集标签)、x_test(测试集特征)、y_test(测试集标签)。但用户提供的代码中的参数顺序是x_train, x_test, y_train, y_test,这看起来不对。比如,函数定义中的参数顺序是x_train, x_test, y_train, y_test,而注释里把x_test说成训练集标签,这应该是用户的注释错误。正确的参数应该是x_train,y_train是训练集的特征和标签,x_test,y_test是测试集的特征和标签。但用户定义的参数顺序可能有问题,可能应该把y_train和x_test的位置调换。但根据用户给出的函数定义,参数顺序是x_train, x_test, y_train, y_test,这似乎不正确。比如,通常train_test_split返回的是x_train, x_test, y_train, y_test,所以调用lr的时候参数应该是x_train, x_test, y_train, y_test?或者用户在函数定义时的参数顺序写反了? 这时候需要看函数内部的实现。用户可能在调用函数的时候,传入的参数顺序是否正确?比如,在main函数中,调用lr的参数是x_train, x_test, y_train, y_test。所以函数lr的参数应该是x_train是训练特征,x_test是测试特征,y_train是训练标签,y_test是测试标签。这可能不符合常规命名,但用户可能这样定义了。所以,在函数内部,我们需要用x_train和y_train来训练模型,然后用x_test做预测,和y_test计算MSE。 那现在函数的参数是否正确?比如,x_train是训练集特征,x_test是测试集特征,y_train是训练标签,y_test是测试标签。所以函数定义里的参数顺序可能有误,但用户已经这样写了,所以只能在函数内部处理。 接下来,函数需要实现正规方程。正规方程的公式是theta = (X^T X)^{-1} X^T y。所以,在代码中,需要给x_train添加一列全1,代表截距项。因为线性回归通常会有w0,即y = w0 + w1x1 + ...。所以,X矩阵需要添加一列1。 所以,首先在x_train的左侧添加一列1,组成新的X矩阵。例如,如果x_train是n行1列的数组,那么添加一列后变成n行2列,第一列全1,第二列是原始特征。这一步可以通过numpy的hstack或者insert函数实现。 然后,计算theta。正规方程需要计算X的转置乘X,再求逆,然后乘X的转置,再乘y。具体来说,theta = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y_train)。但要注意,这里是否要考虑数值稳定性,比如使用伪逆np.linalg.pinv可能更好,但题目要求使用正规方程,所以应该直接用公式。 得到theta后,预测测试集的结果。同样,测试集x_test也需要添加一列1。然后,y_pred = x_test_added.dot(theta)。然后计算预测值和y_test的均方误差。 均方误差的计算是MSE = (1/m) * sum((y_pred - y_test)^2),其中m是样本数量。可以用np.mean((y_pred - y_test)**2)来实现。 现在,问题在于用户提供的参数顺序是否正确。例如,lr函数的参数是x_train(训练特征),x_test(测试特征),y_train(训练标签),y_test(测试标签)。所以在代码中,应该用x_train和y_train来训练模型,然后用x_test预测,与y_test比较。 那现在具体步骤: 1. 给x_train添加一列全1,得到X矩阵。 可以用np.hstack([np.ones((x_train.shape[0],1)), x_train])或者np.c_。 例如:X = np.c_[np.ones((x_train.shape[0], 1)), x_train] 2. 计算theta = (X^T X)^{-1} X^T y_train 这里需要注意矩阵的形状,确保维度正确。例如,如果y_train是一维数组,可能需要reshape成列向量。 3. 给x_test添加一列全1,得到X_test矩阵。 X_test = np.c_[np.ones((x_test.shape[0],1)), x_test] 4. 预测y_pred = X_test.dot(theta) 5. 计算MSE:mse = np.mean((y_pred - y_test)**2) 现在,可能的错误包括没有添加偏置项(截距项),或者在计算theta时矩阵形状的问题。比如,如果x_train是二维数组(假设样本数为m,特征数为1),那么添加一列之后,X的shape是(m,2)。y_train如果是形状(m,),那么当计算X.T.dot(y_train)的时候,可能需要确保维度正确。或者,可能需要将y_train转换为列向量,比如y_train.reshape(-1,1),但根据numpy的广播机制,可能不需要。 例如,假设y_train是形状(m,)的一维数组,那么X.T是(2,m),X.T.dot(X)是(2,2),然后求逆。接着X.T.dot(y_train)是(2,)的形状。那么theta的形状是(2,)的数组。当进行X_test的矩阵乘法时,X_test的shape是(n,2),theta的shape是(2,),相乘的结果是(n,)的数组,即每个样本的预测值。 这样是否正确?是的,这样没问题。 那具体到代码中: 补全代码部分: 在lr函数中: 步骤1:添加一列到x_train和x_test。 在代码中: 首先,x_train的形状可能是一个二维数组,比如形状是(m,1),所以添加一列后的X矩阵形状是(m,2)。然后计算theta。 代码: X_train = np.hstack([np.ones((x_train.shape[0],1)), x_train]) theta = np.linalg.inv(X_train.T.dot(X_train)).dot(X_train.T).dot(y_train) 然后,处理测试数据: X_test = np.hstack([np.ones((x_test.shape[0],1)), x_test]) y_pred = X_test.dot(theta) 然后计算mse: mse = np.mean((y_pred - y_test)**2) 所以将这些步骤填入代码中。 但用户给的函数参数中的参数名可能有误。例如,函数定义中的参数顺序是x_train, x_test, y_train, y_test。而正确的顺序应该是x_train, y_train, x_test, y_test。比如,在常规情况下,函数lr的参数应该是训练特征、训练标签、测试特征、测试标签。但用户这里的参数顺序是x_train,x_test,y_train,y_test。这明显有问题,因为第二个参数是x_test,而第三个是y_train,这顺序应该是x_train,y_train,x_test,y_test才对。否则的话,比如调用函数时传入的是x_train, x_test, y_train, y_test,那函数内部的x_test其实是测试集特征,y_train是训练标签。但此时,x_test参数在函数内部被作为第二个参数,而函数内的变量名是x_test,而对应的训练标签是y_train。这似乎正确,但参数命名可能存在混淆。例如,函数的参数顺序可能应该是x_train, y_train, x_test, y_test,但用户给定的参数顺序是x_train, x_test, y_train, y_test。这可能是个错误,但用户可能在调用时已经正确传入参数顺序? 比如,在main函数中: x_train, x_test, y_train, y_test = train_test_split(X, Y) 所以,用户调用lr时是lr(x_train, x_test, y_train, y_test)。但函数定义中的参数顺序是x_train, x_test, y_train, y_test。也就是说,函数内部参数x_test是测试集特征,y_train是训练标签,y_test是测试标签。所以,这在函数内部是正确的。因此,代码中的参数是正确的。 所以,在函数内部,x_train是训练特征,y_train是训练标签,x_test是测试特征,y_test是测试标签。因此,代码中的处理是正确的。 综上,正确的代码补全部分应该是: 在lr函数内部: X_train = np.c_[np.ones((x_train.shape[0], 1)), x_train] theta = np.linalg.inv(X_train.T.dot(X_train)).dot(X_train.T).dot(y_train) X_test = np.c_[np.ones((x_test.shape[0], 1)), x_test] y_pred = X_test.dot(theta) mse = np.mean((y_pred - y_test)**2) return mse 这样应该就能正确计算均方误差了。 但需要注意,当x_train和x_test是二维数组时,比如形状为(m,1)和(n,1),那么添加一列后变成(m,2)和(n,2)。theta的形状应该是(2,),所以当进行X_test.dot(theta)时,结果是每个样本的预测值。 另外,当计算逆矩阵的时候,如果X.T.dot(X)是奇异矩阵(不可逆),会报错。但在实际应用中,可能数据不会出现这种情况。题目中的测试数据是用make_regression生成的,应该不会有这个问题。 所以,这样的代码应该能正确运行,并得到预期的均方误差。</think>要完成线性回归模型的均方误差计算,需按以下步骤操作: --- ### **步骤解析** 1. **添加偏置项**:在训练集和测试集的特征矩阵中添加一列全1,用于捕捉截距项。 2. **计算参数 theta**:通过正规方程 $\theta = (X^T X)^{-1} X^T y$ 求得最优参数。 3. **预测测试集结果**:使用训练得到的 $\theta$ 对测试集进行预测。 4. **计算均方误差 (MSE)**:比较预测值与真实值的平方误差均值。 --- ### **代码实现** ```python def lr(x_train, x_test, y_train, y_test): # 添加偏置项到训练集和测试集 X_train = np.hstack([np.ones((x_train.shape[0], 1)), x_train]) X_test = np.hstack([np.ones((x_test.shape[0], 1)), x_test]) # 使用正规方程计算 theta theta = np.linalg.inv(X_train.T.dot(X_train)).dot(X_train.T).dot(y_train) # 预测测试集结果 y_pred = X_test.dot(theta) # 计算均方误差 mse = np.mean((y_pred - y_test) ** 2) return mse ``` --- ### **关键代码解释** 1. **添加偏置项**: - 使用 `np.hstack` 在特征矩阵左侧拼接一列全1,将原始特征扩展为 $[1, x]$。 - 例如:若 `x_train` 形状为 $(m,1)$,则扩展后为 $(m,2)$。 2. **正规方程计算**: - 公式 $\theta = (X^T X)^{-1} X^T y$ 通过矩阵运算实现。 - `np.linalg.inv` 计算矩阵的逆,确保 $X^T X$ 可逆(由 `make_regression` 生成的数据通常满足)。 3. **预测与 MSE 计算**: - 测试集同样添加偏置项后,与 $\theta$ 相乘得到预测值。 - 均方误差公式 $MSE = \frac{1}{n}\sum_{i=1}^n (y_{\text{pred}}^{(i)} - y_{\text{test}}^{(i)})^2$ 通过 `np.mean` 实现。 --- ### **运行结果验证** 调用 `lr` 函数后,输出的均方误差应与预期值 `2.009383142644778` 接近(允许浮数计算误差)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值