假期小作业

import numpy as np
import matplotlib.pyplot as plt

# 数据点
class1_points = np.array([[1.9, 1.2],
                          [1.5, 2.1],
                          [1.9, 0.5],
                          [1.5, 0.9],
                          [0.9, 1.2],
                          [1.1, 1.7],
                          [1.4, 1.1]])

class2_points = np.array([[3.2, 3.2],
                          [3.7, 2.9],
                          [3.2, 2.6],
                          [1.7, 3.3],
                          [3.4, 2.6],
                          [4.1, 2.3],
                          [3.0, 2.9]])

class3_points = np.array([[3.3, 1.2],
                          [3.8, 0.9],
                          [3.3, 0.6],
                          [2.8, 1.3],
                          [3.5, 0.6],
                          [4.2, 0.3],
                          [3.1, 0.9]])

# 合并数据点
X = np.concatenate((class1_points, class2_points, class3_points), axis=0)

# 修正标签数组
Y = np.concatenate((np.zeros(len(class1_points)), np.ones(len(class2_points)), 2 * np.ones(len(class3_points))), axis=0)

# 计算先验概率
prior_prob = [np.sum(Y == i) / len(Y) for i in range(3)]

# 计算均值和协方差矩阵
class_u = [np.mean(X[Y == i], axis=0) for i in range(3)]
class_cov = [np.cov(X[Y == i].T, rowvar=False) for i in range(3)]

# 高斯概率密度函数
def pdf(x, mean, cov):
    n = len(mean)
    inv_cov = np.linalg.inv(cov)
    det_cov = np.linalg.det(cov)
    coeff = 1 / ((2 * np.pi) ** (n / 2) * np.sqrt(det_cov))
    exponent = np.exp(-0.5 * np.dot(np.dot((x - mean).T, inv_cov), (x - mean)))
    return coeff * exponent

# 创建网格
xx, yy = np.meshgrid(np.arange(0, 5, 0.05), np.arange(0, 4, 0.05))
grid_points = np.c_[xx.ravel(), yy.ravel()]

# 预测网格点的类别
grid_label = []
for point in grid_points:
    poster_prob = [prior_prob[i] * pdf(point, class_u[i], class_cov[i]) for i in range(3)]
    pre_class = np.argmax(poster_prob)
    grid_label.append(pre_class)

grid_label = np.array(grid_label)
pre_grid_label = grid_label.reshape(xx.shape)

# 绘制数据点和决策边界
plt.scatter(class1_points[:, 0], class1_points[:, 1], c="blue", label="class 1")
plt.scatter(class2_points[:, 0], class2_points[:, 1], c="red", label="class 2")
plt.scatter(class3_points[:, 0], class3_points[:, 1], c="yellow", label="class 3")

plt.legend()

# 使用填充等高线图显示决策边界
contour = plt.contourf(xx, yy, pre_grid_label, cmap='viridis', alpha=0.5)
plt.colorbar(contour, labels=['Class 1', 'Class 2', 'Class 3'])

plt.show()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值