在看機器學習的**時,經常會看到有作者提到「curse of dimensionality」,中文譯為「維數災難」,這到底是乙個什麼樣的「災難」?本文將通過乙個例子來介紹這令人討厭的「curse of dimensionality」以及它在分類問題中的重要性。
假設現在有一組**,每一張**裡有乙隻貓或者一條狗。我們希望設計乙個分類器可以自動地將**中的動物辨別開來。為了實現這個目標,首先需要考慮如何將**中的動物的特徵用數字的形式表達出來。貓與狗的最大區別是什麼?有人可能首先想到貓與狗的顏色不一樣,有人則可能想到貓與狗的大小不一樣。假設從顏色來辨別貓與狗,可以設計三個特徵:紅色的平均值,綠色的平均值和藍色的平均值,來決定**中的動物屬於哪乙個類:
1 if 0.5 * red + 0.3 * green + 0.2 * blue > 0.6:但是,僅僅通過這三個特徵進行分類可能無法得到乙個令人滿意的結果。因此,可以再增加一些特徵:大小,紋理等。也許增加特徵之後,分類的結果會有所提高。但是,特徵是不是越多越好?2 return cat
3 else:
4 return dog
圖1 過了某乙個值後,分類器的效能隨著維數的增加不公升反降
從圖1可以看到分類器的效能隨著特徵個數的變化不斷增加,過了某乙個值後,效能不公升反降。這種現象稱為「維數災難」。
繼續之前的例子。假設地球上貓和狗的數量是無限的。由於有限的時間和計算能力,我們僅僅選取了10張**作為訓練樣本。我們的目的是基於這10張**來訓練乙個線性分類器,使得這個線性分類器可以對剩餘的貓或狗的**進行正確分類。我們從只用乙個特徵來辨別貓和狗開始:
圖2 從圖2可以看到,如果僅僅只有乙個特徵的話,貓和狗幾乎是均勻分布在這條線段上,很難將10張**線性分類。那麼,增加乙個特徵後的情況會怎麼樣:
圖3增加乙個特徵後,我們發現仍然無法找到一條直線將貓和狗分開。所以,考慮需要再增加乙個特徵:
圖3
圖4此時,我們終於找到了乙個平面將貓和狗分開。需要注意的是,只有乙個特徵時,假設特徵空間是長度為5的線段,則樣本密度是10/5=2。有兩個特徵時,特徵空間大小是5*5=25,樣本密度是10/25=0.4。有三個特徵時,特徵空間大小是5*5*5=125,樣本密度是10/125=0.08。如果繼續增加特徵數量,樣本密度會更加稀疏,也就更容易找到乙個超平面將訓練樣本分開。因為隨著特徵數量趨向於無限大,樣本密度非常稀疏,訓練樣本被分錯的可能性趨向於零。當我們將高維空間的分類結果對映到低維空間時,乙個嚴重的問題出現了:
圖5從圖5可以看到將三維特徵空間對映到二維特徵空間後的結果。儘管在高維特徵空間時訓練樣本線性可分,但是對映到低維空間後,結果正好相反。事實上,增加特徵數量使得高維空間線性可分,相當於在低維空間內訓練乙個複雜的非線性分類器。不過,這個非線性分類器太過「聰明」,僅僅學到了一些特例。如果將其用來辨別那些未曾出現在訓練樣本中的測試樣本時,通常結果不太理想。這其實就是我們在機器學習中學過的過擬合問題。
圖6儘管圖6所示的只採用2個特徵的線性分類器分錯了一些訓練樣本,準確率似乎沒有圖4的高,但是,採用2個特徵的線性分類器的泛化能力比採用3個特徵的線性分類器要強。因為,採用2個特徵的線性分類器學習到的不只是特例,而是乙個整體趨勢,對於那些未曾出現過的樣本也可以比較好地辨別開來。換句話說,通過減少特徵數量,可以避免出現過擬合問題,從而避免「維數災難」。
圖7圖7從另乙個角度詮釋了「維數災難」。假設只有乙個特徵時,特徵的值域是0到1,每乙隻貓和狗的特徵值都是唯一的。如果我們希望訓練樣本覆蓋特徵值值域的20%,那麼就需要貓和狗總數的20%。我們增加乙個特徵後,為了繼續覆蓋特徵值值域的20%就需要貓和狗總數的45%(0.45^2=0.2)。繼續增加乙個特徵後,需要貓和狗總數的58%(0.58^3=0.2)。隨著特徵數量的增加,為了覆蓋特徵值值域的20%,就需要更多的訓練樣本。如果沒有足夠的訓練樣本,就可能會出現過擬合問題。
通過上述例子,我們可以看到特徵數量越多,訓練樣本就會越稀疏,分類器的引數估計就會越不準確,更加容易出現過擬合問題。「維數災難」的另乙個影響是訓練樣本的稀疏性並不是均勻分布的。處於中心位置的訓練樣本比四周的訓練樣本更加稀疏。
圖8假設有乙個二維特徵空間,如圖8所示的矩形,在矩形內部有乙個內切的圓形。由於越接近圓心的樣本越稀疏,因此,相比於圓形內的樣本,那些位於矩形四角的樣本更加難以分類。那麼,隨著特徵數量的增加,圓形的面積會不會變化呢?這裡我們假設超立方體(hypercube)的邊長d=1,那麼計算半徑為0.5的超球面(hypersphere)的體積(volume)的公式為:
公式1
圖9從圖9可以看出隨著特徵數量的增加,超球面的體積逐漸減小直至趨向於零,然而超立方體的體積卻不變。這個結果有點出乎意料,但部分說明了分類問題中的「維數災難」:在高維特徵空間中,大多數的訓練樣本位於超立方體的角落。
圖10圖10顯示了不同維度下,樣本的分布情況。在8維特徵空間中,共有2^8=256個角落,而98%的樣本分佈在這些角落。隨著維度的不斷增加,公式2將趨向於0,其中dist_max和dist_min分別表示樣本到中心的最大與最小距離。
公式2因此,在高維特徵空間中對於樣本距離的度量失去意義。由於分類器基本都依賴於如euclidean距離,manhattan距離等,所以在特徵數量過大時,分類器的效能就會出現下降。
所以,我們如何避免「維數災難」?圖1顯示了分類器的效能隨著特徵個數的變化不斷增加,過了某乙個值後,效能不公升反降。這裡的某乙個值到底是多少呢?目前,還沒有方法來確定分類問題中的這個閾值是多少,這依賴於訓練樣本的數量,決策邊界的複雜性以及分類器的型別。理論上,如果訓練樣本的數量無限大,那麼就不會存在「維數災難」,我們可以採用任意多的特徵來訓練分類器。事實上,訓練樣本的數量是有限的,所以不應該採用過多的特徵。此外,那些需要精確的非線性決策邊界的分類器,比如neural network,knn,decision trees等的泛化能力往往並不是很好,更容易發生過擬合問題。因此,在設計這些分類器時應當慎重考慮特徵的數量。相反,那些泛化能力較好的分類器,比如***** bayesian,linear classifier等,可以適當增加特徵的數量。
如果給定了n個特徵,我們該如何從中選出m個最優的特徵?最簡單粗暴的方法是嘗試所有特徵的組合,從中挑出m個最優的特徵。事實上,這是非常花時間的,或者說不可行的。其實,已經有許多特徵選擇演算法(feature selection algorithms)來幫助我們確定特徵的數量以及選擇特徵。此外,還有許多特徵抽取方法(feature extraction methods),比如pca等。交叉驗證(cross-validation)也常常被用於檢測與避免過擬合問題。
機器學習中的維數災難
在看機器學習的 時,經常會看到有作者提到 curse of dimensionality 中文譯為 維數災難 這到底是乙個什麼樣的 災難 本文將通過乙個例子來介紹這令人討厭的 curse of dimensionality 以及它在分類問題中的重要性。假設現在有一組 每一張 裡有乙隻貓或者一條狗。我...
curse of dimension維數災難
維數災難 即高維情況下的過擬合 為了獲得更精準的分類,可以新增更多特徵。也許特徵達到一定維度,我們會得到乙個堪稱完美的分類器?其實不然,因為當特徵達到一定維度後,再去增加維度會導致分類器的效能下降,這便是經常提到的 curse of dimension 在得到乙個效能優良的分類器前,增加特徵便會有更...
維數災難的簡單驗證
上資料探勘課的時候,有點好奇為什麼資料維數高時最近鄰無意義,現在簡單驗證了一下 假定所有資料的每一維特徵都在 0,1 0,1 0,1 內,利用numpy能方便地生成這樣的資料 def generate data size,d return np.random.random size,d 距離計算方式...