随机生成三类数据,每类20个样本,样本为三维向量,不使用sklearn的条件下构建一个隐藏层为4的BP神经网络进行分类
时间: 2024-02-22 15:59:03 浏览: 30
好的,我理解了你的要求。我可以为你提供一个Python的代码来实现这个任务。代码如下:
```python
import numpy as np
# 随机生成三类数据
np.random.seed(0)
# 第一类数据
class1 = np.random.randn(20, 3) + np.array([0, 10, 0])
# 第二类数据
class2 = np.random.randn(20, 3) + np.array([5, 5, 0])
# 第三类数据
class3 = np.random.randn(20, 3) + np.array([10, 0, 0])
# 将数据合并
data = np.vstack([class1, class2, class3])
# 构建标签
labels = np.array([0]*20 + [1]*20 + [2]*20)
# 打乱数据
indices = np.random.permutation(len(data))
data = data[indices]
labels = labels[indices]
# 构建神经网络模型
class NeuralNetwork:
def __init__(self):
self.inputSize = 3
self.outputSize = 3
self.hiddenSize = 4
self.W1 = np.random.randn(self.inputSize, self.hiddenSize)
self.W2 = np.random.randn(self.hiddenSize, self.outputSize)
def forward(self, X):
self.z = np.dot(X, self.W1)
self.z2 = self.sigmoid(self.z)
self.z3 = np.dot(self.z2, self.W2)
o = self.sigmoid(self.z3)
return o
def sigmoid(self, s):
return 1 / (1 + np.exp(-s))
def sigmoidPrime(self, s):
return s * (1 - s)
def backward(self, X, y, o):
self.o_error = y - o
self.o_delta = self.o_error * self.sigmoidPrime(o)
self.z2_error = self.o_delta.dot(self.W2.T)
self.z2_delta = self.z2_error * self.sigmoidPrime(self.z2)
self.W1 += X.T.dot(self.z2_delta)
self.W2 += self.z2.T.dot(self.o_delta)
def train(self, X, y):
o = self.forward(X)
self.backward(X, y, o)
# 训练神经网络
NN = NeuralNetwork()
for i in range(1000):
NN.train(data, np.eye(3)[labels])
# 生成测试数据
test_data = np.random.randn(10, 3) + np.array([5, 5, 0])
# 预测测试数据的分类
print(NN.forward(test_data))
```
这段代码首先随机生成了三类数据,每类数据有20个样本,样本为三维向量。然后,我使用了一个类`NeuralNetwork`来构建神经网络模型,该模型有一个隐藏层,隐藏层的神经元个数为4。接着,我对这个神经网络模型进行了训练,使用了随机梯度下降算法来更新权重。最后,我生成了一些测试数据,并使用训练好的模型对测试数据进行了分类。注意,这里使用了`np.eye(3)`来构建标签,这是因为神经网络的输出是一个概率分布,使用`np.eye(3)`可以将分类标签转换为一个概率分布的形式。