- 概念描述
- 如何去分类?
- Generative model
- Gaussian Distribution
- 开始分类
- 分类的3个步骤
- Probability Distribution
1.概念描述
分类问题是找一个function,input一个object,输出的则是判断该object属于哪一个class
就以宝可梦为例,宝可梦有18种属性,现需要解决的分类问题就是做一个宝可梦种类的分类器
输入数值化
对于宝可梦分类问题,首先就要将一只宠物当作function的input–也就是数值化
比如可以用一组数字来描述它的特性,比如:
- 有多强(total strong)
- 生命值(hp)
- 攻击力(Attack)
- 防御力(defense)
- 特殊攻击力(Special Attack)
- 特殊攻击的防御力(Special defend)
- 速度(speed)
2.如何做分类?
Training data for Classification
···可以将编号400以下的宝可梦当作是training data,编号400以上的就做testing data,因为宝可梦的个数会不断更新,所以这样做可以去模拟已经发现已有的宝可梦情况下,如果看到新的宝可梦,能不能够预测其是那种属性?
可以将分类问题当作是回归问题吗?
以二值化分类为例,在Training时让输入为class1的输入为1,输入为class2的输出为-1;那么在testing的时候,regression的output是一个数值,它接近1则说明它是class1,接近-1则说明其是class2
这样做会遇到什么样的问题?
假设model是y=b+w1x1+w2x2,input是两个feature,x1,x2
有两个class,蓝色的是class1,红色的是class2,如果用Regression的做法,那么就希望蓝色的这些属于class 1的宝可梦,input到Regression的model,output越接近1越好,红色的属于class2的宝可梦,input到Regression的model,output越接近-1越好
假设真的找到了这个function,就像上图所示,绿色的线表示b+w1x1+w2x2=0 ,也就是class1 和 class2的分界线,在这种情况下,值接近-1的宝可梦都集中在绿线的左上方,接近1的宝可梦都集中在绿线的右下方。
但是上述现象只会出现在样本点比较集中的分布在output为-1和1的情况,如果如下上图有厕所是,我们已经知道绿线为最好的哪个model的分界线,它的左上角的值小于0,右下角的值大于0,越往右下方值越大,所以如果要考虑右下角的点,用路线对应的model,他们做regression时候的output会远大于1。这就与一开始做regression的时候,实际上已经给所有的点打上了-1或1的标签,会希望紫色点在model中的output都越接近1越好,所以这些output远大于1的点,他对于绿线对应的model来说时error,是不好的。所以如果用上图这样的样本点通过regression训练出来的model,会时紫色这条分界线对应的model,所以对于绿线,紫线反而减小了由右下角这些点所带来的error。
但是相应的,紫色的线如果用来做分类的话,确实错误的
Regression的output是连续性之的数值,而classification要求的output是离散性质的点,我们很难找到一个Regression的function使大部分样本点的output都集中在某几个离散点的附近
因此,Regression定义model好坏的定义方式对classification来说是不适用的
3.Generative model
Ideal Alternatives:
Function:
我们要找的function f(x)里面会有另外一个function g(x),当我们的input x 输入后,如果g(x)> 0,那fx的输出就是class1.如果gx<0,那fx的输出就是class2,这个方法保证了function的output都是离散的表示class的数值。
Loss function:
我们把loss function定义成L(f)= ∑n δ(fx != yn),即这个model在所有training data上predict预测错误的次数,也就是说费雷错误的次数越少,这个function表现得越好,但是这个loss function没有办法微分,是无法用gradient descent的方法去解的,当然有Preceptron,SVM这些方法可以用,但是先用另外一种方法来解决:Solution–Generative model
概率理论解释:
假设有一个二元分类的问题,我们拿到一个input x,想要知道这个x属于class 1或class 2的概率。实际上就是一个贝利也公式,x属于class的概率就等于class1自身发生的概率乘上在class1中取出x这种颜色球的概率,除以class1和class2里取出x这种颜色球的概率:
这一套想法叫做Generative model(生成模型),因为有这个model的话,就可以拿它来生成x(可以计算出每一个x出现的概率,就可以用这个分布来生成x)
Prior
P(c1)和P(c2)这两个概率被称为Prior。
假设考虑的是二元分类问题,编号小于400的data用来Training,编号大于400的data用来testing,如果想更严谨一点,可以在Training data里面分一部分balidation出来模拟testing的情况。
比如在Training data中,有79只水系宝可梦,61只一般系宝可梦,那么P(c1) = 79/(79+61)=0.56,P(c2)=61/(79+61)=0.44
接下来的问题就是如何得到P(x/c1)和P(x/c2)的值。
Probability from Class
假设x是一只新来的海龟,是水系的,但是在79只水系的宝可梦training data里根本没有海归,所以不可能挑出来一直海龟。
但是其实每一只宝可梦哦都是用一组特征值组成的向量来表示的,在这个乡里里面,一共有七种不同的属性,味蕾可视化,目前只考虑Defense和SP Denfence这两个属性。
假设海龟的vector是【103,45】,虽然每个店在已有的数据里并没有出现过,但是并不能认为它出现的概率为0,我们可以用已有的数据去估测海龟出现的可能性
可以想象已有的79只水系宝可梦的data只是冰山一角,假定水系宝可梦的Defense是从一个高斯分布(Gaussion Distribution–正态分布)里面产生的,下图只采样了79个点之后得到的分布,但是在高斯分布里采样出海龟点的概率并不是0,而从这79个已知的点中,有如何找到高斯分布的函数呢
4.Gaussion Distribution
高斯函数的概率密度函数:
在上式中,u表示均值,Σ表示方差,两者都是矩阵。
在下图中可以看出,同样的Σ,不同的u,概率分布最高点的地方也不一样
同理,如果是同样的u,不同的Σ,概率分布最亮点的地方是一样的,但是分布的密集程度是不一样的
那么如何找出Gaussian呢,其实只需要估测出Gaussian的均值u和协方差Σ即可
估测u和Σ的方法就是极大似然估计法,大致思路是:找出最特殊的那对Σ和u,从他们共同决定的高斯函数中,再次采样出79个点,是得到的分布情况和当前已知79点的分布情况相同的机率最大。
实际上任意一组u和Σ对应的高斯函数(u表示Gaussian的中心点,Σ表示分散程度)都有可能sample出跟当前分布一致的样本点,就像上图中两个红色圆圈所代表的高斯函数,但坑定存在着发生概率更大的Gaussian,也就是更接近的。而之歌函数就是我们要找的。
而极大似然函数L(u,Σ)= fuΣ(x1)·…·fuΣ(x79),实际上就是该事件发生的概率等于每个点都发生的概率之积,我们只需要把每一个点的data代进去,就可以得到一关于u和Σ的函数,分别求偏导,解出微分是0的点,既是L最大的那组参数,便是最终的估值值,通过微分得到的高斯函数的u和Σ的最优解如下:
同理,再用极大似然估计法再高斯函数的公式计算出class的两个参数,得到最终结果:
经过以上的计算,我们便得到了
P(C 1),P(x∣C 1),P(C 2),P(x∣C 2 )四个值,就可以做分类问题了
5.开始分类
在得到了4个值后,我们便有了以下数据和具体分布,只需要代入某一个input x,便可以通过公式计算出是否是class 1了。
得到的结果
通过可视化得到的结果如下:
左上角的图,横轴是Defense,综值是SP Defense,蓝色的点是水系的宝可梦分布,红色的点是一般系的宝可梦分布,对图中的每一个点都计算出它是class1的概率,该概率用颜色来表示,如果某点在红色区域,则表示它是水系宝可梦的概率更大,如果在其他颜色区域,则是一般系宝可梦的概率比较大。
因为是分类问题,因此令几率>0.5的点为类别1,几率小于0.5的点为类别2,也就是右上角图中的共色和蓝色区域。
但是从testing data上的道德结果可视化后,即右下角的图,发现分布的并不好,只有47的正确率
当然,我们之前用的只是Defense和SP defense这两个参数,在二维空间上的到的效果都不太好,而当我们将宝可梦的6个属性都算上,也就是在六维空间计算时,用6*6的矩阵计算,发现得到的准确率也只有64%,因此该分类器表现得并不好
Midifying Model(改进模型)
其实之前使用的model是不常见的,因为很少有每一个Gaussian都有自己的均值和方差,而比较常见的做法是,不同的class可以共享同一个方差矩阵
其实variance是跟input的feature size的平方成正比的,所以当feature的数量很大时,Σ大小的增长是可以非常快的,在这种i情况下,给不同的Gaussian做不同的协方差矩阵,会造成model的参数态度,而参数多就会导致model的variance过大,出现overfitting的现象,因此对不同的class使用同一个协方差矩阵,可以有效减少参数
此时就把u1,u2和共同的Σ一起去合成一个极大似然函数,此时可以发现,得到的u1和u2和原来的一样,还是各自的均值,而Σ则是原先Σ1和Σ2的加权
从结果可以考到,class1和class2在没有共用协方差矩阵前,他们的分界线是一条曲线,如果共用的话,它们之间的分界线就会变成一条直线,这样的model,我们也称之为linear model
如果考虑所有的feature,并公用协方差的话,原来的54正确率就会变成73正确率,显然是有提升的。
6.Three Steps of Classification
classification的三个步骤,实际上也是做machine learning的三个步骤
·Find a function set(model)
之前找到的P(c)和 P(x/c)就是model的参数,选择不同的分布函数或不同参数的高斯分布,救护得到不同的function,把这些不同参数的Gaussian distribution集合起来,就是一个model。
·Goodness of function
对于Gassian diatribution这个model来说,评价的是决定这个高斯函数形状的均值u和协方差Σ这两个参数的好坏,而极大似然函数L(u,Σ)的输出值,就评价了这组参数的好坏
·Find the best function
找到最好的function,就是使L(u,Σ)值最大的那组函数,实际上就是所有样本点的均值和协方差
7.Probability Distribution
Why Gaussian Distribution?
为什么要用Gaussian的model,而不选择其他的分布函数?其实并不是,高斯分布函数只是一个例子,当然也可以选择其他函数。如果选择简单的分布函数(参数较少),那么bias就大,variance就小;如果选择复杂的分布函数,那bias就小,variance就打。
Naive Bayses Classifier(朴素贝利叶分类法)
假设x=[x1,x2…xk…]中每一个dimension xk的分布都是互相独立的,它们之间的协方差都是0,那么我们可以把x产生的几率拆解成x1,x1…xk产生的几率之积
这里每一个dimension的分布函数都是一位的Gaussian distribution,如果这样假设的话,就是说,原来那多维度的Gaussian,他的协方差矩阵变成是对角的,在不是对角线的地方,值都是0,这样就可以更加减少需要的参数两,得到一个更简单的model
我们把上述这种方法叫做–朴素贝利叶分类法,如果真的明确了所有feature之间是相互独立的,是不相关的话,使用该方法时非常好的,如果该假设不成立,那么bias就会很大,不是一个好的分类法。
当然,在该例子上使用该model得到的结果也并不理想,因为各种属性之间的关联还是有必要的,比如战斗力和防御力之间就是正相关的。
Analysis Posterior Probability
分析一下后置概率的表达式,会发现一些有趣的现象。
表达式上下除以分子,得到σ(z)=1/(1+e^-z),这个function叫做sigmoid function(S函数)
S函数是一直逻辑函数,推导过程如下
虽然推导的过程比较复杂,但是最终结果还是比较好的(当Σ1和Σ2共用一个Σ时,经过化简相消z就变成了一个线性方程,x的系数是一个vector w,后面的一大串数字其实就是一个常数项b)
这个式子说明了,当class1和class2公用Σ时,它们之间的边界时现行的。
所以在Generative model里,需要做的就是找出N1,N2,u1,u2,Σ,找出以后便可以算出w和b,把它们带入式子,就可以计算概率。