как проецировать новые наборы данных на пространство PCA в matplotlib?

У меня есть набор данных с 68 измерениями * 100 наблюдений для создания пространства pca с использованием matplotlib в python.

Теперь у меня есть еще один набор данных (x) с 6 измерениями * 100 наблюдений. Можно ли спроецировать эти данные на созданное ранее пространство PCA?

Я пытался использовать pca_space.project(x) для проецирования, но размеры пространства pca не соответствуют новому набору данных, это не работает.


person YC.Chui    schedule 19.08.2014    source источник
comment
Я не думаю, что это действительно имеет смысл. Преобразование PCA отображает исходное пространство данных в пространство PCA. Если исходное пространство данных имеет 68 измерений, областью преобразования является 68-мерное пространство. Как вы предполагаете, что 6-мерное пространство связано с этим?   -  person BrenBarn    schedule 19.08.2014
comment
Я хотел бы показать, как каждая переменная в новом наборе данных связана с каждым основным компонентом, и отобразить их на двумерном графике (ПК1 против ПК2). Если я сделаю точечный продукт для каждой переменной в x и данных на каждом ПК, например. все наблюдения над первыми переменными x *. все наблюдения на ПК1, будет ли возвращаемое значение подходящим для сопоставления этой переменной на ПК1?   -  person YC.Chui    schedule 19.08.2014
comment
Я думаю, что для этого вам понадобится дополнительная информация о том, как сопоставить новые измерения с существующим пространством PCA. Я не совсем понимаю, что вы имеете в виду с этой идеей точечного продукта. Вы можете поставить точки только над двумя векторами одинакового размера. Количество измерений в ваших новых данных (6) совпадает с количеством измерений PCA?   -  person BrenBarn    schedule 19.08.2014
comment
Новые данные будут 6*100, а результат (исходная матрица данных с точки зрения ПК) PCA будет 68*100. Если я возьму одну переменную из новых данных (вектор 1 * 100) и результат PC1 (вектор 1 * 100) и сделаю скалярное произведение двух. Это даст мне значение, но это значение с точки зрения PC1?   -  person YC.Chui    schedule 19.08.2014
comment
Я не думаю, что это будет иметь смысл, поскольку эти два вектора пересекают точки данных (т. Е. Ваш вектор 1 * 100 действительно включает один элемент из каждого из 100 различных векторов). Я думаю, вам лучше спросить об этом на Cross Validated или Data Science SE, поскольку реальная проблема здесь, похоже, заключается в концептуальном вопросе о том, как использовать PCA, а не о том, как его программировать.   -  person BrenBarn    schedule 19.08.2014


Ответы (1)


Даны 2 случайных многомерных гауссиана:

mu_vec1 = np.array([0,0,0])
cov_mat1 = np.array([[1,0,0],[0,1,0],[0,0,1]])
class1_sample = np.random.multivariate_normal(mu_vec1, cov_mat1, 20).T
assert class1_sample.shape == (3,20), "The matrix has not the dimensions 3x20"

mu_vec2 = np.array([1,1,1])
cov_mat2 = np.array([[1,0,0],[0,1,0],[0,0,1]])
class2_sample = np.random.multivariate_normal(mu_vec2, cov_mat2, 20).T
assert class1_sample.shape == (3,20), "The matrix has not the dimensions 3x20"

Одним из примеров сокращения трехмерного пространства в подпространство двухмерных объектов с использованием matplotlib может быть

from matplotlib.mlab import PCA as mlabPCA

mlab_pca = mlabPCA(all_samples.T)

print('PC axes in terms of the measurement axes'\
        ' scaled by the standard deviations:\n',\
          mlab_pca.Wt)

plt.plot(mlab_pca.Y[0:20,0],mlab_pca.Y[0:20,1], 'o', markersize=7,\
        color='blue', alpha=0.5, label='class1')
plt.plot(mlab_pca.Y[20:40,0], mlab_pca.Y[20:40,1], '^', markersize=7,\
        color='red', alpha=0.5, label='class2')

plt.xlabel('x_values')
plt.ylabel('y_values')
plt.xlim([-4,4])
plt.ylim([-4,4])
plt.legend()
plt.title('Transformed samples with class labels from matplotlib.mlab.PCA()')

plt.show()

введите здесь описание изображения

Но обратите внимание, что mlabPCA масштабирует переменные до единичной дисперсии (стандартизация). Это может быть или не быть тем, что вы хотите. Если вам нужен больший контроль, я предлагаю использовать пакет sckit-learn:

from sklearn.decomposition import PCA as sklearnPCA

sklearn_pca = sklearnPCA(n_components=2)
sklearn_transf = sklearn_pca.fit_transform(all_samples.T)

plt.plot(sklearn_transf[0:20,0],sklearn_transf[0:20,1],\
     'o', markersize=7, color='blue', alpha=0.5, label='class1')
plt.plot(sklearn_transf[20:40,0], sklearn_transf[20:40,1],\
     '^', markersize=7, color='red', alpha=0.5, label='class2')

plt.xlabel('x_values')
plt.ylabel('y_values')
plt.xlim([-4,4])
plt.ylim([-4,4])
plt.legend()
plt.title('Transformed samples with class labels from matplotlib.mlab.PCA()')

plt.show()

введите здесь описание изображения

person Community    schedule 19.08.2014