如何(高效)判断数据是否"线性可分"

转载 2015年11月18日 09:11:11

很多机器学习分类算法,比如支持向量机(SVM),的介绍都说了假设数据要是线性可分。

如果数据不是线性可分的,我们就必须要采用一些特殊的方法,比如SVM的核技巧把数据转换到更高的维度上,在那个高维空间数据更可能是线性可分的(Cover定理)。


现在的问题是,如何判断数据是线性可分的?

最简单的情况是数据向量是一维二维或者三维的,我们可以把图像画出来,直观上就能看出来。

比如Håvard Geithus网友的图,非常简单就看出两个类的情形下X和O是不是线性可分。


但是数据向量维度一旦变得很高,我们怎么办?

答案是检查凸包(convex hull)是否相交。


什么是凸包呢?

简单说凸包就是一个的闭合曲线(曲面),而且它刚好住了所有的数据。

举个例子,下图的蓝色线就是一个恰好包住所有数据的闭合凸曲线。



知道了什么是凸包,我们就能检查我们的数据是不是线性可分了。

以二维的情况为例,如果我们的数据训练集有两类:M+和M-,

当我们画出两个类的凸包,如果两者不重叠,那么两者线性可分,反之则不是线性可分。

下图就是个线性可分的情况。


虽然现在我们比直接看数据判断是不是线性可分进了一步,但是好像还是靠画出图来人眼判断,这对高维度数据依然无效。

是这样么?当然不是。

因为判断两个凸包是不是有重叠可以通过判断凸包M+的边和凸包M-的边是否相交来实现,这就无需把凸包画出来了。


如何高效的找到一组数据的凸包?

如何高效的判断两个凸包是否重合?

网友Darren Engwirda 给出了很好的建议:

简单说,他的建议就是用quickhull算法来找到数据的凸包,sweepline算法判断凸包边缘是否有相交,两个步骤的复杂度都是O(nlogn)。其中quickhull已经在软件包qhull(http://www.qhull.org/)实现了。

英文原话:There are efficient algorithms that can be used both to find the convex hull (the qhull algorithm is based on an O(nlog(n))quickhull approach I think), and to perform line-line intersection tests for a set of segments (sweepline at  O(nlog(n))), so overall it seems that an efficient O(nlog(n)) algorithm should be possible.

This type of approach should also generalise to general k-way separation tests (where you have k groups of objects) by forming the convex hull and performing the intersection tests for each group.

It should also work in higher dimensions, although the intersection tests would start to become more challenging...




参考链接和图片来源:

更数学的对凸包的定义:http://www.nanshan.edu.cn/lxy/shuxuejm/jiao%20cai/31%E7%AC%AC%E4%B8%89%E5%8D%81%E4%B8%80%E7%AB%A0%20%20%E6%94%AF%E6%8C%81%E5%90%91%E9%87%8F%E6%9C%BA.pdf

wikipedia对凸包的介绍:http://zh.wikipedia.org/wiki/%E5%87%B8%E5%8C%85

Håvard GeithusDarren Engwirda(以及其他人)的问答:http://stackoverflow.com/questions/9779179/determine-whether-the-two-classes-are-linearly-separable-algorithmically-in-2d


SVM 为何需要核函数 & 线性不可分转化为高维线性可分

【转载】原地址:http://www.blogjava.net/zhenandaci/archive/2009/03/06/258288.html 生存?还是毁灭?——哈姆雷特 可分?还是不可分?...
  • duhaomin
  • duhaomin
  • 2013年08月16日 14:49
  • 2231

如何(高效)判断数据是否线性可分

很多机器学习分类算法,比如支持向量机(SVM),的介绍都说了假设数据要是线性可分。 如果数据不是线性可分的,我们就必须要采用一些特殊的方法,比如SVM的核技巧把数据转换到更高的维度上,在那个高维空间数...
  • u013300875
  • u013300875
  • 2015年03月05日 12:51
  • 4270

样本集线性可分的一个充要条件

样本集线性可分的充分必要条件是正实例点集所构成的凸集与负shi
  • panda07100
  • panda07100
  • 2014年08月17日 21:17
  • 1783

支持向量机之线性可分支持向量机(一)

简介支持向量机(support vector machines,SVM)是一种二分类分类模型。它的基本模型是定义在特征空间上的间隔最大的线性分类器,间隔最大使得它有别于感知机;支持向量机还包括核技巧,...
  • qunxingvip
  • qunxingvip
  • 2015年08月18日 20:20
  • 2912

python 生成测试数据点(带有标签的线性可分和线性不可分)

# -*- coding: utf-8 -*-import numpy as np import random N = 10 #生成训练数据的个数 # AX=0 相当于matlab中 null(a...
  • suichen1
  • suichen1
  • 2015年10月14日 22:08
  • 1040

如何(高效)判断数据是否线性可分

很多机器学习分类算法,比如支持向量机(SVM),的介绍都说了假设数据要是线性可分。 如果数据不是线性可分的,我们就必须要采用一些特殊的方法,比如SVM的核技巧把数据转换到更高的维度上,在那个高维...
  • jingtingxu369
  • jingtingxu369
  • 2017年01月24日 14:27
  • 209

SVM清晰讲解1__线性可分问题

作者:liangdas 出处:简单点儿,通俗点儿,机器学习   引言: 1995年Cortes和Vapnik于首先提出了支持向量机(Support Vector Machine),由于其能够适应小样本...
  • liangdas
  • liangdas
  • 2015年03月14日 01:02
  • 6115

如何(高效)判断数据是否线性可分

很多机器学习分类算法,比如支持向量机(SVM),的介绍都说了假设数据要是线性可分。 如果数据不是线性可分的,我们就必须要采用一些特殊的方法,比如SVM的核技巧把数据转换到更高的维度上,在那个高维...
  • wangxin1982314
  • wangxin1982314
  • 2017年06月20日 09:51
  • 306

模式识别: 线性分类器

一、实验目的和要求 目的: 了解线性分类器,对分类器的参数做一定的了解,理解参数设置对算法的影响。   要求: 1. 产生两类样本 2. 采用线性分类器生成出两类样本的分类面 3. 对比线性分类...
  • wangyaninglm
  • wangyaninglm
  • 2014年05月20日 10:14
  • 19921

如何(高效)判断数据是否"线性可分"

很多机器学习分类算法,比如支持向量机(SVM),的介绍都说了假设数据要是线性可分。 如果数据不是线性可分的,我们就必须要采用一些特殊的方法,比如SVM的核技巧把数据转换到更高的维度上,在那个高维...
  • hzw05103020
  • hzw05103020
  • 2015年11月18日 09:11
  • 2633
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何(高效)判断数据是否"线性可分"
举报原因:
原因补充:

(最多只允许输入30个字)