什麼是點集粉碎和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+ 瀏覽量

開啟你的職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.