Анализ главных компонентов в машинном обучении
Анализ главных компонентов (PCA) – это алгоритм уменьшения размерности. PCA – один из самых простых и интуитивно понятных способов уменьшить размеры набора данных. В этой статье я покажу вам анализ основных компонентов в машинном обучении и его реализацию с использованием Python.
Анализ главных компонентов
В машинном обучении анализ главных компонентов (PCA) является самым широко используемым алгоритмом для уменьшения размерности. Он работает, определяя ближайшую к набору данных гиперплоскость, а затем просто проецирует на нее данные. PCA выбирает ось, которая сохраняет максимальное количество отклонений, потому что это ось, которая минимизирует среднеквадратичную ошибку между исходными данными и их проекциями на ось. Так работает анализ главных компонентов.
Он определяет ось, которая представляет наибольшую вариативность обучающих данных. Затем он находит вторую ось, которая ортогональна первой оси, и представляет наибольшую величину оставшейся дисперсии.
Для каждого основного компонента PCA находит единичный вектор с центром в нуле, указывающий в направлении основного компонента. Поскольку два противоположных вектора лежат на одной оси, направления единичных векторов, возвращаемых PCA, нестабильны. В некоторых случаях пара единичных векторов может вращаться или переворачиваться, но плоскость, которую они представляют, обычно остается той же самой.
Виды PCA
Есть четыре метода реализации PCA:
- Стандартный PCA: Стандартный PCA – это версия по умолчанию, но она работает только в том случае, если данные умещаются в памяти.
- Инкрементный PCA: инкрементный PCA полезен для больших наборов данных, которые не помещаются в памяти стандартного PCA, но он медленнее, чем обычный PCA, поэтому, если данные умещаются в памяти, вы должны использовать стандартный PCA. Инкрементальный PCA полезен для онлайн-задач, когда вам нужно на лету уменьшать размеры набора данных каждый раз, когда приходит новая выборка данных.
- Рандомизированный PCA. Рандомизированный PCA очень полезен, когда вы хотите резко уменьшить размерность, и чтобы набор данных умещался в памяти. В таких случаях он работает быстрее, чем стандартный анализ главных компонент.
- Kernal PCA: Kernal PCA предпочтительнее, только если набор данных является нелинейным.
Анализ главных компонентов с использованием Python
Чтобы реализовать анализ основных компонентов с помощью Python, мы можем использовать класс PCA, предоставляемый библиотекой Scikit-Learn на Python. Вот как мы можем реализовать анализ главных компонентов с помощью Python, чтобы уменьшить размерность данных:
import numpy as np np.random.seed(4) m = 60 w1, w2 = 0.1, 0.3 noise = 0.1 angles = np.random.rand(m) * 3 * np.pi / 2 - 0.5 X = np.empty((m, 3)) from sklearn.decomposition import PCA pca = PCA(n_components = 2) X2D = pca.fit_transform(X) print(X2D)
Результат:
[[-1.31210990e+275 -1.79205512e+256]
[-1.31210990e+275 -1.79205512e+256]
[-1.31210990e+275 -1.79207044e+256]
[-1.31210990e+275 -1.79130276e+256]
[-1.31210990e+275 -1.79205512e+256]
[-1.31210990e+275 -1.79205512e+256]
[-1.31210990e+275 -1.79205512e+256]
[-1.31210990e+275 -1.79205512e+256]
[-1.31210990e+275 -1.79205512e+256]
[-1.31210990e+275 -1.79205512e+256]
[-1.31210990e+275 -1.79205512e+256]
[-1.31210990e+275 5.25933599e+257]
[-1.31210990e+275 -1.79205512e+256]
[-1.31210990e+275 -1.79205512e+256]
[-1.31210990e+275 -1.79205512e+256]
[-1.31210990e+275 -1.79205512e+256]
[-1.31210990e+275 -2.90503278e+256]
[-1.31210990e+275 -1.79205512e+256]
[-1.31210990e+275 -1.79205512e+256]
[-1.31210990e+275 -1.79205512e+256]
[-1.31210990e+275 -1.79205512e+256]
[-1.31210990e+275 -1.79205512e+256]
[-1.31210990e+275 -1.79205512e+256]
[-1.31210990e+275 -1.79205512e+256]
[-1.31210990e+275 -1.79147236e+256]
[-1.31210990e+275 -1.79166311e+256]
[-1.31210990e+275 -1.79205512e+256]
[-1.31210990e+275 -1.79205512e+256]
[-1.31210990e+275 -1.79205612e+256]
[-1.31210990e+275 -1.79205512e+256]
[-1.31210990e+275 -1.79205512e+256]
[-1.31210990e+275 5.25908783e+257]
[-1.31210990e+275 -1.79205512e+256]
[-1.31210990e+275 -1.79165620e+256]
[-1.31210990e+275 -1.79205512e+256]
[-1.31210990e+275 -1.79205512e+256]
[-1.31210990e+275 -1.79205511e+256]
[-1.31210990e+275 -1.79205512e+256]
[-1.31210990e+275 -1.79205512e+256]
[-1.31210990e+275 -1.79205512e+256]
[-1.31210990e+275 -1.79205512e+256]
[-1.31210990e+275 -1.79205512e+256]
[-1.31210990e+275 -1.79205512e+256]
[-1.31210990e+275 -1.79205512e+256]
[-1.31210990e+275 -1.79205512e+256]
[-1.31210990e+275 -1.79205512e+256]
[-1.31210990e+275 -1.79205512e+256]
[-1.31210990e+275 -1.79205512e+256]
[-1.31210990e+275 -1.79205512e+256]
[-1.31210990e+275 -1.79205512e+256]
[-1.31210990e+275 -1.79205512e+256]
[-1.31210990e+275 -1.79205512e+256]
[-1.31210990e+275 -3.71913271e+256]
[-1.31210990e+275 -1.79116717e+256]
[-1.31210990e+275 -1.79205612e+256]
[ 7.74144843e+276 -1.02176393e+241]
[-1.31210990e+275 -1.79205512e+256]
[-1.31210990e+275 -1.79205512e+256]]
При реализации PCA вы должны знать, что этот алгоритм предполагает, что набор данных сосредоточен вокруг источника. Класс PCA, предоставляемый scikit-learn, заботится о центрировании данных вокруг источника. Но если вы хотите реализовать его без использования Scikit-learn, не забудьте сначала отцентрировать данные. Вот как можно реализовать анализ основных компонентов с помощью Python без использования библиотеки scikit-learn:
X_centered = X - X.mean(axis=0) U, s, Vt = np.linalg.svd(X_centered) c1 = Vt.T[:, 0] c2 = Vt.T[:, 1] m, n = X.shape S = np.zeros(X_centered.shape) S[:n, :n] = np.diag(s) np.allclose(X_centered, U.dot(S).dot(Vt)) W2 = Vt.T[:, :2] X2D = X_centered.dot(W2) print(X2D)
Результат:
[[-1.31210990e+275 1.76218792e+256]
[-1.31210990e+275 1.76218792e+256]
[-1.31210990e+275 1.76220325e+256]
[-1.31210990e+275 1.76143556e+256]
[-1.31210990e+275 1.76218792e+256]
[-1.31210990e+275 1.76218792e+256]
[-1.31210990e+275 1.76218792e+256]
[-1.31210990e+275 1.76218792e+256]
[-1.31210990e+275 1.76218792e+256]
[-1.31210990e+275 1.76218792e+256]
[-1.31210990e+275 1.76218792e+256]
[-1.31210990e+275 -5.26232271e+257]
[-1.31210990e+275 1.76218792e+256]
[-1.31210990e+275 1.76218792e+256]
[-1.31210990e+275 1.76218792e+256]
[-1.31210990e+275 1.76218792e+256]
[-1.31210990e+275 2.87516558e+256]
[-1.31210990e+275 1.76218792e+256]
[-1.31210990e+275 1.76218792e+256]
[-1.31210990e+275 1.76218792e+256]
[-1.31210990e+275 1.76218792e+256]
[-1.31210990e+275 1.76218792e+256]
[-1.31210990e+275 1.76218792e+256]
[-1.31210990e+275 1.76218792e+256]
[-1.31210990e+275 1.76160516e+256]
[-1.31210990e+275 1.76179592e+256]
[-1.31210990e+275 1.76218792e+256]
[-1.31210990e+275 1.76218792e+256]
[-1.31210990e+275 1.76218893e+256]
[-1.31210990e+275 1.76218792e+256]
[-1.31210990e+275 1.76218792e+256]
[-1.31210990e+275 -5.26207455e+257]
[-1.31210990e+275 1.76218792e+256]
[-1.31210990e+275 1.76178901e+256]
[-1.31210990e+275 1.76218792e+256]
[-1.31210990e+275 1.76218792e+256]
[-1.31210990e+275 1.76218792e+256]
[-1.31210990e+275 1.76218792e+256]
[-1.31210990e+275 1.76218792e+256]
[-1.31210990e+275 1.76218792e+256]
[-1.31210990e+275 1.76218792e+256]
[-1.31210990e+275 1.76218792e+256]
[-1.31210990e+275 1.76218792e+256]
[-1.31210990e+275 1.76218792e+256]
[-1.31210990e+275 1.76218792e+256]
[-1.31210990e+275 1.76218792e+256]
[-1.31210990e+275 1.76218792e+256]
[-1.31210990e+275 1.76218792e+256]
[-1.31210990e+275 1.76218792e+256]
[-1.31210990e+275 1.76218792e+256]
[-1.31210990e+275 1.76218792e+256]
[-1.31210990e+275 1.76218792e+256]
[-1.31210990e+275 1.76222579e+256]
[-1.31210990e+275 1.76218793e+256]
[-1.31210990e+275 3.68926551e+256]
[-1.31210990e+275 1.76129997e+256]
[-1.31210990e+275 1.76218893e+256]
[ 7.74144843e+276 1.76216447e+256]
[-1.31210990e+275 1.76218792e+256]
[-1.31210990e+275 1.76218792e+256]]
Резюме
PCA можно использовать для уменьшения размерности большинства наборов данных, даже если набор данных сильно нелинейный, потому что он может, по крайней мере, избавиться от ненужных измерений. Никогда не используйте его, если в данных нет ненужных измерений, так как это приведет к потере слишком большого количества информации.
Надеюсь, вам понравилась эта статья об анализе основных компонентов в машинном обучении и его реализации с использованием Python.