Python----机器学习(贝叶斯分类:二分类和多分类)
在机器学习中,**贝叶斯分类器**是一种基于贝叶斯定理的统计分类方法,广泛用于预测和分类任务。**二分类**贝叶斯分类器用于处理仅有两个类别的任务,通过计算每个类别的后验概率来进行分类;常见的算法有朴素贝叶斯分类器,假设特征之间相互独立。**多分类**贝叶斯分类器则扩展了这一概念,以处理多个类别的预测任务,常用的方案包括将多分类问题转化为多个二分类问题,或使用如多项式分布等适合多类别的分布模型。贝
·
一、贝叶斯原理

二、概率密度函数值

三、协方差计算

四、设计思路
4.1、散点输入
import numpy as np
x1= 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]])
x2=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]])
#合并数据创造标签
X=np.concatenate((x1,x2))
y=np.concatenate((np.zeros(len(x1)),np.ones(len(x2))))
4.2、先验概率
prior_probabilities=[np.sum(y==0)/len(y),np.sum(y==1)/len(y)]
4.3、条件概率

def pdf(x,mean,cov):
n=len(mean)
x1=1/((2*np.pi)**(n/2))*(np.sqrt(np.linalg.det(cov)))
y1=-0.5*np.dot(np.dot((x-mean).T,np.linalg.inv(cov)),(x-mean))
return x1*np.exp(y1)
4.4、后验概率

posterior_probabilities=prior_probabilities[i]*likelinhood
4.5、决策边界

4.6、完整代码
import numpy as np
import matplotlib.pyplot as plt
# 1. 散点输入
x1 = 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]])
x2 = 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]])
# 合并数据集、创造标签
X = np.concatenate((x1, x2)) # 将两个类别的数据点合并为一个数据集
y = np.concatenate((np.zeros(len(x1)), np.ones(len(x2)))) # 创建标签:类别1为0,类别2为1
# 2. 计算先验概率(每个类别的数据在数据集中的比例)
prior_probabilities = [np.sum(y == 0) / len(y), np.sum(y == 1) / len(y)]
print(prior_probabilities) # 输出每个类别的先验概率
# 3. 计算高斯分布的概率密度函数
# 求解每个类别的均值
class_means = [np.mean(X[y == 0], axis=0), np.mean(X[y == 1], axis=0)]
# print(class_means) # 输出每个类别的均值
# 求解每个类别的协方差矩阵
X_y_0 = X[y == 0].T # 类别0的数据点转置
X_y_1 = X[y == 1].T # 类别1的数据点转置
class_covs = [np.cov(X_y_0), np.cov(X_y_1)] # 计算每个类别的协方差矩阵
# 生成网格点,用于绘制决策边界
xx, yy = np.meshgrid(np.arange(0, 5, 0.05), np.arange(0, 4, 0.05))
# 预测网格点
grid_points = np.c_[xx.ravel(), yy.ravel()] # 将网格点展平并合并为二维点
def pdf(x, mean, cov):
# 获取均值向量的长度,即特征的数量
n = len(mean)
# 计算PDF的系数部分
coeff = 1 / ((2 * np.pi) ** (n / 2) * np.sqrt(np.linalg.det(cov))) # 计算归一化常数
# 计算PDF的指数部分
exponet = -0.5 * np.dot(np.dot((x - mean).T, np.linalg.inv(cov)), (x - mean)) # 计算指数部分
return coeff * np.exp(exponet) # 返回概率密度
grid_label = [] # 保存每个网格点的预测标签
# 每一组网格点进行预测
for point in grid_points:
posterior_probabilities = [] # 存储后验概率
for i in range(2):
# 使用高斯分布的概率密度函数求解条件概率
likelihood = pdf(point, class_means[i], class_covs[i]) # 计算似然
# 4. 得到后验概率,比较大小,获得分类
posterior_probabilities.append(prior_probabilities[i] * likelihood) # 计算后验概率
# 比较大小,获得分类
pre_class = np.argmax(posterior_probabilities) # 选择具有最大后验概率的类
grid_label.append(pre_class) # 保存预测标签
# 5. 显示决策边界
# 将预测的标签形状调整为与xx一致
grid_label = np.array(grid_label).reshape(xx.shape) # 重塑预测标签为与网格点一致的形状
# 绘制散点图
plt.scatter(x1[:, 0], x1[:, 1], c="blue", label="class 1") # 类别1的散点图
plt.scatter(x2[:, 0], x2[:, 1], c="red", label="class 2") # 类别2的散点图
contour = plt.contour(xx, yy, grid_label, levels=[0.5], colors="green") # 绘制决策边界
plt.legend() # 添加图例
plt.show() # 显示图表
五、多分类
import numpy as np
import matplotlib.pyplot as plt
# 1. 散点输入
x1 = 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]])
x2 = 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]])
x3 = 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((x1, x2, x3)) # 将三个类别的数据点合并为一个数据集
# 创建标签:类别1为0,类别2为1,类别3为2
y = np.concatenate((np.zeros(len(x1)), np.ones(len(x2)), 2 * np.ones(len(x3))))
# 2. 计算先验概率(每个类别的数据在数据集中的比例)
prior_probabilities = [np.sum(y == 0) / len(y), np.sum(y == 1) / len(y), np.sum(y == 2) / len(y)]
# 3. 计算高斯分布的概率密度函数
# 求解每个类别的均值
class_mean = [np.mean(X[y == 0], axis=0), np.mean(X[y == 1], axis=0), np.mean(X[y == 2], axis=0)]
# 求解每个类别的协方差矩阵
X_y_0 = X[y == 0].T # 类别0的数据点转置
X_y_1 = X[y == 1].T # 类别1的数据点转置
X_y_2 = X[y == 2].T # 类别2的数据点转置
class_covs = [np.cov(X_y_0), np.cov(X_y_1), np.cov(X_y_2)] # 计算每个类别的协方差矩阵
# 生成网格点,用于绘制决策边界
xx, yy = np.meshgrid(np.arange(0, 5, 0.05), np.arange(0, 4, 0.05))
# 预测网格点
grid_points = np.c_[xx.ravel(), yy.ravel()] # 将网格点展平并合并为二维点
def pdf(x, mean, cov):
# 获取均值向量的长度,即特征的数量
n = len(mean)
# 计算PDF的系数部分
coeff = 1 / ((2 * np.pi) ** (n / 2) * np.sqrt(np.linalg.det(cov))) # 计算归一化常数
# 计算PDF的指数部分
exponet = -0.5 * np.dot(np.dot((x - mean).T, np.linalg.inv(cov)), (x - mean)) # 计算指数部分
return coeff * np.exp(exponet) # 返回概率密度
grid_label = [] # 保存每个网格点的预测标签
# 每一组网格点进行预测
for point in grid_points:
posterior_probabilities = [] # 存储后验概率
for i in range(3): # 遍历每个类别
# 使用高斯分布的概率密度函数求解条件概率
likelihood = pdf(point, class_mean[i], class_covs[i]) # 计算似然
# 4. 得到后验概率,比较大小,获得分类
posterior_probabilities.append(pr

六、库函数
6.1、concatenate()
用于将多个数组连接在一起,通常在合并不同类别的数据时使用。
numpy.concatenate((a1, a2, ...), axis=0, out=None)
| 方法 | 描述 |
|---|---|
| a1, a2, ... | 要连接的数组序列,可以是任意数量的数组。 |
| axis(可选) | 指定沿着哪个轴连接,默认值为 0。 |
| out(可选) | 与返回值相同形状的输出数组。 |
import numpy as np
x1 = np.array([[1, 2], [3, 4]])
x2 = np.array([[5, 6], [7, 8]])
result = np.concatenate((x1, x2), axis=0)
# 输出:[[1 2]
# [3 4]
# [5 6]
# [7 8]]
6.2、cov()
用于计算每个特征的协方差矩阵,常用于概率分布分析和数据的分散程度。
numpy.cov(m, rowvar=True, bias=False, ddof=None, fweights=None, aweights=None)
| 方法 | 描述 |
|---|---|
| m | 输入数据,可以是一个二维数组或矩阵。 |
| rowvar(可选) | 如果为 True(默认值),每一行代表一个变量,每一列代表一个观察结果。 |
| bias(可选) | 如果为 True,计算的是总体协方差矩阵;如果为 False,计算的是样本协方差矩阵。 |
| ddof(可选) | 用于设置自由度调整。 |
fweights,aweights(可选) |
用于加权相关分析。 |
import numpy as np
data = np.array([[1, 2], [3, 4], [5, 6]])
cov_matrix = np.cov(data, rowvar=False)
# 输出:[[2. 2.]
# [2. 2.]]
6.3、meshgrid()
用于生成网格点,通常用于绘制二维图形,如决策边界。
numpy.meshgrid(*xi, indexing='xy', sparse=False)
| 方法 | 描述 |
|---|---|
| *xi | 一维数组,表示网格点的坐标。 |
| indexing(可选) | 选择 'xy' 或 'ij' 来指定输出数组的排列顺序。 |
sparse(可选) |
如果为 True,则只返回稀疏网格。 |
import numpy as np
x = np.arange(0, 5, 1)
y = np.arange(0, 3, 1)
xx, yy = np.meshgrid(x, y)
# xx: [[0, 1, 2, 3, 4],
# [0, 1, 2, 3, 4],
# [0, 1, 2, 3, 4]]
# yy: [[0, 0, 0, 0, 0],
# [1, 1, 1, 1, 1],
# [2, 2, 2, 2, 2]]
6.4、c_()
将网格点展平并合并为二维点
numpy.c_[*args]
| 方法 | 描述 |
|---|---|
| *args | 可以是多个一维数组、列表或其他可以转换为数组的对象。 |
import numpy as np
x = np.array([1, 2, 3])
y = np.array([4, 5, 6])
result = np.c_[x, y]
# 输出:[[1 4]
6.5、np.linalg.det()
用于计算方阵的行列式,行列式可以提供矩阵的一些性质,例如,它可以用来判断矩阵是否可逆(如果行列式为零,则矩阵不可逆)。
numpy.linalg.det(a)
| 方法 | 描述 |
|---|---|
| a | 要计算行列式的方阵(二维数组)。 |
import numpy as np
# 定义一个方阵
matrix = np.array([[1, 2],
[3, 4]])
determinant = np.linalg.det(matrix) # 计算行列式
print(determinant) # 输出:-2.0
6.6、np.linalg.inv()
用于计算方阵的逆。逆矩阵是线性代数中的重要概念,能够用于求解线性方程组和其他涉及矩阵的操作。
numpy.linalg.inv(a)
| 方法 | 描述 |
|---|---|
| a | 要计算其逆的方阵(二维数组)。 |
import numpy as np
# 定义一个方阵
matrix = np.array([[1, 2],
[3, 4]])
inverse_matrix = np.linalg.inv(matrix) # 计算矩阵的逆
print(inverse_matrix)
# 输出:
# [[-2. 1. ]
# [ 1.5 -0.5]]
6.7、plt.contour()
用于绘制二元函数的等高线图,通常用于数据可视化,展示函数在空间中的分布情况和趋势。在决策边界的可视化中,也经常使用该函数来显示不同类的分界线。
matplotlib.pyplot.contour(X, Y, Z, levels=None, **kwargs)
| 方法 | 描述 |
|---|---|
| x | 用于绘制等高线的 x 坐标数组。 |
| y | 用于绘制等高线的 y 坐标数组。 |
| z | 用于绘制等高线的对应的 z 值,它必须与 X 和 Y 相同形状的数组。 |
levels(可选) |
指定绘制的等高线级别,可以是一个标量(表示绘制一定数量的水平线)或一个数组(表示特定的高度)。 |
| **kwargs | 其他绘图属性,如颜色、线型等。 |
import numpy as np
import matplotlib.pyplot as plt
# 创建网格数据
x = np.linspace(-3, 3, 100)
y = np.linspace(-3, 3, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X**2 + Y**2)) # 计算 z 值
plt.contour(X, Y, Z) # 绘制等高线
plt.title("Contour Plot")
plt.xlabel("X-axis")
plt.ylabel("Y-axis")
plt.colorbar() # 添加颜色条
plt.show()

更多推荐




所有评论(0)