Я хочу сделать визуализацию PCA, подобную показанной ниже:
Кривая представляет данные, а заштрихованная область - это плоскость охватываются 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()