用基本包实现神经网络 对鸢尾花进行三分类问题
时间: 2024-02-05 21:05:04 浏览: 141
好的,我们可以使用Python中的NumPy库来实现一个简单的神经网络来解决鸢尾花三分类问题。以下是一个基本的实现示例:
首先,我们需要导入NumPy库,并加载鸢尾花数据集。在本例中,我们将使用sklearn库中的数据集。
```python
import numpy as np
from sklearn.datasets import load_iris
# 加载数据集
iris = load_iris()
X = iris.data
y = iris.target
```
然后,我们需要对数据进行预处理,包括标准化和one-hot编码。
```python
# 标准化数据
X = (X - X.mean()) / X.std()
# one-hot 编码
y_one_hot = np.zeros((y.shape[0], 3))
y_one_hot[np.arange(y.shape[0]), y] = 1
```
接下来,我们可以定义我们的神经网络模型。在本例中,我们将使用一个单隐藏层网络。我们将使用Sigmoid函数作为激活函数,使用交叉熵损失函数,并使用随机梯度下降作为优化算法。
```python
class NeuralNetwork:
def __init__(self, input_size, hidden_size, output_size):
self.W1 = np.random.randn(input_size, hidden_size)
self.b1 = np.zeros((1, hidden_size))
self.W2 = np.random.randn(hidden_size, output_size)
self.b2 = np.zeros((1, output_size))
def sigmoid(self, z):
return 1 / (1 + np.exp(-z))
def sigmoid_prime(self, z):
return self.sigmoid(z) * (1 - self.sigmoid(z))
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.a2 = self.sigmoid(self.z2)
return self.a2
def backward(self, X, y, output):
self.error = output - y
self.delta2 = self.error * self.sigmoid_prime(self.z2)
self.dW2 = np.dot(self.a1.T, self.delta2)
self.db2 = np.sum(self.delta2, axis=0, keepdims=True)
self.delta1 = np.dot(self.delta2, self.W2.T) * self.sigmoid_prime(self.z1)
self.dW1 = np.dot(X.T, self.delta1)
self.db1 = np.sum(self.delta1, axis=0)
def update(self, learning_rate):
self.W1 -= learning_rate * self.dW1
self.b1 -= learning_rate * self.db1
self.W2 -= learning_rate * self.dW2
self.b2 -= learning_rate * self.db2
def train(self, X, y, learning_rate=0.1, epochs=1000):
for i in range(epochs):
output = self.forward(X)
self.backward(X, y, output)
self.update(learning_rate)
if i % 100 == 0:
cost = np.mean(np.square(self.error))
print("Epoch {}: Cost = {}".format(i, cost))
def predict(self, X):
output = self.forward(X)
predictions = np.argmax(output, axis=1)
return predictions
```
现在,我们可以创建一个神经网络对象并训练它。
```python
# 创建神经网络对象
nn = NeuralNetwork(4, 5, 3)
# 训练神经网络
nn.train(X, y_one_hot)
```
最后,我们可以使用测试集来测试我们的模型。
```python
# 加载测试集
X_test = np.array([[5.1, 3.5, 1.4, 0.2], [6.3, 2.9, 5.6, 1.8], [6.8, 3.2, 5.9, 2.3]])
# 预测结果
predictions = nn.predict(X_test)
print(predictions)
```
输出应该是一个包含三个数字的数组,这些数字分别对应于测试集中每个鸢尾花的分类。
阅读全文