維數災難的簡單驗證

2021-09-19 23:50:08 字數 2617 閱讀 6313

上資料探勘課的時候,有點好奇為什麼資料維數高時最近鄰無意義,現在簡單驗證了一下

假定所有資料的每一維特徵都在[0,

1)[0,1)

[0,1

)內,利用numpy能方便地生成這樣的資料:

def generate_data(size, d):

return np.random.random((size,d))

距離計算方式採用歐氏距離:

def compute_distance(p1, p2):

return np.sqrt(np.sum(np.square(p1 - p2)))

嘗試1

計算資料集中任意兩點的最大距離資料集中樣本點之間的平均距離,發現隨著維數增加,這兩個值也在隨之增加。(不是說樣本之間的差異性會變小嗎?)

但是想一下,就能明白了:

維數為1

11時,最大距離為1=1

\sqrt=1

1​=1

,維數為2

22時,最大距離為1+1

=2\sqrt=\sqrt

1+1​=2

​,nn

n維的最大距離為n

\sqrt

n​. 儘管樣本點不一定能使最大距離能取到,但距離的取值範圍發生了變化—它變大了

於是我們可以得出結論距離的絕對大小關係不能反映出問題

嘗試2問題的關鍵在於這些距離是不是變得相似了,而不是這些距離是不是變小了。kevin beyer在**中寫道:當維數趨於極限值時,查詢點到資料集中所有點的距離都相等。以此可以想到乙個新的驗證思路:

隨機取乙個樣本點,計算其他樣本點到該點的距離,並計算這些距離的方差

結果又出問題了,好像並沒有什麼規律

現在思考乙個問題:

簡單資料集d1=

0.9,

1.1d_=0.9,1.1

d1​=0.

9,1.

1,var1

=0.12

+0.12

2var_=\frac+0.1^}

var1​=

20.1

2+0.

12​而d2=

1.85

,2.15

d_=1.85,2.15

d2​=1.

85,2

.15,var

2=0.152+

0.1522

var_=\frac+0.15^}

var2​=

20.1

52+0

.152

​顯然var1r2

var_var1​

r2​,但是實際上d1d_

d1​中樣本與均值的相差百分比是0.1

1\frac

10.1​,d2d_

d2​則是0.15

2\frac

20.15​

.也就是說d2d_

d2​相差的幅度更小

嘗試3能不能把資料均一化一下呢?以消除數字大小對變化幅度的影響?乙個簡單的想法是除以最大距離,這樣所有資料的範圍就能被限定在[0,

1)[0,1)

[0,1

)內,即:

隨機取乙個樣本點,計算其他樣本點到該點的距離,並除以最大距離,計算這個結果的方差

def test_sample(data):
idx = np.random.randint(len(data))

distance =

max_distance = none

for i in range(len(data)):

if i != idx:

d = compute_distance(data[i], data[idx])

if max_distance is none or d > max_distance:

max_distance = d

distance = np.array(distance)

return distance/max_distance再來看看結果:

然後在不同大小的資料集上測試:

當資料維數從0

00~10

1010

變化時,查詢點到其他樣本點的距離以極快的速度變得越來越相似。當資料維數趨近於無窮時,查詢點到其他樣本點的距離都相等,此時knn已失去了效果

延伸思考:

計算距離相似度有沒有更好的辦法?

怎麼證明資料維數趨近於無窮時,查詢點到資料集中所有點的距離都相等?

curse of dimension維數災難

維數災難 即高維情況下的過擬合 為了獲得更精準的分類,可以新增更多特徵。也許特徵達到一定維度,我們會得到乙個堪稱完美的分類器?其實不然,因為當特徵達到一定維度後,再去增加維度會導致分類器的效能下降,這便是經常提到的 curse of dimension 在得到乙個效能優良的分類器前,增加特徵便會有更...

機器學習中的維數災難

在看機器學習的 時,經常會看到有作者提到 curse of dimensionality 中文譯為 維數災難 這到底是乙個什麼樣的 災難 本文將通過乙個例子來介紹這令人討厭的 curse of dimensionality 以及它在分類問題中的重要性。假設現在有一組 每一張 裡有乙隻貓或者一條狗。我...

機器學習中的維數災難

在看機器學習的 時,經常會看到有作者提到 curse of dimensionality 中文譯為 維數災難 這到底是乙個什麼樣的 災難 本文將通過乙個例子來介紹這令人討厭的 curse of dimensionality 以及它在分類問題中的重要性。假設現在有一組 每一張 裡有乙隻貓或者一條狗。我...