代码之家  ›  专栏  ›  技术社区  ›  claws

支持向量机(SVM)的几个实现细节

  •  24
  • claws  · 技术社区  · 15 年前

    在一个特殊的应用中,我需要机器学习(我知道我在本科学习的东西)。我用支持向量机解决了这个问题。工作正常。

    1. 我每周都会得到额外的训练实例。现在,系统开始使用更新的示例(旧示例+新示例)进行新的培训。我想让它逐步学习。将以前的知识(而不是以前的例子)与新的例子一起使用,以获得新的模型(知识)

    2. 假设实现了“未知”类。当类“未知”时,应用程序的用户输入他认为该类可能是什么。现在,我需要将用户输入融入到学习中。我也不知道怎么做。如果用户输入一个新类(即。。一个不在训练集中的课程?

    我需要选择一个新的算法还是支持向量机可以做到这一点?

    PS:我使用libsvm实现支持向量机。

    4 回复  |  直到 15 年前
        1
  •  8
  •   doug    15 年前

    我只是用和你的问题(1,2,3)相同的组织写了我的答案。

    1. 我认为您可以很容易地解决这个问题,方法是将LIBSVM配置为一对多,即 . 支持向量机 一类分类器;支持向量机在多类中的应用意味着它已经被编码成对多个分类执行多个逐步的分类,但是算法还是一次训练(和测试)一个类。如果这样做,那么对测试集执行分步执行后剩下的是“未知的”——换句话说,执行多个连续的一个类分类后未分类的任何数据,根据定义都在该“未知”类中。

    2. 为什么不让用户的猜测成为一个特性(即,仅仅是另一个因变量)?唯一的另一个选择是将其作为类标签本身,而您不希望这样。例如,您可以在数据矩阵“用户类猜测”中添加一列,并用一些值填充它,这些值对于那些不属于“未知”类别的数据点很可能没有影响,因此用户不会提供猜测--这个值可以是“0”或“1”,但实际上,这取决于如何对数据进行缩放和规范化)。

        2
  •  5
  •   Cerin    15 年前

    几个月前,我还研究了 增量 支持向量机算法。不幸的是,当前的实现状态非常稀少。我只找到一个 Matlab example , OnlineSVR (论文项目仅实现回归支持),以及 SVMHeavy

    我没有亲自用过。它们似乎都处于“研究玩具”阶段。我甚至不能让SVMHeavy编译。

    我也不认为支持向量机可以在默认情况下对“未知”样本的概念建模。它们通常是作为一系列布尔分类器工作的,因此一个样本最终会被积极地归类为某个东西,即使这个样本与之前看到的任何东西都有很大的不同。一种可能的解决方法是对特征的范围建模,并随机生成这些范围之外的样本,然后将这些样本添加到训练集中。

    例如,如果有一个名为“color”的属性,该属性的最小值为4,最大值为123,则可以将其添加到训练集中

    [({'color':3},'unknown'),({'color':125},'unknown')]
    

    给你的支持向量机一个“未知”颜色的概念。

        3
  •  3
  •   Stompchicken    15 年前
    1. 有增量训练SVM的算法,但我不认为libSVM实现了这一点。我认为你应该考虑是否真的需要这个功能。我认为你目前的方法没有问题,除非训练过程实在太慢。如果是,你能分批再培训吗(即每100个新的例子之后)?
    2. 你可以让libSVM产生类成员的概率。我认为这可以用于多类分类,但我不完全确定。您需要确定分类不够确定的阈值,然后输出“未知”。我想,设置一个关于最有可能类和第二个最有可能类之间的差异的阈值可以实现这一点。
        4
  •  2
  •   Florian Pilz Jörg W Mittag    12 年前

    尽管这个问题可能已经过时了,但我还是觉得有必要再多考虑一下。

    1. 将“Unknown”添加为类不是一个好主意。根据它的用途,原因是不同的。

      • 如果您使用“未知”类作为“此实例尚未分类,但属于已知类之一”的标记,那么您的支持向量机将遇到严重问题。原因是libsvm构建了多个二值分类器并将它们组合起来。因此,如果你有三个类,比如A、B和C,SVM通过将训练示例分成“分类为A”和“任何其他类”来构建第一个二进制分类器。后者显然包含“Unknown”类中的所有示例。当试图建立一个超平面时,“未知”(实际上属于“a”类)中的例子可能会导致支持向量机建立一个边距很小的超平面,并且很难识别a的未来实例,即它的泛化性能会降低。这是因为,支持向量机将尝试构建一个超平面,将a的大多数实例(官方标记为“a”)分离到超平面的一侧,而将另一侧的一些实例(官方标记为“未知”)分离。

      总而言之:引入一个“未知”类,该类包含已知类的示例或几个新类的示例,将导致分类器性能较差。我认为在训练分类器时最好忽略所有未分类的实例。