pandas将numpy.float转化为的百分比数据类型

时间: 2023-08-13 15:05:02 浏览: 102
在pandas中,可以使用 `pd.Series` 的 `map()` 方法将 `numpy.float` 类型的数据转换为百分比数据类型。具体实现如下: ```python import pandas as pd import numpy as np # 创建一个包含numpy.float类型数据的Series data = pd.Series([0.1, 0.25, 0.5, 0.75, 1.0], name='float_data') # 使用map()方法将numpy.float类型数据转换为百分比数据类型,并设置精度为2位小数 percent_data = data.map(lambda x: '{:.2%}'.format(x)) print(type(percent_data)) print(percent_data) ``` 输出结果如下: ``` <class 'pandas.core.series.Series'> 0 10.00% 1 25.00% 2 50.00% 3 75.00% 4 100.00% Name: float_data, dtype: object ``` 其中,`map()` 方法接受一个函数作为参数,该函数用于将每个元素从 `numpy.float` 类型转换为字符串类型。在上面的例子中,我们使用了一个 lambda 表达式来实现这个功能,并调用了 Python 字符串的 `format()` 方法来设置字符串的格式。最后,`map()` 方法返回一个新的 `Series` 对象,其中的元素类型为字符串。

相关推荐

以下是BP网络模块的代码,保存为bp_network.py: python import numpy as np import pandas as pd class BPNetwork: def __init__(self, input_size, hidden_size, output_size): self.input_size = input_size self.hidden_size = hidden_size self.output_size = output_size self.W1 = np.random.randn(self.input_size, self.hidden_size) / np.sqrt(self.input_size) self.b1 = np.zeros((1, self.hidden_size)) self.W2 = np.random.randn(self.hidden_size, self.output_size) / np.sqrt(self.hidden_size) self.b2 = np.zeros((1, self.output_size)) def sigmoid(self, x): return 1 / (1 + np.exp(-x)) def sigmoid_derivative(self, x): return x * (1 - x) def forward(self, X): self.z1 = np.dot(X, self.W1) + self.b1 self.a1 = self.sigmoid(self.z1) self.z2 = np.dot(self.a1, self.W2) + self.b2 y = self.z2 return y def backward(self, X, y, y_pred, learning_rate): delta3 = y_pred - y dW2 = np.dot(self.a1.T, delta3) db2 = np.sum(delta3, axis=0, keepdims=True) delta2 = np.dot(delta3, self.W2.T) * self.sigmoid_derivative(self.a1) dW1 = np.dot(X.T, delta2) db1 = np.sum(delta2, axis=0) self.W1 -= learning_rate * dW1 self.b1 -= learning_rate * db1 self.W2 -= learning_rate * dW2 self.b2 -= learning_rate * db2 def train(self, X, y, learning_rate=0.1, epochs=1000): for i in range(epochs): y_pred = self.forward(X) self.backward(X, y, y_pred, learning_rate) def predict(self, X): y_pred = self.forward(X) return y_pred def save_weights(self, filename): np.savez(filename, W1=self.W1, b1=self.b1, W2=self.W2, b2=self.b2) def load_weights(self, filename): weights = np.load(filename) self.W1 = weights['W1'] self.b1 = weights['b1'] self.W2 = weights['W2'] self.b2 = weights['b2'] 以下是主函数模块的代码,保存为main.py: python import numpy as np import pandas as pd from bp_network import BPNetwork from sklearn.preprocessing import StandardScaler from sklearn.metrics import r2_score, mean_absolute_error, mean_squared_error # 读取训练集和测试集数据 train_df = pd.read_excel('data.xlsx', nrows=3000) test_df = pd.read_excel('data.xlsx', skiprows=range(1, 3001)) # 分离输入和输出 X_train = train_df.iloc[:, :-1].values.astype(float) y_train = train_df.iloc[:, -1].values.astype(float) X_test = test_df.iloc[:, :-1].values.astype(float) y_test = test_df.iloc[:, -1].values.astype(float) # 数据标准化 scaler = StandardScaler() X_train = scaler.fit_transform(X_train) X_test = scaler.transform(X_test) # 创建BP网络模型 input_size = X_train.shape[1] hidden_size = 8 output_size = 1 bpnn = BPNetwork(input_size, hidden_size, output_size) # 训练模型 bpnn.train(X_train, y_train, learning_rate=0.1, epochs=1000) # 保存模型权重 bpnn.save_weights('model.npz') # 加载模型权重 bpnn.load_weights('model.npz') # 预测测试集结果 y_pred = bpnn.predict(X_test) # 反标准化处理 y_test = scaler.inverse_transform(y_test) y_pred = scaler.inverse_transform(y_pred) # 计算R2、MAE、MSE和相对误差平均百分比 r2 = r2_score(y_test, y_pred) mae = mean_absolute_error(y_test, y_pred) mse = mean_squared_error(y_test, y_pred) error = np.mean(np.abs((y_test - y_pred) / y_test)) * 100 print(f'R2 score: {r2:.3f}') print(f'MAE: {mae:.3f}') print(f'MSE: {mse:.3f}') print(f'Relative error: {error:.3f}%') # 绘制测试集的拟合图 import matplotlib.pyplot as plt plt.plot(y_test, label='true') plt.plot(y_pred, label='pred') plt.legend() plt.show() # 输出各输入的权重 for i, w in enumerate(bpnn.W1.T): print(f'Weight for feature {i+1}: {w}') 在运行main.py时,会输出R2、MAE、MSE和相对误差平均百分比等信息,并绘制测试集的拟合图。同时,还会输出各输入的权重。最后,模型的权重会保存到model.npz文件中。
为了实现上述需求,我们可以按照以下步骤进行: 1. 安装依赖库 2. 准备数据 3. 创建BP网络 4. 训练BP网络 5. 保存BP网络模型 6. 测试BP网络 7. 计算MAE、MSE和相对误差平均百分比 8. 绘制R2图和折线图 下面是具体的代码实现: ## 1. 安装依赖库 我们需要安装以下依赖库: pip install numpy pandas matplotlib sklearn xlrd ## 2. 准备数据 我们需要从Excel文件中读取训练集和测试集数据,然后进行归一化处理。 python import pandas as pd from sklearn.preprocessing import MinMaxScaler # 读取训练集和测试集数据 train_data = pd.read_excel('data.xlsx', nrows=3000) test_data = pd.read_excel('data.xlsx', skiprows=range(1, 3001)) # 对数据进行归一化处理 scaler = MinMaxScaler() train_data = scaler.fit_transform(train_data) test_data = scaler.transform(test_data) ## 3. 创建BP网络 我们需要创建一个具有8个输入、1个输出和1个隐藏层的BP网络,并使用Xavier初始化、L2正则化和MSGD优化器。 python import numpy as np class NeuralNetwork: def __init__(self, input_size, hidden_size, output_size): self.input_size = input_size self.hidden_size = hidden_size self.output_size = output_size # 初始化权重和偏置 self.W1 = np.random.randn(self.input_size, self.hidden_size) * np.sqrt(1.0 / self.input_size) self.b1 = np.zeros((1, self.hidden_size)) self.W2 = np.random.randn(self.hidden_size, self.output_size) * np.sqrt(1.0 / self.hidden_size) self.b2 = np.zeros((1, self.output_size)) # 设置L2正则化参数 self.reg_lambda = 0.01 def sigmoid(self, x): return 1.0 / (1.0 + np.exp(-x)) def sigmoid_prime(self, x): return self.sigmoid(x) * (1 - self.sigmoid(x)) def forward(self, X): # 前向传播 self.z1 = np.dot(X, self.W1) + self.b1 self.a1 = self.sigmoid(self.z1) self.z2 = np.dot(self.a1, self.W2) + self.b2 self.y_hat = self.z2 return self.y_hat def backward(self, X, y, y_hat): # 反向传播 delta3 = y_hat - y delta2 = np.dot(delta3, self.W2.T) * self.sigmoid_prime(self.z1) dW2 = np.dot(self.a1.T, delta3) + self.reg_lambda * self.W2 db2 = np.sum(delta3, axis=0, keepdims=True) dW1 = np.dot(X.T, delta2) + self.reg_lambda * self.W1 db1 = np.sum(delta2, axis=0) return dW1, db1, dW2, db2 def update_parameters(self, dW1, db1, dW2, db2, learning_rate): # 更新权重和偏置 self.W1 -= learning_rate * dW1 self.b1 -= learning_rate * db1 self.W2 -= learning_rate * dW2 self.b2 -= learning_rate * db2 def train(self, X, y, num_epochs, learning_rate): for epoch in range(num_epochs): # 前向传播 y_hat = self.forward(X) # 计算损失函数 loss = np.mean(np.square(y_hat - y)) reg_loss = 0.5 * self.reg_lambda * (np.sum(np.square(self.W1)) + np.sum(np.square(self.W2))) total_loss = loss + reg_loss # 反向传播 dW1, db1, dW2, db2 = self.backward(X, y, y_hat) # 更新权重和偏置 self.update_parameters(dW1, db1, dW2, db2, learning_rate) # 打印损失函数值 if epoch % 100 == 0: print("Epoch ", epoch, " loss: ", total_loss) def predict(self, X): # 预测输出 y_hat = self.forward(X) return y_hat def get_weights(self): # 获取权重 return self.W1, self.W2 ## 4. 训练BP网络 我们需要使用训练集数据训练BP网络,并打印出训练过程中的损失函数值。 python # 创建BP网络 nn = NeuralNetwork(8, 5, 1) # 设置训练参数 num_epochs = 1000 learning_rate = 0.01 # 训练BP网络 X_train = train_data[:, :-1] y_train = train_data[:, -1:] nn.train(X_train, y_train, num_epochs, learning_rate) ## 5. 保存BP网络模型 我们可以将训练后的BP网络模型保存为一个文件,以便之后使用。 python import pickle # 保存BP网络模型 with open('model.pkl', 'wb') as f: pickle.dump(nn, f) ## 6. 测试BP网络 我们可以使用测试集数据来测试训练好的BP网络,并打印出预测结果。 python # 加载BP网络模型 with open('model.pkl', 'rb') as f: nn = pickle.load(f) # 测试BP网络 X_test = test_data[:, :-1] y_test = test_data[:, -1:] y_hat = nn.predict(X_test) # 打印预测结果 print("Predictions: ", y_hat) ## 7. 计算MAE、MSE和相对误差平均百分比 我们可以使用sklearn库来计算MAE、MSE和相对误差平均百分比。 python from sklearn.metrics import mean_absolute_error, mean_squared_error # 计算MAE和MSE mae = mean_absolute_error(y_test, y_hat) mse = mean_squared_error(y_test, y_hat) print("MAE: ", mae) print("MSE: ", mse) # 计算相对误差平均百分比 mean_error = np.mean(np.abs(y_test - y_hat) / y_test) * 100 print("Mean Error: ", mean_error, "%") ## 8. 绘制R2图和折线图 我们可以使用matplotlib库来绘制R2图和折线图。 python import matplotlib.pyplot as plt from sklearn.metrics import r2_score # 计算R2值 r2 = r2_score(y_test, y_hat) print("R2 Score: ", r2) # 绘制折线图 plt.plot(y_test, label="Actual") plt.plot(y_hat, label="Predicted") plt.legend() plt.show() # 绘制R2图 fig, ax = plt.subplots() ax.scatter(y_test, y_hat, edgecolors=(0, 0, 0)) ax.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'k--', lw=4) ax.set_xlabel('Actual') ax.set_ylabel('Predicted') ax.set_title("R2 Score: " + str(r2)) plt.show()
很高兴回答您的问题。这是一个比较复杂的问题,需要涉及到许多知识点,我会尽可能详细地给出代码和注释。首先,我们需要安装一些必要的库,包括pandas,numpy和openpyxl,可以使用以下命令进行安装: python !pip install pandas numpy openpyxl 接下来,我们分为两个模块进行编写,第一个是BP网络模块,我们将其命名为bp_network.py。代码如下: python import numpy as np import pandas as pd class BPNetwork: def __init__(self, input_size, hidden_size, output_size, learning_rate, reg_lambda, momentum): """ 初始化网络参数,并进行归一化和Xavier初始化 :param input_size: 输入层大小 :param hidden_size: 隐藏层大小 :param output_size: 输出层大小 :param learning_rate: 学习率 :param reg_lambda: 正则化项系数 :param momentum: 动量因子 """ self.input_size = input_size self.hidden_size = hidden_size self.output_size = output_size self.learning_rate = learning_rate self.reg_lambda = reg_lambda self.momentum = momentum # 初始化权重和偏置 self.W1 = np.random.randn(self.input_size, self.hidden_size) * np.sqrt(2.0 / (self.input_size + self.hidden_size)) # Xavier初始化 self.b1 = np.zeros((1, self.hidden_size)) self.W2 = np.random.randn(self.hidden_size, self.output_size) * np.sqrt(2.0 / (self.hidden_size + self.output_size)) # Xavier初始化 self.b2 = np.zeros((1, self.output_size)) # 初始化动量参数 self.v_W1 = np.zeros((self.input_size, self.hidden_size)) self.v_b1 = np.zeros((1, self.hidden_size)) self.v_W2 = np.zeros((self.hidden_size, self.output_size)) self.v_b2 = np.zeros((1, self.output_size)) def sigmoid(self, x): """ sigmoid激活函数 """ return 1 / (1 + np.exp(-x)) def sigmoid_derivative(self, x): """ sigmoid激活函数的导数 """ return x * (1 - x) def forward(self, X): """ 前向传播 """ self.z1 = np.dot(X, self.W1) + self.b1 self.a1 = self.sigmoid(self.z1) self.z2 = np.dot(self.a1, self.W2) + self.b2 self.y_hat = self.z2 return self.y_hat def backward(self, X, y, y_hat): """ 反向传播 """ # 计算输出层误差 delta2 = y_hat - y # 计算隐藏层误差 delta1 = np.dot(delta2, self.W2.T) * self.sigmoid_derivative(self.a1) # 计算输出层权重和偏置的梯度 dW2 = np.dot(self.a1.T, delta2) + self.reg_lambda * self.W2 db2 = np.sum(delta2, axis=0, keepdims=True) # 计算隐藏层权重和偏置的梯度 dW1 = np.dot(X.T, delta1) + self.reg_lambda * self.W1 db1 = np.sum(delta1, axis=0) # 更新权重和偏置 self.v_W2 = self.momentum * self.v_W2 - self.learning_rate * dW2 self.v_b2 = self.momentum * self.v_b2 - self.learning_rate * db2 self.W2 += self.v_W2 self.b2 += self.v_b2 self.v_W1 = self.momentum * self.v_W1 - self.learning_rate * dW1 self.v_b1 = self.momentum * self.v_b1 - self.learning_rate * db1 self.W1 += self.v_W1 self.b1 += self.v_b1 def train(self, X_train, y_train, X_test, y_test, epochs): """ 训练网络 """ train_loss = [] test_loss = [] for i in range(epochs): # 前向传播 y_hat_train = self.forward(X_train) y_hat_test = self.forward(X_test) # 计算训练集和测试集的损失 train_loss.append(np.mean(np.square(y_train - y_hat_train))) test_loss.append(np.mean(np.square(y_test - y_hat_test))) # 反向传播 self.backward(X_train, y_train, y_hat_train) # 输出每100个epoch的损失 if i % 100 == 0: print("Epoch: {}, train_loss: {:.4f}, test_loss: {:.4f}".format(i, train_loss[i], test_loss[i])) # 输出每个输入的权重 print("Weights of input features:") for i in range(self.input_size): print("Feature {}: {}".format(i+1, self.W1[i])) # 返回训练集和测试集的损失 return train_loss, test_loss def predict(self, X): """ 预测 """ return self.forward(X) 上面的代码定义了一个BP网络类,包括初始化参数、sigmoid激活函数、前向传播、反向传播、训练和预测方法。其中,前向传播和反向传播分别计算输出和隐藏层的输出,以及权重和偏置的梯度,并进行更新。训练方法使用了动量的梯度下降法进行优化。在训练完成后,我们可以输出每个输入的权重,用于分析各个输入对输出的影响。 接下来,我们编写主函数模块,命名为main.py。代码如下: python import numpy as np import pandas as pd from bp_network import BPNetwork # 读取训练集和测试集数据 train_data = pd.read_excel('data.xlsx', nrows=3000) test_data = pd.read_excel('data.xlsx', skiprows=range(1, 3000), nrows=40) # 将数据转换为numpy数组,并进行归一化 X_train = train_data.iloc[:, :-1].values y_train = train_data.iloc[:, -1:].values X_mean = np.mean(X_train, axis=0) X_std = np.std(X_train, axis=0) X_train = (X_train - X_mean) / X_std y_mean = np.mean(y_train, axis=0) y_std = np.std(y_train, axis=0) y_train = (y_train - y_mean) / y_std X_test = test_data.iloc[:, :-1].values y_test = test_data.iloc[:, -1:].values X_test = (X_test - X_mean) / X_std y_test = (y_test - y_mean) / y_std # 创建BP网络模型 model = BPNetwork(input_size=8, hidden_size=16, output_size=1, learning_rate=0.01, reg_lambda=0.01, momentum=0.9) # 训练模型 train_loss, test_loss = model.train(X_train, y_train, X_test, y_test, epochs=1000) # 预测测试集并进行反归一化 y_pred = model.predict(X_test) y_pred = y_pred * y_std + y_mean y_test = y_test * y_std + y_mean # 计算MAE和MSE mae = np.mean(np.abs(y_pred - y_test)) mse = np.mean(np.square(y_pred - y_test)) print("MAE: {:.4f}, MSE: {:.4f}".format(mae, mse)) # 计算预测值和真实值之间的相对误差平均百分比 error = np.abs((y_pred - y_test) / y_test) mean_error = np.mean(error) * 100 print("Mean relative error: {:.2f}%".format(mean_error)) # 绘制R2图 import matplotlib.pyplot as plt from sklearn.metrics import r2_score r2 = r2_score(y_test, y_pred) plt.scatter(y_test, y_pred) plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'k--', lw=4) plt.xlabel('Actual') plt.ylabel('Predicted') plt.title('R2: {:.4f}'.format(r2)) plt.show() # 绘制测试集的各输入对应的实际输出和预测输出的拟合折线图 fig, ax = plt.subplots(figsize=(10, 6)) for i in range(X_test.shape[1]): ax.plot(X_test[:, i], y_test, 'o', label='Actual') ax.plot(X_test[:, i], y_pred, 'x', label='Predicted') ax.set_xlabel('Feature {}'.format(i+1)) ax.set_ylabel('Output') ax.set_title('Input Feature {} vs Output'.format(i+1)) ax.legend() plt.show() # 将训练后的模型保存为文件 import pickle with open('model.pkl', 'wb') as f: pickle.dump(model, f) 上面的代码首先读取了训练集和测试集数据,并进行了归一化处理。接着,我们使用BPNetwork类创建了一个BP网络模型,并进行了训练。训练完成后,我们使用模型对测试集进行了预测,并进行了反归一化处理。然后,我们计算了MAE和MSE,并输出了预测值和真实值之间的相对误差平均百分比。接着,我们绘制了R2图和测试集的各输入对应的实际输出和预测输出的拟合折线图。最后,我们将训练后的模型保存为文件,以便以后使用。 综上所述,我们完成了一个使用归一化、Xavier初始化、正则化方法和MSGD的BP网络,并使用训练集和测试集进行了训练和测试,并且能够输出各输入的权重。我们还实现了将训练后的模型保存为文件,绘制R2图,计算MAE和MSE,并输出预测值和真实值之间的相对误差平均百分比,以及绘制测试集的各输入对应的实际输出和预测输出的拟合折线图。
非常感谢您的提问,由于您提问的内容比较复杂,需要涉及到多个模块的编写,因此我将分步骤给出实现方法: ## 第一步:创建BP网络模型 ### 1.1 安装必要的库 我们需要安装一些必要的库,包括numpy、pandas、openpyxl等。可以使用以下命令来安装: pip install numpy pandas openpyxl ### 1.2 导入相关库 python import numpy as np import pandas as pd from openpyxl import load_workbook ### 1.3 定义BP网络类 我们需要定义一个BP网络类,用来存储网络结构、训练参数以及前向传播、反向传播等方法。具体代码如下: python class BPNN: def __init__(self, input_size, hidden_size, output_size): self.input_size = input_size # 输入层节点数 self.hidden_size = hidden_size # 隐藏层节点数 self.output_size = output_size # 输出层节点数 self.learning_rate = 0.01 # 学习率 self.regularization_rate = 0.01 # 正则化系数 self.epoch = 1000 # 迭代次数 self.batch_size = 32 # 批次大小 self.hidden_weights = np.random.normal(0, np.sqrt(2 / (input_size + hidden_size)), (input_size, hidden_size)) # 隐藏层权重 self.output_weights = np.random.normal(0, np.sqrt(2 / (hidden_size + output_size)), (hidden_size, output_size)) # 输出层权重 self.hidden_bias = np.zeros((1, hidden_size)) # 隐藏层偏置项 self.output_bias = np.zeros((1, output_size)) # 输出层偏置项 def relu(self, x): """定义ReLU激活函数""" return np.maximum(x, 0) def relu_derivative(self, x): """定义ReLU激活函数的导数""" return np.where(x > 0, 1, 0) def sigmoid(self, x): """定义Sigmoid激活函数""" return 1 / (1 + np.exp(-x)) def sigmoid_derivative(self, x): """定义Sigmoid激活函数的导数""" return self.sigmoid(x) * (1 - self.sigmoid(x)) def forward(self, X): """前向传播""" z1 = np.dot(X, self.hidden_weights) + self.hidden_bias a1 = self.relu(z1) z2 = np.dot(a1, self.output_weights) + self.output_bias y_pred = self.sigmoid(z2) return y_pred, a1 def backward(self, X, y_true, y_pred, a1): """反向传播""" delta2 = (y_pred - y_true) * self.sigmoid_derivative(y_pred) delta1 = np.dot(delta2, self.output_weights.T) * self.relu_derivative(a1) d_output_weights = np.dot(a1.T, delta2) / X.shape[0] + self.regularization_rate * self.output_weights d_hidden_weights = np.dot(X.T, delta1) / X.shape[0] + self.regularization_rate * self.hidden_weights d_output_bias = np.sum(delta2, axis=0, keepdims=True) / X.shape[0] d_hidden_bias = np.sum(delta1, axis=0, keepdims=True) / X.shape[0] return d_hidden_weights, d_output_weights, d_hidden_bias, d_output_bias def fit(self, X, y): """训练模型""" for i in range(self.epoch): batch_loss = [] for j in range(0, X.shape[0], self.batch_size): X_batch = X[j:j + self.batch_size] y_batch = y[j:j + self.batch_size] y_pred, a1 = self.forward(X_batch) loss = -np.mean(y_batch * np.log(y_pred) + (1 - y_batch) * np.log(1 - y_pred)) + \ (self.regularization_rate / (2 * X.shape[0])) * (np.sum(self.hidden_weights ** 2) + np.sum( self.output_weights ** 2)) batch_loss.append(loss) d_hidden_weights, d_output_weights, d_hidden_bias, d_output_bias = self.backward(X_batch, y_batch, y_pred, a1) self.hidden_weights -= self.learning_rate * d_hidden_weights self.output_weights -= self.learning_rate * d_output_weights self.hidden_bias -= self.learning_rate * d_hidden_bias self.output_bias -= self.learning_rate * d_output_bias print('Epoch:{}, Loss:{}'.format(i, np.mean(batch_loss))) ## 第二步:创建主函数 ### 2.1 导入相关库 python import numpy as np import pandas as pd from openpyxl import load_workbook from bpnn import BPNN # 导入BP网络模型 ### 2.2 加载数据 我们需要将数据从xlsx表格中读取出来,然后分成训练集和测试集。具体代码如下: python # 加载数据 workbook = load_workbook('data.xlsx') sheet = workbook.active data = np.array([[cell.value for cell in row] for row in sheet.rows]) X = data[:3000, :-1].astype(float) # 训练集输入 y = data[:3000, -1:].astype(float) # 训练集输出 X_test = data[3000:, :-1].astype(float) # 测试集输入 y_test = data[3000:, -1:].astype(float) # 测试集输出 ### 2.3 创建BP网络模型并训练 python # 创建BP网络模型并训练 model = BPNN(input_size=8, hidden_size=8, output_size=1) model.fit(X, y) ### 2.4 保存BP网络模型 python # 保存BP网络模型 np.save('model.npy', [model.hidden_weights, model.output_weights, model.hidden_bias, model.output_bias]) ### 2.5 加载BP网络模型并预测 python # 加载BP网络模型并预测 model_params = np.load('model.npy', allow_pickle=True) model.hidden_weights, model.output_weights, model.hidden_bias, model.output_bias = model_params y_pred, _ = model.forward(X_test) ### 2.6 输出各输入的权重 python # 输出各输入的权重 for i in range(model.input_size): print('Input {}:'.format(i + 1)) print(' Hidden weights:', model.hidden_weights[i]) print(' Output weights:', model.output_weights[:, 0]) ### 2.7 计算评价指标 python # 计算评价指标 mae = np.mean(np.abs(y_test - y_pred)) mse = np.mean((y_test - y_pred) ** 2) rpe = np.mean(np.abs((y_test - y_pred) / y_test)) * 100 r2 = 1 - mse / np.var(y_test) print('MAE:', mae) print('MSE:', mse) print('RPE:', rpe) print('R2:', r2) ### 2.8 绘制拟合图和折线图 python import matplotlib.pyplot as plt # 绘制拟合图 plt.scatter(y_test, y_pred) plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'k--', lw=2) plt.xlabel('True Values') plt.ylabel('Predictions') plt.show() # 绘制折线图 for i in range(X_test.shape[1]): plt.plot(X_test[:, i], y_test, 'b-', label='True') plt.plot(X_test[:, i], y_pred, 'r-', label='Predicted') plt.xlabel('Input {}'.format(i + 1)) plt.ylabel('Output') plt.legend() plt.show() 希望这些代码可以帮助您完成任务。
为了实现你的需求,我们需要创建两个模块:一个是BP网络的模块,另一个是主函数模块。下面是BP网络模块的代码(命名为bp_network.py): python import numpy as np import pandas as pd class BPNetwork: def __init__(self, input_dim, hidden_dim, output_dim): """ 初始化BP网络 :param input_dim: 输入层维数 :param hidden_dim: 隐藏层维数 :param output_dim: 输出层维数 """ # 初始化权重和偏置 self.w1 = np.random.randn(input_dim, hidden_dim) * np.sqrt(2 / (input_dim + hidden_dim)) # Xavier初始化 self.b1 = np.zeros(hidden_dim) self.w2 = np.random.randn(hidden_dim, output_dim) * np.sqrt(2 / (hidden_dim + output_dim)) # Xavier初始化 self.b2 = np.zeros(output_dim) def sigmoid(self, x): """ 激活函数:sigmoid """ return 1 / (1 + np.exp(-x)) def sigmoid_deriv(self, x): """ 激活函数sigmoid的导数 """ return self.sigmoid(x) * (1 - self.sigmoid(x)) def l2_regularization(self, lambd, w1, w2): """ L2正则化 """ return (lambd/2) * (np.sum(w1**2) + np.sum(w2**2)) def forward(self, X): """ 前向传播 :param X: 输入数据 """ self.z1 = np.dot(X, self.w1) + self.b1 # 第一层线性加权和 self.a1 = self.sigmoid(self.z1) # 第一层激活输出 self.z2 = np.dot(self.a1, self.w2) + self.b2 # 第二层线性加权和 self.a2 = self.sigmoid(self.z2) # 第二层激活输出 return self.a2 def backward(self, X, y, learning_rate, lambd): """ 反向传播 :param X: 输入数据 :param y: 真实输出数据 :param learning_rate: 学习率 :param lambd: 正则化参数 """ # 计算输出层误差 delta2 = (self.a2 - y) * self.sigmoid_deriv(self.z2) # 计算输出层权重和偏置的梯度 dw2 = np.dot(self.a1.T, delta2) + lambd * self.w2 db2 = np.sum(delta2, axis=0) # 计算隐藏层误差 delta1 = np.dot(delta2, self.w2.T) * self.sigmoid_deriv(self.z1) # 计算隐藏层权重和偏置的梯度 dw1 = np.dot(X.T, delta1) + lambd * self.w1 db1 = np.sum(delta1, axis=0) # 更新权重和偏置 self.w1 -= learning_rate * dw1 self.b1 -= learning_rate * db1 self.w2 -= learning_rate * dw2 self.b2 -= learning_rate * db2 def train(self, X_train, y_train, X_val, y_val, epochs, learning_rate, lambd): """ 训练BP网络 :param X_train: 训练数据 :param y_train: 训练标签 :param X_val: 验证数据 :param y_val: 验证标签 :param epochs: 迭代次数 :param learning_rate: 学习率 :param lambd: 正则化参数 """ train_losses = [] val_losses = [] for i in range(epochs): # 前向传播 y_pred_train = self.forward(X_train) y_pred_val = self.forward(X_val) # 计算损失函数值 train_loss = np.mean((y_pred_train - y_train) ** 2) + self.l2_regularization(lambd, self.w1, self.w2) val_loss = np.mean((y_pred_val - y_val) ** 2) + self.l2_regularization(lambd, self.w1, self.w2) train_losses.append(train_loss) val_losses.append(val_loss) # 反向传播 self.backward(X_train, y_train, learning_rate, lambd) if i % 100 == 0: print(f"Epoch {i}, Train Loss: {train_loss:.4f}, Validation Loss: {val_loss:.4f}") return train_losses, val_losses def predict(self, X_test): """ 预测 :param X_test: 测试数据 """ y_pred = self.forward(X_test) return y_pred def get_weights(self): """ 获取权重 """ return self.w1, self.w2 下面是主函数模块的代码(命名为main.py): python import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.preprocessing import MinMaxScaler from bp_network import BPNetwork # 导入BP网络模块 # 读取数据 data = pd.read_excel("data.xlsx", nrows=3000) # 只读取前3000行作为训练集 # 数据预处理 scaler = MinMaxScaler() # 创建归一化器 X_train = data.iloc[:, :8].values.astype(float) # 取前8列作为输入数据,转换为float类型 y_train = data.iloc[:, -1].values.reshape(-1, 1).astype(float) # 取最后一列作为输出数据,转换为float类型 X_train_norm = scaler.fit_transform(X_train) # 对输入数据进行归一化处理 y_train_norm = scaler.fit_transform(y_train) # 对输出数据进行归一化处理 # 创建BP网络模型 input_dim = 8 # 输入层维数 hidden_dim = 4 # 隐藏层维数 output_dim = 1 # 输出层维数 bpnet = BPNetwork(input_dim, hidden_dim, output_dim) # 训练BP网络模型 epochs = 10000 # 迭代次数 learning_rate = 0.1 # 学习率 lambd = 0.01 # 正则化参数 train_losses, val_losses = bpnet.train(X_train_norm, y_train_norm, X_train_norm, y_train_norm, epochs, learning_rate, lambd) # 绘制训练和验证损失函数曲线 plt.plot(train_losses, label="Train Loss") plt.plot(val_losses, label="Validation Loss") plt.legend() plt.xlabel("Epochs") plt.ylabel("Loss") plt.show() # 计算拟合度R2和相对误差平均百分比 y_pred_norm = bpnet.predict(X_train_norm) # 预测归一化后的输出数据 y_pred = scaler.inverse_transform(y_pred_norm) # 将预测结果反归一化 r2 = 1 - np.sum((y_train - y_pred) ** 2) / np.sum((y_train - np.mean(y_train)) ** 2) # 计算拟合度R2 mae = np.mean(np.abs(y_train - y_pred)) # 计算MAE mse = np.mean((y_train - y_pred) ** 2) # 计算MSE relative_error = np.mean(np.abs((y_train - y_pred) / y_train)) * 100 # 计算相对误差平均百分比 print(f"R2: {r2:.4f}") print(f"MAE: {mae:.4f}") print(f"MSE: {mse:.4f}") print(f"Relative Error: {relative_error:.2f}%") # 绘制各输入输出的拟合折线图 for i in range(input_dim): plt.scatter(X_train[:, i], y_train, label="True") plt.scatter(X_train[:, i], y_pred, label="Predicted") plt.legend() plt.xlabel(f"Input {i+1}") plt.ylabel("Output") plt.show() # 输出各输入的权重 w1, w2 = bpnet.get_weights() for i in range(input_dim): print(f"Input {i+1} Weight: {w1[i]}") 在运行主函数模块(main.py)之前,需要确保以下几点: 1. 在命令行执行 pip install pandas matplotlib scikit-learn 安装必要的包。 2. 将数据存储在名为 data.xlsx 的 Excel 文件中。注意,该文件只存储了前3000个样本作为训练集,之后的样本可用于测试集。 运行主函数模块时,将会输出训练过程中的损失函数曲线、拟合度R2、MAE、MSE、相对误差平均百分比等信息,并绘制各输入输出的拟合折线图。同时,还会输出各输入的权重。
BP网络模块: python import numpy as np import pandas as pd class BP: def __init__(self, input_size, hidden_size, output_size): # 初始化网络 self.input_size = input_size self.hidden_size = hidden_size self.output_size = output_size self.lr = 0.01 # 学习率 self.reg_lambda = 0.01 # 正则化强度 self.W1 = np.random.randn(self.input_size, self.hidden_size) / np.sqrt(self.input_size) # Xavier初始化 self.b1 = np.zeros((1, self.hidden_size)) self.W2 = np.random.randn(self.hidden_size, self.output_size) / np.sqrt(self.hidden_size) # Xavier初始化 self.b2 = np.zeros((1, self.output_size)) def sigmoid(self, z): # 激活函数 return 1 / (1 + np.exp(-z)) def sigmoid_gradient(self, z): # 激活函数的导数 return self.sigmoid(z) * (1 - self.sigmoid(z)) def normalize(self, X): # 归一化 return (X - np.mean(X, axis=0)) / np.std(X, axis=0) def regularization(self): # 正则化 return (self.reg_lambda / 2) * (np.sum(np.square(self.W1)) + np.sum(np.square(self.W2))) def forward(self, X): # 前向传播 self.z1 = np.dot(X, self.W1) + self.b1 self.a1 = self.sigmoid(self.z1) self.z2 = np.dot(self.a1, self.W2) + self.b2 self.y_pred = self.z2 def backward(self, X, y): # 反向传播 delta3 = self.y_pred - y dW2 = np.dot(self.a1.T, delta3) db2 = np.sum(delta3, axis=0, keepdims=True) delta2 = np.dot(delta3, self.W2.T) * self.sigmoid_gradient(self.z1) dW1 = np.dot(X.T, delta2) db1 = np.sum(delta2, axis=0) dW2 += self.reg_lambda * self.W2 # 正则化项的梯度 dW1 += self.reg_lambda * self.W1 # 正则化项的梯度 self.W1 -= self.lr * dW1 self.b1 -= self.lr * db1 self.W2 -= self.lr * dW2 self.b2 -= self.lr * db2 def train(self, X_train, y_train, epochs): # 训练网络 for i in range(epochs): self.forward(X_train) self.backward(X_train, y_train) cost = np.mean(np.square(self.y_pred - y_train)) + self.regularization() # 加上正则化项的损失函数 if i % 100 == 0: print("Epoch:", i, "Cost:", cost) def predict(self, X_test): # 预测 self.forward(X_test) return self.y_pred 主函数模块: python from bp import BP import numpy as np import pandas as pd import matplotlib.pyplot as plt # 读取数据 data = pd.read_excel('data.xlsx', nrows=3040) X = data.iloc[:3000, :-1].values y = data.iloc[:3000, -1].values.reshape(-1, 1) X_test = data.iloc[3000:, :-1].values y_test = data.iloc[3000:, -1].values.reshape(-1, 1) # 归一化 X = BP().normalize(X) X_test = BP().normalize(X_test) # 创建BP网络 bp = BP(input_size=8, hidden_size=10, output_size=1) # 训练BP网络 bp.train(X, y, epochs=1000) # 输出各输入的权重 print("W1:", bp.W1) print("W2:", bp.W2) # 将训练后的BP网络模型输出为一个文件 np.save('model.npy', (bp.W1, bp.b1, bp.W2, bp.b2)) # 预测 y_pred = bp.predict(X_test) # 绘制R2图 from sklearn.metrics import r2_score r2 = r2_score(y_test, y_pred) print("R2:", r2) plt.scatter(y_test, y_pred) plt.plot(y_test, y_test, color='red') plt.xlabel('True Values') plt.ylabel('Predictions') plt.show() # 计算MAE、MSE、预测值和真实值之间的相对误差平均百分比 from sklearn.metrics import mean_absolute_error, mean_squared_error mae = mean_absolute_error(y_test, y_pred) mse = mean_squared_error(y_test, y_pred) relative_error = np.mean(np.abs((y_test - y_pred) / y_test)) * 100 print("MAE:", mae) print("MSE:", mse) print("Relative Error (%):", relative_error) # 绘制测试集的各输入对应的实际输出和预测输出的拟合折线图 plt.plot(y_test, label='True Values') plt.plot(y_pred, label='Predictions') plt.legend() plt.show() 注意事项: 1. 在读取数据时,需要使用pandas库读取excel文件,且需要指定读取的行数。 2. 在归一化时,需要将训练集和测试集分别进行归一化。 3. 在训练网络时,需要加上正则化项的损失函数。 4. 在输出各输入的权重时,需要在BP网络模块中添加方法,返回各层的权重。 5. 在将训练后的BP网络模型输出为一个文件时,可以使用numpy库的save方法将权重保存到.npy文件中。 6. 在绘制R2图时,需要使用sklearn.metrics库的r2_score方法计算R2值,并使用matplotlib库绘制散点图和拟合直线。 7. 在计算MAE、MSE、预测值和真实值之间的相对误差平均百分比时,需要使用sklearn.metrics库的mean_absolute_error和mean_squared_error方法。 8. 在绘制测试集的各输入对应的实际输出和预测输出的拟合折线图时,需要使用matplotlib库绘制。
好的,这是一个比较复杂的问题,我们需要分步骤来实现。 首先,我们需要安装一些包:pandas, numpy, matplotlib。 python !pip install pandas !pip install numpy !pip install matplotlib 然后,我们创建一个名为BPNN.py的文件,该文件包含对BP神经网络进行训练和测试的函数。 python import numpy as np import pandas as pd class BPNN: def __init__(self, input_size, hidden_size, output_size): self.input_size = input_size self.hidden_size = hidden_size self.output_size = output_size self.W1 = np.random.randn(self.input_size, self.hidden_size) / np.sqrt(self.input_size) self.b1 = np.zeros((1, self.hidden_size)) self.W2 = np.random.randn(self.hidden_size, self.output_size) / np.sqrt(self.hidden_size) self.b2 = np.zeros((1, self.output_size)) def sigmoid(self, x): return 1 / (1 + np.exp(-x)) def sigmoid_derivative(self, x): return x * (1 - x) def forward(self, X): self.z1 = np.dot(X, self.W1) + self.b1 self.a1 = self.sigmoid(self.z1) self.z2 = np.dot(self.a1, self.W2) + self.b2 self.y_hat = self.sigmoid(self.z2) return self.y_hat def backward(self, X, y, y_hat, learning_rate): delta3 = (y_hat - y) * self.sigmoid_derivative(y_hat) dW2 = np.dot(self.a1.T, delta3) db2 = np.sum(delta3, axis=0, keepdims=True) delta2 = np.dot(delta3, self.W2.T) * self.sigmoid_derivative(self.a1) dW1 = np.dot(X.T, delta2) db1 = np.sum(delta2, axis=0) self.W2 -= learning_rate * dW2 self.b2 -= learning_rate * db2 self.W1 -= learning_rate * dW1 self.b1 -= learning_rate * db1 def train(self, X, y, epochs, learning_rate): for i in range(epochs): y_hat = self.forward(X) self.backward(X, y, y_hat, learning_rate) def predict(self, X): return self.forward(X) 接下来,我们创建一个名为main.py的文件,该文件包含对BP神经网络进行训练和测试的代码。 python import pandas as pd import numpy as np import matplotlib.pyplot as plt from BPNN import BPNN # 读取训练集和测试集 data = pd.read_excel('NEW.xlsx', header=None) train_data = data.iloc[1:3001, [9, 10, 11, 12, 13, 14, 16, 17]].values.astype(np.float32) train_labels = data.iloc[1:3001, -2].values.astype(np.float32) test_data = data.iloc[3001:, [9, 10, 11, 12, 13, 14, 16, 17]].values.astype(np.float32) test_labels = data.iloc[3001:, -2].values.astype(np.float32) # 归一化 mean = np.mean(train_data, axis=0) std = np.std(train_data, axis=0) train_data = (train_data - mean) / std test_data = (test_data - mean) / std # 初始化BP神经网络 input_size = train_data.shape[1] hidden_size = 16 output_size = 1 bpnn = BPNN(input_size, hidden_size, output_size) # 训练BP神经网络 epochs = 5000 learning_rate = 0.01 bpnn.train(train_data, train_labels, epochs, learning_rate) # 在测试集上进行预测 y_hat = bpnn.predict(test_data) # 反归一化 test_labels = test_labels * std[-2] + mean[-2] y_hat = y_hat * std[-2] + mean[-2] # 计算MAE,MSE和相对误差平均百分比 mae = np.mean(np.abs(test_labels - y_hat)) mse = np.mean((test_labels - y_hat) ** 2) mean_percentage_error = np.mean(np.abs((test_labels - y_hat) / test_labels)) * 100 print('MAE:', mae) print('MSE:', mse) print('Mean Percentage Error:', mean_percentage_error) # 绘制R2图 plt.scatter(test_labels, y_hat) plt.plot([test_labels.min(), test_labels.max()], [test_labels.min(), test_labels.max()], 'r--', lw=2) plt.xlabel('True Value') plt.ylabel('Predicted Value') plt.title('R2 Plot') plt.show() # 绘制各输入输出的拟合折线图 for i in range(test_data.shape[1]): plt.scatter(test_data[:, i], test_labels, s=10) plt.plot(test_data[:, i], y_hat, lw=2) plt.xlabel('Input ' + str(i+1)) plt.ylabel('Output') plt.title('Fit Plot for Input ' + str(i+1)) plt.show() 这个代码可以完成预测、计算MAE、MSE和相对误差平均百分比、绘制R2图和各输入输出的拟合折线图等操作。

最新推荐

Java实现资源管理器的代码.rar

资源管理器是一种计算机操作系统中的文件管理工具,用于浏览和管理计算机文件和文件夹。它提供了一个直观的用户界面,使用户能够查看文件和文件夹的层次结构,复制、移动、删除文件,创建新文件夹,以及执行其他文件管理操作。 资源管理器通常具有以下功能: 1. 文件和文件夹的浏览:资源管理器显示计算机上的文件和文件夹,并以树状结构展示文件目录。 2. 文件和文件夹的复制、移动和删除:通过资源管理器,用户可以轻松地复制、移动和删除文件和文件夹。这些操作可以在计算机内的不同位置之间进行,也可以在计算机和其他存储设备之间进行。 3. 文件和文件夹的重命名:通过资源管理器,用户可以为文件和文件夹指定新的名称。 4. 文件和文件夹的搜索:资源管理器提供了搜索功能,用户可以通过关键词搜索计算机上的文件和文件夹。 5. 文件属性的查看和编辑:通过资源管理器,用户可以查看文件的属性,如文件大小、创建日期、修改日期等。有些资源管理器还允许用户编辑文件的属性。 6. 创建新文件夹和文件:用户可以使用资源管理器创建新的文件夹和文件,以便组织和存储文件。 7. 文件预览:许多资源管理器提供文件预览功能,用户

torchvision-0.6.0-cp36-cp36m-macosx_10_9_x86_64.whl

torchvision-0.6.0-cp36-cp36m-macosx_10_9_x86_64.whl

用MATLAB实现的LeNet-5网络,基于cifar-10数据库。.zip

用MATLAB实现的LeNet-5网络,基于cifar-10数据库。

ChatGPT技术在商务领域的应用前景与商业化机会.docx

ChatGPT技术在商务领域的应用前景与商业化机会

响应式绿色清新园林环境网站模板.zip

网站模版

基于HTML5的移动互联网应用发展趋势.pptx

基于HTML5的移动互联网应用发展趋势.pptx

混合神经编码调制的设计和训练方法

可在www.sciencedirect.com在线获取ScienceDirectICTExpress 8(2022)25www.elsevier.com/locate/icte混合神经编码调制:设计和训练方法Sung Hoon Lima,Jiyong Hana,Wonjong Noha,Yujae Songb,Sang-WoonJeonc,a大韩民国春川,翰林大学软件学院b韩国龟尾国立技术学院计算机软件工程系,邮编39177c大韩民国安山汉阳大学电子电气工程系接收日期:2021年9月30日;接收日期:2021年12月31日;接受日期:2022年1月30日2022年2月9日在线发布摘要提出了一种由内码和外码组成的混合编码调制方案。外码可以是任何标准的二进制具有有效软解码能力的线性码(例如,低密度奇偶校验(LDPC)码)。内部代码使用深度神经网络(DNN)设计,该深度神经网络获取信道编码比特并输出调制符号。为了训练DNN,我们建议使用损失函数,它是受广义互信息的启发。所得到的星座图被示出优于具有5G标准LDPC码的调制�

利用Pandas库进行数据分析与操作

# 1. 引言 ## 1.1 数据分析的重要性 数据分析在当今信息时代扮演着至关重要的角色。随着信息技术的快速发展和互联网的普及,数据量呈爆炸性增长,如何从海量的数据中提取有价值的信息并进行合理的分析,已成为企业和研究机构的一项重要任务。数据分析不仅可以帮助我们理解数据背后的趋势和规律,还可以为决策提供支持,推动业务发展。 ## 1.2 Pandas库简介 Pandas是Python编程语言中一个强大的数据分析工具库。它提供了高效的数据结构和数据分析功能,为数据处理和数据操作提供强大的支持。Pandas库是基于NumPy库开发的,可以与NumPy、Matplotlib等库结合使用,为数

appium自动化测试脚本

Appium是一个跨平台的自动化测试工具,它允许测试人员使用同一套API来编写iOS和Android平台的自动化测试脚本。以下是一个简单的Appium自动化测试脚本的示例: ```python from appium import webdriver desired_caps = {} desired_caps['platformName'] = 'Android' desired_caps['platformVersion'] = '9' desired_caps['deviceName'] = 'Android Emulator' desired_caps['appPackage']

智能时代人机交互的一些思考.pptx

智能时代人机交互的一些思考.pptx