Среднее центрирование до PCA

Я не уверен, приемлем ли здесь такой вопрос (связанный с PCA) или нет.

Однако, как известно, рекомендуется выполнять MEAN CENTER перед PCA. На самом деле у меня есть 2 разных класса (в каждом классе разные участники). Моя цель состоит в том, чтобы различать и классифицировать эти 2 класса. Тем не менее, я не уверен, что MEAN CENTER следует применять ко всему набору данных или к каждому классу.

Лучше сделать отдельно? (если это так, то должны ли ПРЕДПРОЦЕССНЫЕ ЭТАПЫ тоже быть отдельно?) или это не имеет никакого смысла?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
66
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

PCA более или менее по определению является SVD с центрированием данных.

В зависимости от реализации (если вы используете PCA из библиотеки) центрирование применяется автоматически, например. sklearn - потому что, как сказано, он должен быть центрирован по определению.
Таким образом, для sklearn вам не нужен этот этап предварительной обработки, и в целом вы применяете его ко всем своим данным.

PCA без присмотра можно использовать для поиска более значимого и репрезентативного представления для ваших классов впоследствии. Таким образом, вам нужно, чтобы все ваши сэмплы находились в одном и том же функциональном пространстве через один и тот же PCA.


Вкратце: вы выполняете PCA один раз для всех ваших (тренировочных) данных и должны быть сосредоточены на всех ваших (тренировочных) данных. Такие библиотеки, как sklarn, выполняют центрирование автоматически.

Спасибо за этот ценный комментарий. Еще одно; Я слышал, что центрирование должно производиться для каждого класса, потому что каждый класс репрезентативен для своей совокупности. Следовательно, есть еще один термин, называемый «центром класса», который берет среднее значение каждого класса и вычитает среднее значение из каждого наблюдения. Однако я не совсем уверен.

vdu16 30.01.2023 17:04

Чтобы быть более конкретным и привести пример, у меня есть 2 разных класса; Здоровый и Рак. У каждого класса есть своя популяция/наблюдение.

vdu16 30.01.2023 17:07

Есть две вещи, которые приходят мне на ум. а) если вы хотите классифицировать/проецировать неизвестный образец и у вас есть два разных средства, какое из них вы примените? а.2) По крайней мере, для PCA вы можете применить только один глобальный, как вы сказали, можно вычесть оба, но затем сделать SVD из неглобально центрированных данных. Я не могу сказать, каковы будут результаты. б) У PCA есть одна «проблема», заключающаяся в том, что некоторые функции линейны, например. в данных о здоровье могут быть нелинейно связаны и не могут быть обнаружены PCA как таковые. -> может иметь смысл иметь два PCA, применять каждый и проверять, где неизвестный образец лучше подходит. Должен быть протестирован.

Daraan 30.01.2023 17:40

Большое спасибо. Очень поддерживает. Что касается вопроса, я пришел к такому выводу из одного из коммерческих программ, который позволяет выполнять различные типы центрирования. В этой ссылке wiki.eigenvector.com/index.php?title=Classcentroid они дают подробную информацию о центрировании классов. Как вариант, они используют CLASS CENTROID CENTERING, который в основном помогает вам получить среднее значение двух классов. Кажется интригующим!

vdu16 30.01.2023 18:27
Ответ принят как подходящий

PCA — это просто вращение, опционально сопровождаемое проекцией в пространство меньшего измерения. Он находит оси максимальной дисперсии (которые являются главными осями инерции вашего облака точек), а затем поворачивает набор данных, чтобы выровнять эти оси с вашей системой координат. Вы можете решить, сколько таких осей вы хотели бы сохранить, что означает, что за вращением следует проекция на первые k оси наибольшей дисперсии с k размерностью пространства представления, которое вы выбрали.

Имея это в виду, опять же, как и для расчета осей инерции, вы можете решить искать такие оси через центр масс вашего облака (среднее значение) или через любое произвольное начало по выбору. В первом случае вы бы центрировали свои данные по среднему, а во втором вы можете перевести данные в любую произвольную точку, в результате чего будет уменьшена важность самой внутренней формы облака и увеличена важность расстояния между центр масс и произвольная точка. Таким образом, на практике вы почти всегда будете центрировать свои данные.

Вы также можете стандартизировать свои данные (центрировать и разделить на стандартное отклонение, чтобы получить дисперсию 1 по каждой координате) или даже отбелить свои данные.

В любом случае вы захотите применить одни и те же преобразования ко всему набору данных, а не к каждому классу. Если бы вы применяли преобразование класс за классом, любое расстояние, существующее между центрами тяжести каждого из них, было бы уменьшено до 0, и вы, вероятно, наблюдали бы свернутое представление с двумя классами как перекрывающимися. Это может быть интересно, если вы хотите наблюдать внутреннюю форму каждого класса, но тогда вы также должны применять PCA отдельно для каждого класса.

Обратите внимание, что PCA может облегчить вам визуализацию двух классов (без гарантий, если данные действительно n-мерные без многомерного вложения). Но ни при каких обстоятельствах это не облегчило бы различение между ними. Во всяком случае, PCA уменьшит различимость ваших классов, и часто бывает так, что проекция будет смешивать классы (увеличивать неоднозначность), которые в противном случае совершенно различны и, например. сепарабельно с простой гиперповерхностью.

Большое спасибо за ваше информативное объяснение. Еще раз упомянем одну вещь: это означает, что даже если классы (в данном случае группы здоровых и больных раком) имеют свою собственную популяцию/пациентов, мы должны выполнять среднее центрирование для всего набора данных, а не для каждого класса. ? Разве это не причина, по которой мы должны центрировать среднее значение для каждого класса только потому, что гравитация каждого из них уже различна?

vdu16 30.01.2023 18:34

Как я уже сказал, все зависит от того, что вы хотите делать с PCA. На самом деле это просто инструмент визуализации, помогающий интерпретировать ваш набор данных. Если вас интересует форма каждого класса (независимо от их взаимосвязи), то центрируйте (и, возможно, стандартизируйте) каждый класс отдельно, а затем также используйте PCA независимо для каждого. Если вы хотите визуализировать два класса и то, как они связаны друг с другом, обработайте (среднее, стандартное, PCA) весь набор данных вместе. Если вы хотите классифицировать, то вообще не используйте PCA, а вместо этого обучите классификатор.

Pierre D 30.01.2023 19:00

Большое спасибо за хорошее объяснение и ваше драгоценное время!

vdu16 30.01.2023 19:24

Ближайший восточный сосед поможет вам различить эти два класса. Также попробуйте 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

Другие вопросы по теме