Python基于等协方差矩阵的线性分类器实现

Owen
Owen
发布时间:2026-10-12| 6人浏览过
原创

通过约束不同类别的协方差矩阵相等,可将高斯贝叶斯分类器简化为线性决策边界的分类器。本文以UCI鲍鱼数据集的两类预测任务为例,详解如何使用Python重新对齐数据中心并计算全局协方差矩阵,进而完成线性分类模型的训练、概率推演与准确率评估流程。

线性分类原理与实验目标

在生成式建模中,常规贝叶斯分类器为每个类别独立估计协方差矩阵,这会导致非平面的决策边界。为了获得标准的线性分类器,需要强制所有类别共享同一个协方差矩阵。核心思路是先将各特征类别的数据向各自均值平移至同一点,视为单一整体后计算共享协方差,再结合各类别原始均值进行概率推演,从而在特征空间中构建平面分割线。

数据集准备与划分

本实验采用UCI库中的鲍鱼数据集,仅保留雌性样本,并将环数(年龄指标)二分为“年轻”(<10环)与“老年”(≥10环)。数据包含多项高度相关的生理测量值。操作前需确保环境已安装 `numpy` 与 `scipy`,且工作目录下存在原始文本文件 `data/abalone.txt`。

第1步:载入数据并切分训练集与测试集

目的:将连续多维数据转为可训练的二分类矩阵,按比例隔离未见过的测试样本以避免过拟合。

操作入口:Python脚本终端或Jupyter Notebook单元格。

import numpy as np
from scipy.stats import multivariate_normal
import matplotlib.pyplot as plt

%matplotlib inline

X = np.loadtxt(open("data/abalone.txt", "r"))
abalone1 = X[X[:, 0] == 1, :]
abalone2 = X[X[:, 0] == 2, :]

abalone1_test = abalone1[0::2, :]
abalone1_train = abalone1[1::2, :]
abalone2_test = abalone2[0::2, :]
abalone2_train = abalone2[1::2, :]

abalone_test = np.vstack((abalone1_test, abalone2_test))

第2步:构造全局等协方差矩阵

目的:消除类别先验对协方差计算的干扰,获取代表类内分布的全局参数。

重要参数:` rowvar=0 ` 表示每一列代表一个特征变量,而非每行代表一个变量。

操作说明:定义中心化函数,将两类训练样本分别减去自身均值后堆叠,由此计算合并后的协方差矩阵,并替换原有独立协方差。此步骤确保了矩阵纯粹反映类内离散程度。

def centre_data(data):
    nsamples = data.shape[0]
    data_mean = np.mean(data, axis=0)
    return data - data_mean

mean1 = np.mean(abalone1_train[:, 1:], axis=0)
mean2 = np.mean(abalone2_train[:, 1:], axis=0)

abalone1_centred = centre_data(abalone1_train)
abalone2_centred = centre_data(abalone2_train)
abalone_centred = np.vstack((abalone1_centred, abalone2_centred))

cov_global = np.cov(abalone_centred[:, 1:], rowvar=0)

第3步:模型推断与完成判断

目的:利用构造好的多元正态分布对测试集进行分类评分,并验证模型效果。

可观察状态:控制台输出正确率百分比,通常该简化任务的准确率达到60%~70%即为正常范围;若显著低于60%,需检查数据预处理逻辑、特征维度选择或标签对齐是否存在Bug。

dist1 = multivariate_normal(mean=mean1, cov=cov_global)
dist2 = multivariate_normal(mean=mean2, cov=cov_global)

p1 = dist1.pdf(abalone_test[:, 1:])
p2 = dist2.pdf(abalone_test[:, 1:])

p = np.vstack((p1, p2))
index = np.argmax(p, axis=0) + 1

correct = abalone_test[:, 0] == index
percent_correct = np.sum(correct) * 100.0 / index.shape
print(percent_correct)

plt.plot(index, "k.", ms=10)

简要总结

通过强制协方差矩阵相等,原本依赖独立分布估计的贝叶斯分类器成功退化为线性分类器。该方法避开了复杂的迭代优化,直接利用统计矩完成空间划分,适合特征呈近似正态分布的基础场景。实验中需注意类间样本不平衡对全局协方差的影响,必要时可在 `centre_data` 阶段引入类别权重修正以提升泛化能力。

以上就是Python线性分类器实现的详细内容,更多关于机器学习分类算法的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。