生成两组线性均匀分布的数据(完全线性可分)。 生成两组线性均匀分布的数据(线性不可分)。 生成两组高斯分布的数据(完全线性可分)。 生成两组高斯分布的数据(线性不可分)。 使用 神经网络-感知器进行二分类,并画出分类界面。
时间: 2024-02-09 09:12:52 浏览: 67
好的,我会根据您的要求回答问题,以下是您提出的问题的回答和代码示例。
1. 生成两组线性均匀分布的数据(完全线性可分):
```python
import numpy as np
import matplotlib.pyplot as plt
# 生成100个服从均匀分布的随机数作为X1
X1 = np.random.uniform(-10, 10, 100)
# 生成对应的Y1
Y1 = np.random.uniform(-10, 10, 100)
# 生成100个服从均匀分布的随机数作为X2,保证X2与X1之间有明显的线性差异
X2 = np.random.uniform(-5, 15, 100)
# 生成对应的Y2,保证Y2与Y1之间有明显的线性差异
Y2 = np.random.uniform(-5, 15, 100)
# 将两组数据可视化
plt.scatter(X1, Y1, c='r')
plt.scatter(X2, Y2, c='b')
plt.show()
```
2. 生成两组线性均匀分布的数据(线性不可分):
```python
import numpy as np
import matplotlib.pyplot as plt
# 生成100个服从均匀分布的随机数作为X1
X1 = np.random.uniform(-10, 10, 100)
# 生成对应的Y1
Y1 = np.random.uniform(-10, 10, 100)
# 生成100个服从均匀分布的随机数作为X2,保证X2与X1之间有明显的线性差异
X2 = np.random.uniform(-10, 10, 100)
# 生成对应的Y2,保证Y2与Y1之间有明显的线性差异,但是不能与Y1存在线性关系
Y2 = np.random.uniform(20, 30, 100)
# 将两组数据可视化
plt.scatter(X1, Y1, c='r')
plt.scatter(X2, Y2, c='b')
plt.show()
```
3. 生成两组高斯分布的数据(完全线性可分):
```python
import numpy as np
import matplotlib.pyplot as plt
# 生成服从高斯分布的随机数作为X1
X1 = np.random.normal(1, 1, 100)
# 生成对应的服从高斯分布的随机数作为Y1
Y1 = np.random.normal(1, 1, 100)
# 生成服从高斯分布的随机数作为X2
X2 = np.random.normal(5, 1, 100)
# 生成对应的服从高斯分布的随机数作为Y2
Y2 = np.random.normal(5, 1, 100)
# 将两组数据可视化
plt.scatter(X1, Y1, c='r')
plt.scatter(X2, Y2, c='b')
plt.show()
```
4. 生成两组高斯分布的数据(线性不可分):
```python
import numpy as np
import matplotlib.pyplot as plt
# 生成服从高斯分布的随机数作为X1
X1 = np.random.normal(1, 1, 100)
# 生成对应的服从高斯分布的随机数作为Y1
Y1 = np.random.normal(1, 1, 100)
# 生成服从高斯分布的随机数作为X2
X2 = np.random.normal(5, 1, 100)
# 生成对应的服从高斯分布的随机数作为Y2,但是不能与Y1存在线性关系
Y2 = np.random.normal(10, 1, 100)
# 将两组数据可视化
plt.scatter(X1, Y1, c='r')
plt.scatter(X2, Y2, c='b')
plt.show()
```
5. 使用神经网络-感知器进行二分类,并画出分类界面:
```python
import numpy as np
import matplotlib.pyplot as plt
# 生成两组线性均匀分布的数据(完全线性可分)
# 为了方便起见,直接使用第一个问题中的数据
# 将两组数据合并为一个矩阵,并且添加一列1作为偏置项
X = np.hstack((np.vstack((X1, Y1)).T, np.vstack((X2, Y2)).T))
X = np.hstack((X, np.ones((X.shape[0], 1))))
# 生成标签
y = np.hstack((np.zeros(100), np.ones(100)))
# 定义感知器模型
class Perceptron():
def __init__(self):
self.weights = None
def fit(self, X, y, lr=0.1, epochs=100):
# 初始化权重
self.weights = np.zeros(X.shape[1])
# 进行迭代更新
for epoch in range(epochs):
for xi, yi in zip(X, y):
error = yi - self.predict(xi)
self.weights += lr * error * xi
def predict(self, X):
# 计算预测值
y_hat = np.dot(X, self.weights)
return np.where(y_hat > 0, 1, 0)
# 定义绘制分类界面的函数
def plot_decision_boundary(model, X, y):
# 定义画布大小
plt.figure(figsize=(8, 6))
# 绘制散点图
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.brg)
# 绘制分类界面
x1_min, x1_max = X[:, 0].min() - 0.5, X[:, 0].max() + 0.5
x2_min, x2_max = X[:, 1].min() - 0.5, X[:, 1].max() + 0.5
xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, 0.1), np.arange(x2_min, x2_max, 0.1))
Z = model.predict(np.c_[xx1.ravel(), xx2.ravel(), np.ones(xx1.ravel().shape[0])])
Z = Z.reshape(xx1.shape)
plt.contourf(xx1, xx2, Z, alpha=0.2, cmap=plt.cm.brg)
# 显示图像
plt.show()
# 训练模型
model = Perceptron()
model.fit(X, y)
# 画出分类界面
plot_decision_boundary(model, X[:, :2], y)
```
以上代码中,我们使用了感知器模型来进行二分类,并且使用了绘制分类界面的函数 `plot_decision_boundary` 来绘制分类界面。
阅读全文