python线性结构,线性表python
本文主要介绍Python线性分类。线性分类是指机器学习领域。分类的目标是聚集具有相似特征的对象。而线性分类器是通过特征的线性组合来做出分类决策,从而达到这个目的。物体的特征通常被描述为特征值,而向量中的特征被描述为特征向量。有需要的朋友可以参考以下。
通过限制类的协方差相等,贝叶斯分类器被简化为线性分类器。
比较生成模型和判别模型在具有挑战性的分类任务中的性能。
在本实验课中:将比较线性分类的“生成建模”和“判别建模”方法。对于“生成”方法,我们将重新讨论我们在前面的练习中使用的贝叶斯分类代码,但我们将限制系统具有相等的协方差矩阵,即一个协方差矩阵代表所有类别,而不是每个类别都有自己的协方差矩阵。在这种情况下,系统成为线性分类器。我们将它与“判别式”方法进行比较,在“判别式”方法中,我们使用感知器学习算法来直接学习线性分类器参数。
在这本笔记本中,我们将使用UCI机器学习库中的另一个数据集:鲍鱼数据。鲍鱼是一种海螺。样本的年龄可以通过在圆锥体上切割外壳并用显微镜(更像一棵树)计数年轮来确定,但这是一个耗时且昂贵的过程。这里的任务是通过简单地测量动物的外部重量和大小来尝试和预测年轮的数量。对于我们正在使用的数据集,环数的真实值是已知的(即在测量蜗牛后计算环数)。结果从1到29环不等,所以这通常被认为是29种分类问题。为了简化,我将数据重组为大小大致相同的两类:年轻(少于10环)和年老(10环以上)。我只收集了女性样本。有7个测量值(都高度相关)用于预测类别标签。
基于生成性建模:协变多元正态分布的贝叶斯分类。
和上次介绍相比,样本多了(1306,178),不用担心漏测了。相反,我们只需要像上一次一样将数据切割成相同大小的测试和训练集。
通过修改上次写的代码,用协方差矩阵完整的多元正态分布来评估贝叶斯分类器的性能。当考虑对代码进行修改时,请注意主要的区别是这个笔记本中只有两个类,而不是三个。(如果您愿意,可以尝试将代码包装在一个函数中,看看它是否可以适用于任意数量的类。)
你的分类器性能如何?这个任务的分数可能在60%-70%之间,如果表现看起来比上一个任务差很多也不用担心。如果性能低于60%,那么您应该检查代码中可能存在的错误。
将numpy作为np导入
x=NP . load txt(open( data/鲍鱼. txt , r ))
x .形状
从scipy.stats导入多变量_正常
将matplotlib.pyplot作为plt导入
%matplotlib内联
鲍鱼1=X[X[:0]==1,]
鲍鱼2=X[X[:0]==2,]
鲍鱼1_test=鲍鱼1[0:2,]
鲍鱼1_train=鲍鱼1[1:2,]
鲍鱼2_test=鲍鱼2[0:2,]
鲍鱼2_train=鲍鱼2[1:2,]
鲍鱼_测试=np.vstack((鲍鱼1 _测试,鲍鱼2 _测试))
鲍鱼_测试.形状
mean 1=NP . mean(abalone 1 _ train[:1:],axis=0)
mean 2=NP . mean(abalone 2 _ train[:1:],axis=0)
cov 1=NP . cov(abalone 1 _ train[:1:],rowvar=0)
cov 2=NP . cov(abalone 2 _ train[:1:],rowvar=0)
dist 1=multivarial _ normal(mean=mean 1,cov=cov1)
dist2=多元_正态(mean=mean2,cov=cov2)
p1=dist1.pdf(鲍鱼_test[:1:])
p2=dist2.pdf(鲍鱼_test[:1:])
p=np.vstack((p1,p2))
index=np.argmax(p,axis=0) 1
plt.plot(索引,“k”,ms=10)
正确=鲍鱼_test[:0]==index
percent_correct=np.sum(正确)* 100.0/index.shape
打印(正确百分比)
rowvarbool,可选
trong>
如果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线性分类内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。