Я не уверен, приемлем ли здесь такой вопрос (связанный с PCA) или нет.
Однако, как известно, рекомендуется выполнять MEAN CENTER перед PCA. На самом деле у меня есть 2 разных класса (в каждом классе разные участники). Моя цель состоит в том, чтобы различать и классифицировать эти 2 класса. Тем не менее, я не уверен, что MEAN CENTER следует применять ко всему набору данных или к каждому классу.
Лучше сделать отдельно? (если это так, то должны ли ПРЕДПРОЦЕССНЫЕ ЭТАПЫ тоже быть отдельно?) или это не имеет никакого смысла?






PCA более или менее по определению является SVD с центрированием данных.
В зависимости от реализации (если вы используете PCA из библиотеки) центрирование применяется автоматически, например. sklearn - потому что, как сказано, он должен быть центрирован по определению.
Таким образом, для sklearn вам не нужен этот этап предварительной обработки, и в целом вы применяете его ко всем своим данным.
PCA без присмотра можно использовать для поиска более значимого и репрезентативного представления для ваших классов впоследствии. Таким образом, вам нужно, чтобы все ваши сэмплы находились в одном и том же функциональном пространстве через один и тот же PCA.
Вкратце: вы выполняете PCA один раз для всех ваших (тренировочных) данных и должны быть сосредоточены на всех ваших (тренировочных) данных. Такие библиотеки, как sklarn, выполняют центрирование автоматически.
Чтобы быть более конкретным и привести пример, у меня есть 2 разных класса; Здоровый и Рак. У каждого класса есть своя популяция/наблюдение.
Есть две вещи, которые приходят мне на ум. а) если вы хотите классифицировать/проецировать неизвестный образец и у вас есть два разных средства, какое из них вы примените? а.2) По крайней мере, для PCA вы можете применить только один глобальный, как вы сказали, можно вычесть оба, но затем сделать SVD из неглобально центрированных данных. Я не могу сказать, каковы будут результаты. б) У PCA есть одна «проблема», заключающаяся в том, что некоторые функции линейны, например. в данных о здоровье могут быть нелинейно связаны и не могут быть обнаружены PCA как таковые. -> может иметь смысл иметь два PCA, применять каждый и проверять, где неизвестный образец лучше подходит. Должен быть протестирован.
Большое спасибо. Очень поддерживает. Что касается вопроса, я пришел к такому выводу из одного из коммерческих программ, который позволяет выполнять различные типы центрирования. В этой ссылке wiki.eigenvector.com/index.php?title=Classcentroid они дают подробную информацию о центрировании классов. Как вариант, они используют CLASS CENTROID CENTERING, который в основном помогает вам получить среднее значение двух классов. Кажется интригующим!
PCA — это просто вращение, опционально сопровождаемое проекцией в пространство меньшего измерения. Он находит оси максимальной дисперсии (которые являются главными осями инерции вашего облака точек), а затем поворачивает набор данных, чтобы выровнять эти оси с вашей системой координат. Вы можете решить, сколько таких осей вы хотели бы сохранить, что означает, что за вращением следует проекция на первые k оси наибольшей дисперсии с k размерностью пространства представления, которое вы выбрали.
Имея это в виду, опять же, как и для расчета осей инерции, вы можете решить искать такие оси через центр масс вашего облака (среднее значение) или через любое произвольное начало по выбору. В первом случае вы бы центрировали свои данные по среднему, а во втором вы можете перевести данные в любую произвольную точку, в результате чего будет уменьшена важность самой внутренней формы облака и увеличена важность расстояния между центр масс и произвольная точка. Таким образом, на практике вы почти всегда будете центрировать свои данные.
Вы также можете стандартизировать свои данные (центрировать и разделить на стандартное отклонение, чтобы получить дисперсию 1 по каждой координате) или даже отбелить свои данные.
В любом случае вы захотите применить одни и те же преобразования ко всему набору данных, а не к каждому классу. Если бы вы применяли преобразование класс за классом, любое расстояние, существующее между центрами тяжести каждого из них, было бы уменьшено до 0, и вы, вероятно, наблюдали бы свернутое представление с двумя классами как перекрывающимися. Это может быть интересно, если вы хотите наблюдать внутреннюю форму каждого класса, но тогда вы также должны применять PCA отдельно для каждого класса.
Обратите внимание, что PCA может облегчить вам визуализацию двух классов (без гарантий, если данные действительно n-мерные без многомерного вложения). Но ни при каких обстоятельствах это не облегчило бы различение между ними. Во всяком случае, PCA уменьшит различимость ваших классов, и часто бывает так, что проекция будет смешивать классы (увеличивать неоднозначность), которые в противном случае совершенно различны и, например. сепарабельно с простой гиперповерхностью.
Большое спасибо за ваше информативное объяснение. Еще раз упомянем одну вещь: это означает, что даже если классы (в данном случае группы здоровых и больных раком) имеют свою собственную популяцию/пациентов, мы должны выполнять среднее центрирование для всего набора данных, а не для каждого класса. ? Разве это не причина, по которой мы должны центрировать среднее значение для каждого класса только потому, что гравитация каждого из них уже различна?
Как я уже сказал, все зависит от того, что вы хотите делать с PCA. На самом деле это просто инструмент визуализации, помогающий интерпретировать ваш набор данных. Если вас интересует форма каждого класса (независимо от их взаимосвязи), то центрируйте (и, возможно, стандартизируйте) каждый класс отдельно, а затем также используйте PCA независимо для каждого. Если вы хотите визуализировать два класса и то, как они связаны друг с другом, обработайте (среднее, стандартное, PCA) весь набор данных вместе. Если вы хотите классифицировать, то вообще не используйте PCA, а вместо этого обучите классификатор.
Большое спасибо за хорошее объяснение и ваше драгоценное время!
Ближайший восточный сосед поможет вам различить эти два класса. Также попробуйте tsne визуализировать классы данных, используя более высокие измерения.
def pca_classifier(X, y, n_components=2, n_neighbors=1):
"""
X: numpy array of shape (n_samples, n_features)
y: numpy array of shape (n_samples, )
n_components: int, number of components to keep
n_neighbors: int, number of neighbors to use in the knn classifier
"""
# 1. PCA
pca = PCA(n_components=n_components)
X_pca = pca.fit_transform(X)
# 2. KNN
knn = KNeighborsClassifier(n_neighbors=n_neighbors)
knn.fit(X_pca, y)
# 3. plot
plt.figure(figsize=(8, 6))
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y, cmap=plt.cm.Set1, edgecolor='k')
plt.xlabel('PC1')
plt.ylabel('PC2')
plt.title('PCA')
plt.show()
return knn
Спасибо за этот ценный комментарий. Еще одно; Я слышал, что центрирование должно производиться для каждого класса, потому что каждый класс репрезентативен для своей совокупности. Следовательно, есть еще один термин, называемый «центром класса», который берет среднее значение каждого класса и вычитает среднее значение из каждого наблюдения. Однако я не совсем уверен.