分类问题
回到本系列的第一篇文章机器学习从入门到放弃之KNN算法,在里面有这样的一个问题
黄点代表1类电影的分布,绿色代表0类电影的分布,紫色代表需要分类的电影样本。
那么该怎么判别紫色的那颗点所在的类别呢?
之前给出的是KNN算法,通过计算紫色点都周边的剧场的长短,来判断紫色点属于哪个类别。现在有这样一种极端情况,黄点和绿点在紫点周围呈圆周分布,距离一样,咋办?
图画得不是太好,大家理会我的意思就行。
在这种情况,假如像下图这样的情况,就容易处理得多了。
红线的下方是黄色种类,上方时绿色种类。
这种情况我们称之为线性分类,关于如何拟合出这条线程函数下面会讲述。现在先来说说,既然这叫线性分类,那么必然会有非线性的情况啊,那咋办呢?
没错,如果特征可以被线性函数全部表达,这自然是理想情况,但实际问题中更多的非线性分类。
这时,我们需要将线性函数
转换为非线性函数
。那怎么转换呢,很简单,将线性函数(假设叫z),扔到某一非线性函数f(x)
内,得到新的表达式y = f(z)
,就是我们所需的非线性分类器
了,而f(x)
也就作激活函数,它有很多种,本文只介绍逻辑回归所使用到的sigmoid函数,其表达式是
其图像有一个漂亮的S型
可见在x的取值范围足够大的时候,其从0变1的过程可以忽略不计,因此,我们习惯的把>0.5
归为1
类,<0.5
归为0
类,那么恰好是0.5
怎么办?这个概率是极低的,如果真的是0.5
,那就随机归类,然后出门买张彩票吧,说不定就不用继续当程序员了。 (/≥▽≤/)
上面函数图像引用云深不知处的博客
算法介绍
回到表达式上,可知函数的变量是z
其余都是常量,所要要求解该分类函数的值,就是要确定z的值而z
是线性方程,基本的数学知识不难知道,
$$z=a1x1+a2x2……an*xn$$
其中[x1……xn]
是输入向量,所以训练的过程就是确定于[a1,a2……an]
的值,使得该表达式对于多个输入向量的输出值正确率最高。
下面开始讲述求最佳的[a1,a2……an]
的方法
显然,我们可以设计一个函数来衡量[a1,a2……an]
是否最佳,比如说这样的
J(a)=sumn=0(fa(xi)y)2
显然当J(a)达到最小值时,a的值最佳。方法如下,
- 初始化weight,可以使用随机值
- 代入式子得到err = y – predict
weight = weight + alpha * error * x_train[i]
,其中alpha称为学习速率,太小会影响函数的收敛速度,太大刚才就不收敛了。- 为了解决上述问题,在《机器学习实战中》使用了动态更新alpha的方法,式子为
alpha = 4/(1+i)+0.01
上述修改weight
的过程称为梯度下降法
,其中我故意略去了数学证明部分,需要的同学请自行查找专业资料。
代码实现
文章描述如有错误,欢迎指正。
来源:segmentfault 作者:肥肥的兔子
链接:https://segmentfault.com/a/1190000006039662
本文采用「CC BY-SA 4.0 CN」协议转载自互联网、仅供学习交流,内容版权归原作者所有,如涉作品、版权和其他问题请给「我们」留言处理。