Нарисуйте заштрихованную область, представляющую промежуток двух векторов в трехмерном графике. - PullRequest
0 голосов
/ 15 апреля 2020

Я хочу сделать визуализацию PCA, подобную показанной ниже:

plane spanned by principal components

Кривая представляет данные, а заштрихованная область - это плоскость охватываются s1 и s2, которые являются двумя основными компонентами. Учитывая векторы s1 и s2, я хотел бы повторить эту цифру. Есть ли способ определить диапазон векторов s1 и s2 и построить его как заштрихованную поверхность? Вот мой код, который заставляет меня строить векторы:

t = 40 # number of data points for each neuron
n = 50 # number of neurons

# generate fake firing rate matrix
r = np.ndarray(shape=(n,t))
for n_ in range(n):
    A = np.random.randint(1,5) # amplitude
    angFreq = np.random.uniform(low=0.1, high=0.5) # angular frequency
    phase = np.random.rand() # phase
    for t_ in range(t):
        r[n_,t_] = (A*np.sin(angFreq*t_ + phase**2) + 4) / 10 

# pick 3 neurons at random to work with
possible = np.arange(n)
np.random.shuffle(possible)
picks = possible[:3]

# plot neurons
for i in picks:
    fig = plt.figure(figsize=(4,2))
    plt.scatter(np.arange(t),r[i,:], s=20 ,c='grey',alpha=0.6,edgecolor='black')
    plt.plot(np.arange(t),r[i,:],c='grey', linewidth=2)
    plt.title('Neuron {}'.format(str(i)))
    plt.show()

# PCA
K = 2 # number of latent variables
data = r[picks,:] # grabbing the 3 randomly chosen neurons
data_cov = data @ data.T # covariance matrix (<x,x.T>)
u, s, v = np.linalg.svd(data_cov, full_matrices=True) # svd
s = v[:K,:] # top K eigenvectors

# plot the 3 neurons in population space
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
ax.scatter(data[0,:], data[1,:], data[2,:], s=70, c='gray', edgecolors='w')
ax.plot(data[0,:], data[1,:], data[2,:], c='gray', alpha=0.6)

# plot s1 and s2
origin = np.ndarray(shape=(3,1)) # define origin to plot singular vectors
origin[0] = np.mean(ax.get_xlim())
origin[1] = np.mean(ax.get_ylim())
origin[2] = np.mean(ax.get_zlim())

ax.quiver(origin[0],origin[1],origin[2],s[0,0],s[0,1],s[0,2])
ax.quiver(origin[0],origin[1],origin[2],s[1,0],s[1,1],s[1,2])
plt.show()
...