什么是点集粉碎和VC维


粉碎是机器学习中的一个关键概念,它指的是分类器准确区分一组点的任意标记的能力。严格来说,如果分类器能够将一组点划分为所有可能的二元类别,则它粉碎了这组点。VC维衡量分类器对数据的分类能力,它指定了分类器能够粉碎的最大点数。对于机器学习从业者来说,理解粉碎和VC维的概念至关重要。在这篇文章中,我们将仔细研究点集粉碎和VC维。

什么是点集粉碎?

当分类器能够正确区分点的任何可能的标记时,据说它“粉碎”了一组点。更准确地说,如果分类器能够正确地对点的任何可能的正或负标记进行分类,则它粉碎了一组点。

换句话说,如果我们在空间中有一组点,我们可以将每个点标记为正或负。如果分类器能够准确地将点划分为正组和负组,无论我们如何选择标记它们,则称这组点被粉碎。

考虑一个二维空间中的点集作为实际示例。可以将红色或蓝色标签放在每个点旁边。如果分类器能够在平面上画一条线,所有红色点都在一侧,所有蓝色点都在另一侧,则分类器可以粉碎这组点。这意味着无论每个点标记为红色或蓝色,分类器都能正确地对其进行分类。

什么是VC维?

VC维是机器学习中的一个关键概念,它量化了分类器理解数据中复杂模式的能力。它指的是分类器能够将最大的点集划分为两个或多个不同区域的大小。分类器的VC维与其粉碎点集的能力密切相关,较大的VC维意味着粉碎复杂点集的能力更强。相反,VC维较低的分类器难以理解复杂模式,更有可能对数据进行过拟合或欠拟合。

示例可以用来展示点集粉碎和VC维之间的关系。例如,在二维空间中,线性分类器的VC维为2,这意味着它可以粉碎任何两点集,但不能粉碎所有三点集。相比之下,二维空间中的多项式分类器的VC维随着多项式的次数增加而增加,使其能够粉碎越来越复杂的点集。

寻找VC维

寻找分类器的VC维涉及计算它能够分离的最大点数,同时考虑所有可能的点标签。分析分类器对于给定点集可以产生多少个不同的二分法可以帮助实现这一点。然后,分类器能够粉碎的最大点数被称为VC维。

例如,给定一个二维空间,可以确定线性分类器能够粉碎的最大点数,同时考虑点的每一个可能的标记。线性分类器可以粉碎任何两点集但不能粉碎所有三点集的事实证明,它在二维空间中的VC维为2。这意味着线性分类器可以完全分离二维空间中的任何两点,但不能分离所有三点集。

在Python中实现查找分类器VC维的过程

在Python中实现查找线性分类器VC维的方法如下:

import itertools

import numpy as np
from sklearn.linear_model import LinearRegression


def generate_dichotomies(points):
    """Generate all possible dichotomies of a set of points."""
    dichotomies = []
    for combo in itertools.product([-1, 1], repeat=len(points)):
        dichotomy = {}
        for i, point in enumerate(points):
            dichotomy[tuple(point)] = combo[i]
        dichotomies.append(dichotomy)
    return dichotomies


def can_shatter(points, dichotomy):
    """Check if a linear classifier can shatter a given dichotomy."""
    X = np.array([list(point) for point in dichotomy.keys()])
    y = np.array(list(dichotomy.values()))
    clf = LinearRegression().fit(X, y)
    predictions = np.sign(clf.predict(X))
    return np.array_equal(predictions, y)


def find_vc_dimension(points):
    """Find the VC dimension of a linear classifier."""
    max_points = len(points)
    min_points = 1
    while min_points < max_points:
        mid = (min_points + max_points) // 2
        dichotomies = generate_dichotomies(points[:mid])
        if all(can_shatter(points[:mid], d) for d in dichotomies):
            min_points = mid + 1
        else:
            max_points = mid
    return min_points - 1

代码旨在确定二维空间中线性分类器的VC维。它的三个主要组成部分是查找VC维、是否可以粉碎和生成二分法。

“generate dichotomies”以点集作为输入,并生成该集合的所有可能二分法。当点集被划分为两个类别时,称为二分法。例如,三点的二分法可以将两个点分配到一个类别,一个点分配到另一个类别。该函数使用itertools.product方法生成类(-1和1)的所有可能组合,并构建一个包含每个点及其相关类别的字典。然后,在将每个二分法添加到列表后返回列表。

“can shatter”确定给定点集和二分法作为输入,线性分类器是否可以粉碎二分法。线性分类器是一个使用直线将点划分为两个类别的函数。该函数从二分法字典生成点的矩阵X和相关类别的向量Y。然后,使用来自scikit-learn的LinearRegression函数将一条线拟合到点及其类别。最后,它确定线性模型的预测是否与二分法字典的实际类别相匹配。

“find vc dimension”在收到点集作为输入后,使用二分查找来确定粉碎点集所需的最小点数。它首先将最小点数设置为零,并将最大点数设置为点集的长度。然后,在重复将点集拆分为两个子集后,使用“can-shatter”函数确定线性分类器是否可以粉碎较小子集中的所有二分法。如果可以,则将最大点数更改为当前子集的中点;如果不能,则将最小点数更新为当前子集的中点。此操作重复进行,直到最小点数和最大点数相等,此时返回最小点数-1,即分类器的VC维。

现在,只需使用点集作为输入来使用“find vc dimension”函数即可。点必须定义为元组列表。示例包括:

示例

points = [(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)]
vc_dimension = find_vc_dimension(points)
print(vc_dimension)

输出

2

此代码确定了二维空间中线性分类器对由对角线上的五个点组成的点集的VC维。如预期的那样,有两个VC维。

结论

总之,点集粉碎指的是分类器准确分类点集的每个备选排列的能力。VC维衡量了分类器能够粉碎的最大点数,它是分类器复杂程度的度量。了解这些概念对于机器学习至关重要,因为它使我们能够评估模型的表达能力和对其他类型数据的泛化能力。通过了解分类器的VC维,我们可以预测获得特定准确度水平所需的样本数量,并防止过拟合。

更新于:2023年4月25日

4K+ 浏览量

开启你的职业生涯

通过完成课程获得认证

开始学习
广告