我正試圖在Python中演示維度的詛咒。曲線應該是這樣的:
我想對從2到30的維度做這件事,步長為1,對于每個維度我想生成100個隨機資料點。有誰能告訴我,我怎樣才能做到這一點? 以下是我目前的代碼:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import os
import math
from random import randint
下面,我正在為變數x和y生成隨機值,然后我使用np.linalg.norm計算歐氏距離。之后,我將該值存盤在一個串列中。
x=np. array([randint(0, 101),randint(0, 101) ])
y=np.array([randint(0, 101),randint(0, 101) ])
ed_list = []
d=np.array([1,2] )
ed = np.linalg.norm(x - y)
ed_list.append(ed)
ed_list
print(x)
現在,我使用一個for回圈來生成更多的隨機值,然后存盤和繪制它。
for i in range(2, 50)。)
xval = randint(0, 101)
yval = randint(0, 101)
x = np.append(x,xval)
y = np.append(y,yval)
d= np.append(d,i 1)
try:
ed = np.linalg.norm(x - y)
ed_list.append(ed)
ed = 0: ed = np.linalg.norm(x - y).
except:
ed = 0
print(x, y)
plt.plot(ed_list)
plt.xlabel('Number of dimensions')
plt.ylabel('Euclidean Distance')
plt.show()
然而,我的曲線看起來是這樣的,因為我只是繪制了歐氏距離,而不是按照上面 "維度的詛咒 "圖片中的公式進行計算。
所以我有兩個問題。如何添加在詛咒維度圖片中給出的公式。另外,對于維度2到30和我上面所說的隨機100個資料點,我如何做到這一點。如果有人能幫助我,那就太好了!
uj5u.com熱心網友回復:你所顯示的是兩點之間的距離,因為你增加了額外的維度。自然地,這將不斷地增長,越來越大。維度的詛咒說,給定一整組點,P,和一個參考點,Q,如果你計算從Q到P中每個點的距離,最大距離和最小距離之間的差異會變成0。 你需要遠遠超過2個點來顯示。
對于每個維度,生成一堆點(我選了10000個),隨機選取另一個點,計算與每個點的距離,從這些距離中抓取最小和最大,并繪制結果。
import numpy as np
import matplotlib.pyplot as plt
import os
import math
deltas = []
for N in range(2,50)。
# 在N維度上生成1000個隨機點。
P = [np.random. randint(-100, 100, N) for _ in range(10000)]
Q = np.random.randint(-100,100, N)
diffs = [np.linalg.norm(p-Q) for p in P]
mxd = max(diffs)
mnd = min(diffs)
delta = math.log10(mxd-mnd)/mnd
deltas.append( delta )
plt.plot(range(2,50),deltas)
plt.xlabel('Number of dimensions')
plt.ylabel('Euclidean Distance')
plt.show()
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/328928.html
標籤:



