
现在,你看到了一个多分类的效果图,它是怎么实现的呢?
一、基础准备
准备工作在开始本文前,你需要具备逻辑回归二分类应该具备的基础,该模型是建立在二分类的基础上,利用矩阵特性进行拓展得到的多分类模型。
二、矩阵改进
我在上一篇博客中已经讲述了二分类所需的构造矩阵,在这里,我将对矩阵进行改进。好的,首先是。。额,随机数生成。。这步只是建立一个本地数据库,便于调试,可以略去。我再重申一遍,我没在开玩笑,会xlrd库的大佬举个手好吗!
而后到了重头戏!根据吴恩达机器学习[1],我们每次将数据分为两类:正类和负类,体现在数据上是标注0和1,一共划分n次,这里取3次(例子啦,不要纠结~)。根据矩阵知识,重构后的矩阵如下:

可以很明显地看出,多分类其实就是将因变量和权重矩阵扩充了,于是在之后的逻辑回归中只需迭代n次而不是3n次,减少了时间复杂度。我将这种运算模式称为:并行计算。理所当然地,因变量矩阵和权重矩阵构成了并行运算矩阵模块。
三、逻辑回归
这和之前的二分类问题没有区别,只是在运算sigmoid函数时需要小小改进一下:
首先,将误差阵A转变为一个由numpy库生成的空矩阵而取代列表转矩阵,这样我们只需确定空矩阵接受误差向量的维度(即θ列向量的行数,现在是θ矩阵!)
1 | #某置空矩阵默默从多分类的全世界路过 |
需要注意的是,在误差的梯度下降中,我们需要将A重新置空,并且不能把θ阵和损失阵的减序搞反。康康是哪个笨比进行了上面的操作,然后成功的把阈值降低到了0.3。
1 | #就是这厮,减号后面的项与前面的项不能搞反,会导致阈值变化 |
四、输出与绘图
枯燥无味的输出时间!仍然是函数泛化,只是我们需要一个迭代器将三条直线一次输出,我采用的是x轴不变,y轴循环更新的方法,其实之前是想用列表添加三个y域的,但是太麻烦主要是根本不会列表添加列表与取值,甚至我打一个函数还要考虑半天它的输出(快哭了),采用此方法不会保留列表值,每次输出后自动损失y的数据。大功告成!
五、不足与改进措施
首先非常明显,该程序是针对本地数据集的,当然你可以调整本地数据集的范围,但仍然使得这个程序非常菜鸡。然后,你可以轻松地想到,它的学习率需要手动调整(调参侠!),迭代次数也不能保证,当然这是可以用损失函数优化的,这里不展示了。最后,它只能线性拟合标记的数据集,使得程序的作用范围远远达不到要求,这要求我们能够用更牛逼的模型计算问题,然后让大家交口称赞。
六、下载项
多分类主程序
效果图
七、参考资料
[1]吴恩达机器学习(B站)