好的,我来为您设计一个三层神经网络来对两类非线性可分的数据进行分类,并详细分析实现过程和结果。
1. 数据生成
首先,我们使用Python生成两类非线性可分的数据:
```python
import numpy as np
import matplotlib.pyplot as plt
# 生成第一类数据
np.random.seed(0)
X1 = np.random.randn(100, 2) + np.array([2, 2])
Y1 = np.ones(100)
# 生成第二类数据
X2 = np.random.randn(100, 2) * 1.5 + np.array([-2, -2])
Y2 = np.zeros(100)
# 合并数据
X = np.vstack((X1, X2))
Y = np.hstack((Y1, Y2))
# 可视化数据
plt.scatter(X[:, 0], X[:, 1], c=Y, cmap='bwr')
plt.show()
```
这段代码生成了两类数据,红色点为一类,蓝色点为另一类。我们可以看到,这两类数据是非线性可分的。
2. 构建神经网络
接下来,我们构建一个三层神经网络:
```python
from sklearn.model_selection import train_test_split
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.optimizers import Adam
# 划分训练集和测试集
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2)
# 构建模型
model = Sequential()
model.add(Dense(16, input_dim=2, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
# 编译模型
model.compile(loss='binary_crossentropy', optimizer=Adam(lr=0.01), metrics=['accuracy'])
# 训练模型
history = model.fit(X_train, Y_train, epochs=100, batch_size=16, validation_split=0.1)
# 评估模型
loss, accuracy = model.evaluate(X_test, Y_test)
print(f"Test Accuracy: {accuracy:.4f}")
# 可视化训练过程
plt.plot(history.history['accuracy'], label='train')
plt.plot(history.history['val_accuracy'], label='validation')
plt.legend()
plt.show()
```
3. 代码解释
- 数据预处理:我们使用train_test_split函数将数据分为训练集和测试集。
- 模型构建:我们构建了一个三层的神经网络。第一层是输入层,有2个神经元(对应数据的两个特征)。第二层是隐藏层,有16个神经元,使用ReLU激活函数。第三层是隐藏层,有8个神经元,同样使用ReLU激活函数。第四层是输出层,有1个神经元,使用Sigmoid激活函数。
- 模型编译:我们使用二元交叉熵作为损失函数,Adam优化器,学习率设为0.01。
- 模型训练:我们训练100个epoch,每个batch包含16个样本。我们还设置了10%的验证集。
- 模型评估:我们在测试集上评估模型性能。
- 结果可视化:我们绘制了训练和验证的准确率曲线。
4. 结果分析
通过训练过程,我们可以看到神经网络在训练集和验证集上的准确率都逐渐上升,并最终趋于稳定。在测试集上的准确率通常可以达到90%以上。
这说明我们的神经网络模型能够较好地学习数据中的非线性模式,成功地对两类数据进行分类。
5. 可视化决策边界
为了更直观地理解模型的分类效果,我们可以绘制决策边界:
```python
# 创建网格
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.1),
np.arange(y_min, y_max, 0.1))
# 预测网格点
Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
# 绘制决策边界
plt.contourf(xx, yy, Z, alpha=0.4, cmap='bwr')
plt.scatter(X[:, 0], X[:, 1], c=Y, cmap='bwr')
plt.show()
```
这个可视化可以帮助我们更清楚地看到神经网络是如何对数据进行分类的。