Python线性分类介绍

 更新时间:2022年02月16日 17:22:55   作者:努力奋斗的K崽  
这篇文章主要介绍了Python线性分类,线性分类指在机器学习领域,分类的目标是指将具有相似特征的对象聚集。而一个线性分类器则透过特征的线性组合来做出分类决定,以达到此种目的。对象的特征通常被描述为特征值,而在向量中则描述为特征向量,需要的朋友可以参考下

通过约束类的协方差相等,将贝叶斯分类器简化为线性分类器。
比较生成模型和判别模型在挑战性分类任务中的性能。

在本实验课中:我们将比较线性分类的“生成建模”和“判别建模”方法。对于“生成”方法,我们将重新讨论我们在前面练习中使用的贝叶斯分类代码,但我们将限制系统具有相等的协方差矩阵,即一个协方差矩阵来表示所有类别,而不是每个类别都有其自己的协方差矩阵。在这种情况下,系统成为线性分类器。我们将把它与“判别式”方法进行比较,在这种方法中,我们使用感知器学习算法直接学习线性分类器参数。

在本笔记本中,我们将使用UCI机器学习库中的另一个数据集:鲍鱼数据。鲍鱼是一种海螺。一个样本的年龄可以通过在圆锥体上切割外壳和用显微镜(更像是树木)计数环来确定,但这是一个耗时且昂贵的过程。这里的任务是通过简单的外部测量动物的重量和尺寸,尝试并预测环的数量。对于我们正在使用的数据集,环数的真实值是已知的(即,在测量蜗牛后对环进行计数)。结果从1到29个环不等,因此这通常被视为29类分类问题。为了简化一些,我将数据重新组合成两个大小大致相同的类:年轻(少于10个环)和老年(10个或更多个环)。我也只采集了女性样本。有7个测量值(都是高度相关的)用于预测类别标签。

生成性建模:具有等协变多元正态分布的贝叶斯分类。
与上一个介绍相比,有更多的样本(1306个,178个),因此我们不必担心遗漏一个测试,相反,我们只需像上一个一样,将数据切割成大小相同的测试和训练集。
通过修改上次编写的代码,使用具有完全协方差矩阵的多元正态分布来评估贝叶斯分类器的性能。在考虑对代码进行更改时,请注意,主要区别在于本笔记本中只有两个类,而不是三个。(如果您愿意,您可以尝试将代码包装到函数中,看看是否可以将其设计为适用于任意数量的类。)
您的分类器的性能如何?此任务的分数可能在60%-70%之间,因此,如果性能似乎比前一个任务差很多,请不要担心。如果性能低于60%,那么您应该检查代码是否存在可能的bug。

import numpy as np
X = np.loadtxt(open("data/abalone.txt", "r"))
X.shape
from scipy.stats import multivariate_normal
import matplotlib.pyplot as plt

%matplotlib inline

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))
abalone_test.shape

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

dist1 = multivariate_normal(mean=mean1, cov=cov1)
dist2 = multivariate_normal(mean=mean2, cov=cov2)

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

p = np.vstack((p1, p2))

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

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

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

rowvarbool,可选

如果rowvar为True(默认),则每行表示一个变量,列中包含观察值。否则,关系将被转换:每列表示一个变量,而行包含观察值。

使用等协方差矩阵:

如果您正确地遵循了与上一本笔记相同的步骤,您将为每个类估计出一个单独的协方差矩阵。这些矩阵将不相等,因此您的系统将不是线性分类器(即,它将具有非平面决策边界)。为了将其简化为线性系统,我们需要确保只有一个协方差矩阵。您可以想象这样做的不

同方式:

首先,您可以想象简单地从完整的训练集中估计单个协方差矩阵,然后再将其划分为类。这将生成一个矩阵,但这不是正确的做法。我们希望矩阵表示类内的分布,如果您仅使用完整的训练数据集训练模型,它还将捕获类间的分布。
其次,可以想象平均两个类相关协方差矩阵。这更接近于正确的情况,但它没有考虑到类的示例数可能不相等这一事实。
最好的方法是首先将两个类的中心移动到同一点上,然后将它们视为单个类。要将类中心移动到同一点上,只需从每个数据样本中减去类平均向量。

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


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)

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

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

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

到此这篇关于Python线性分类介绍的文章就介绍到这了,更多相关Python线性分类内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python 解决flask 图片在线浏览或者直接下载的问题

    python 解决flask 图片在线浏览或者直接下载的问题

    今天小编就为大家分享一篇python 解决flask 图片在线浏览或者直接下载的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • python使用cartopy在地图中添加经纬线的示例代码

    python使用cartopy在地图中添加经纬线的示例代码

    gridlines可以根据坐标系,自动绘制网格线,这对于普通绘图来说显然不必单独拿出来说说,但在地图中,经纬线几乎是必不可少的,本文将给大家介绍了python使用cartopy在地图中添加经纬线的方法,需要的朋友可以参考下
    2024-01-01
  • 使用Python实现tail的示例代码

    使用Python实现tail的示例代码

    tail是一个常用的Linux命令, 它可以打印文件的后面n行数据, 也能实时输出文件的追加数据。本文就来用Python实现tail,感兴趣的可以了解一下
    2023-03-03
  • 详解Python 4.0 预计推出的新功能

    详解Python 4.0 预计推出的新功能

    这篇文章主要介绍了详解Python 4.0 预计推出的新功能,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-07-07
  • Python sep参数使用方法详解

    Python sep参数使用方法详解

    这篇文章主要介绍了Python sep参数使用方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • Python标准库sched模块使用指南

    Python标准库sched模块使用指南

    这篇文章主要介绍了Python标准库sched模块使用的相关资料,需要的朋友可以参考下
    2017-07-07
  • Python使用matplotlib实现基础绘图功能示例

    Python使用matplotlib实现基础绘图功能示例

    这篇文章主要介绍了Python使用matplotlib实现基础绘图功能,结合实例形式分析了Python基于matplotlib实现正弦、余弦图形及多轴图的相关绘制操作技巧,需要的朋友可以参考下
    2018-07-07
  • Python使用ThreadPoolExecutor一次开启多个线程

    Python使用ThreadPoolExecutor一次开启多个线程

    通过使用ThreadPoolExecutor,您可以同时开启多个线程,从而提高程序的并发性能,本文就来介绍一下Python使用ThreadPoolExecutor一次开启多个线程,感兴趣的可以了解一下
    2023-11-11
  • 在 Python 中如何将天数添加到日期

    在 Python 中如何将天数添加到日期

    这篇文章主要介绍了在 Python 中将天数添加到日期,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • Python 文件读写操作实例详解

    Python 文件读写操作实例详解

    Python提供了必要的函数和方法进行默认情况下的文件基本操作。你可以用file对象做大部分的文件操作
    2014-03-03

最新评论