实验一:用python实现感知机并对鸢尾花数据集分类
1. 实验内容:
(1) 用你熟知的语言(尽量使用python)实现感知器的算法,并在给定的数据集上训练。
(2) 在测试集上用训练好的感知器模型进行测试,并将预测结果以csv格式保存为一行预测的分类。
(3) 简要说明算法原理,记录实验过程的关键步骤,以及实验过程中遇到的问题和解决方法。
(4) 尝试与上次实验进行数据互换对比两种算法。
2. 实验说明:
数据集为鸢尾花数据集,有三个类别,其中setosa与另外两种之间是线性可分的,因此你需要选择按照setosa和versicolor,或setsosa和virginica,进行训练分类。
实验过程中不可以直接调用第三方库封装好的训练函数,但可以使用基础类和函数,例如numpy的数组以及矩阵内积dot函数等(算法迭代过程必须自己完成)。
算法具体实现方式无要求,函数或是类封装均可,但是要写进实验报告内。不必粘贴代码,但要有实验过程关键步骤的截图。
可以尝试利用可视化分析实验过程(非必须)。
3. 报告要求:
实验必须独立完成不得抄袭借鉴他人的实验内容。
4. 原理说明:
简要说明感知器算法原理,可以借助伪代码来进行说明。
4.1 文字描述:
感知机是一个二分类的线性模型,它的目的是寻找一个能将训练集正实例点和负实例点完全正确分开的超平面,即将输入数据线性分为两类(用1和-1标识)。
感知机的输入是实例的特征向量,输出是实例的类别,分别是+1和-1。即输入实例各属性值组成的向量,根据这些属性值进行分类,并做好标签输出。
当我们掌握了输入、输出以及最终目的时,可以发现最重要的部分是分类使用的方法——对一个实例的每个属性进行加权,并求和修正,判断正负,实现正实例点和负实例点的区分。
4.2 数学抽象:
4.2.1 输入部分:
- 输入空间(特征空间) X ⊆ R D X \subseteq \mathbb R^D X⊆RD
- x ∈ X x \in X x∈X 表示样本的特征向量,对应输入空间(特征空间)中的点。
4.2.2 输出部分:
- 输出空间(类别空间)是 Y = { + 1 , − 1 } Y = \{+1,-1\} Y={ +1,−1} ,输出 Y Y Y 表示样本的类别。
4.2.3 训练内容:
-
给定训练集 D = { ( x ( 1 ) , y ( 1 ) ) , ( x ( 2 ) , y ( 2 ) ) , … … , ( x ( N ) , y ( N ) ) } D = \{(\mathbf x^{(1)},y^{(1)}),(\mathbf x^{(2)},y^{(2)}),……,(\mathbf x^{(N)},y^{(N)})\} D={ (x(1),y(1)),(x(2),y(2)),……,(x(N),y(N))} ,其中 x ( n ) ∈ X \mathbf x^{(n)} \in X x(n)∈X , y ( n ) ∈ Y \mathbf y^{(n)} \in Y y(n)∈Y , n = 1 , 2 , 3 , … … , N n = 1,2,3,……,N n=1,2,3,……,N
-
构建线性分类器,即学习一个由属性的线性组合构成的函数。对于一个给定的 D D D维样本 x = [ x 1 , … … , x D ] T \mathbf x = [x_1,……,x_D]^T x=[x1,……,xD]T ,其线性组合为
f ( x ) = w 1 x 1 + w 2 x 2 + … … + w D x D + b f(\mathbf x) = w_1x_1+w_2x_2+……+w_Dx_D+b f(x)=w1x1+w2x2+……+wDxD+b
即
f ( x ) = w T x + b f(\mathbf x) =\mathbf {w^T x}+b f(x)=wTx+b
其中 w \mathbf w w为 D D D维的权重向量, b b b为偏置。 -
构建映射关系,即输入空间到输出空间的映射函数为:
s i g n ( f ( x ) ) = s i g n ( w T x + b ) = { + 1 , f(x) ≥ 0 − 1 , f(x) < 0 sign(f(\mathbf x)) = sign(\mathbf {w^T x}+b) = \begin{cases} +1, & \text{f(x) $\ge$ 0} \\ -1, & \text{f(x) $\lt$ 0} \end{cases} sign(f(x))=sign(w