Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4586915
  • 博文数量: 1214
  • 博客积分: 13195
  • 博客等级: 上将
  • 技术积分: 9105
  • 用 户 组: 普通用户
  • 注册时间: 2007-01-19 14:41
个人简介

C++,python,热爱算法和机器学习

文章分类

全部博文(1214)

文章存档

2021年(13)

2020年(49)

2019年(14)

2018年(27)

2017年(69)

2016年(100)

2015年(106)

2014年(240)

2013年(5)

2012年(193)

2011年(155)

2010年(93)

2009年(62)

2008年(51)

2007年(37)

分类: 云计算

2017-12-13 21:11:35

https://www.cnblogs.com/lgdblog/p/6858832.html?from=singlemessage

http://blog.csdn.net/u013300875/article/details/44081067

很多机器学习分类算法,比如支持向量机(svm),假设数据是要线性可分。

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

 

那么,我们如何判断数据是不是线性可分的?

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

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

 

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

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

 

什么是凸包呢?

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

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

 

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

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

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

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

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

是这样么?当然不是。

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

 

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

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

网友 给出了很好的建议:

 

There are efficient algorithms that can be used both to find the convex hull (the algorithm is based on anO(nlog(n))  approach I think), and to perform line-line intersection tests for a set of segments ( atO(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 havek 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...

简单说,他的建议就是用quickhull算法来找到数据的凸包,sweepline算法判断凸包边缘是否有相交,两个步骤的复杂度都是O(nlogn)。

其中quickhull已经在软件包qhull()实现了。

 

 

 

 

 

 

阅读(1171) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~