线性分类模型

43 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情

分类问题

分类是预测样本所属类别的一类问题。目标是给定输入样本x,将其分配给KK种类别CkC_k的一种,如果K=2K=2称为二分类,否则为多分类。 二分类可以解决任意类别数的多分类问题,有one-vs-one和one-vs-all两种方案

  • one-vs-one 多轮二分类,每次区分两种类别CiC_iCjC_j。共进行(K2)\dbinom{K}{2}次分类,理想情况下仅有1种类别CkC_k每次都胜出,预测结果为CkC_k
  • one-vs-all 多轮二分类,每次区分CiC_i与非CiC_i。共进行KK次分类。理想情况下给予CkC_k的分数是所有KK次分类的最高值,预测结果为CkC_k

线性分类模型

线性模型

线性模型是传统机器学习方法中最简单最常用的分类模型,用一条线性的直线或高维平面将数据一分为二。线性模型由特征函数ϕ\phi以及权重向量ω\omega组成

public class LinearModel implements ICacheAble {
    /**
     * 特征函数,将字符串形式的特征映射为独一无二的特征id
     */
    public FeatureMap featureMap;
    /**
     * 特征权重
     */
    public float[] parameter;
}

特征向量:描述样本特征的向量称为特征向量

特征提取:构造特征向量的过程称为特征提取

特征函数:用来提取每种特征的函数

指示函数:特征函数是指示函数的一个实例

/**
  * 特征提取
  *
  * @param text       文本
  * @param featureMap 特征映射
  * @return 特征向量
*/
protected abstract List<Integer> extractFeature(String text, FeatureMap featureMap);

每个具体问题的特征提取是不同的,需要根据具体问题创建子类具体实现。返回的特征向量中1的数量更少,所以只需要记录为1的下标即可。样本分布的空间称为样本空间,收集大量样本后会得到一个密集的样本空间。数据转换为特征向量,分类问题就能转换为对样本空间的分割

数学语言描述:定义特征向量x=[x1,...xD]R1×Dx=[x_1,...x_D] \in R^{1 \times D},第i个样本的特征为x(i)x^{(i)},相应的标签为y(i)y^{(i)}。则训练集可以表示为M个二元组(x(i),y(i)),i=1...M(x^{(i)},y^{(i)}), i=1...M,测试集则是一系列标签位置的样本点xx

决策边界与分离超平面

将区域分为两个部分,对于样本落入对应的区域就能预测它的标签。这样的区域是决策区域,边界称为决策边界 二维空间中,决策边界是直线,则产生该决策边界的模型为线性分类模型。

三维空间中的线性模型用平面做决策,任意维度空间中的线性决策边界统称为分离超平面

二维空间中的直线方程为ω1x1+ω2x2+b=0\omega_1x_1+\omega_2x_2+b=0,推广到D维空间,分离超平面方程为i=1Dωixi+b=0\sum_{i=1}^D \omega_ix_i+b=0,其中ωi\omega_i是权重,bb是偏置截距。为了统计将bb也看作权重

ω=[ω1,...,ωD,b]x=[x1,...,xD,1]\begin{array}{lcr} \omega=[\omega_1,...,\omega_D,b]\\ x=[x_1,...,x_D,1] \end{array},分离超平面的方程简化为权重向量和特征向量的内积形式ωx=0\omega*x=0

/**
  * 分离超平面解码
  *
  * @param x 特征向量
  * @return sign(wx)
*/
public int decode(Collection<Integer> x) {
  float y = 0;
  for (Integer f : x)
    y += parameter[f];
  return y < 0 ? -1 : 1;
}

如果数据集中所有样本都可以被分离超平面分割,则称该数据集线性可分。对于线性不可分的数据,定义更多特征或使用特殊函数将数据映射到高维空间中。