Каталог предыдущих статей по теме:
- Линейная регрессия для машинного обучения
- Логистическая регрессия и реализация машинного обучения на Python
- Борьба с проектами машинного обучения Обнаружение аномалий данных транзакций
- Дерево решений для машинного обучения
- Реализация дерева решений машинного обучения (Decision Tree) на Python
- PCA (анализ основных компонентов) для машинного обучения
- разработка функций машинного обучения
Алгоритм уменьшения размерности, PCA (анализ основных компонентов), представлен ниже.
В машинном обучении существует проблема, называемая проклятием размерности.В реальных проектах машинного обучения размерность выборочных данных, которые мы хотим обработать, может составлять тысячи, даже сотни тысяч и более.В этом случае потребуется много времени для непосредственного обучения и моделирования исходных выборочных данных, и соответствующее потребление ресурсов неприемлемо. В это время нам необходимо уменьшить размерность данных. Конечно, уменьшение размерности означает потерю информации, но с учетом фактические данные Часто корреляция сама по себе, мы можем найти способы максимально уменьшить потерю информации при уменьшении размерности.
PCA — это метод уменьшения размерности со строгой математической основой, который получил широкое распространение.
Прежде чем подробно рассказать об алгоритме PCA, давайте рассмотрим соответствующие знания в линейной алгебре.Во-первых, необходимо подчеркнуть, что векторы, упомянутые ниже, относятся к векторам-столбцам, если не указано иное.
1. Внутреннее произведение и проекция векторов
Внутренний продукт двух векторов одинаковой размерности определяется как:
Теперь давайте посмотрим на геометрический смысл скалярного произведения. Предположим, что A и B — два n-мерных вектора. Для простоты предположим, что A и B — двумерные векторы, тогда. Тогда A и B могут быть представлены двумя направленными отрезками, исходящими из начала координат на двумерной плоскости, как показано на следующем рисунке:
Теперь проведем вертикальную линию от точки А до линии, где находится В. Мы знаем, что пересечение вертикальной линии и В называется проекцией А на В, и пусть угол между А и В равен а, тогда длина вектора проекции равна,в
- модуль вектора A, то есть скалярная длина отрезка A
Следовательно, если модуль вектора B равен 1, скалярное произведение A и B равно длине вектора проекции A на прямую, где находится B!
Преобразование базиса в базис
Мы знаем, что двумерный вектор может соответствовать направленному отрезку прямой, начинающемуся с начала координат в двумерной декартовой системе координат. Например, следующий вектор:
Вектор на рисунке можно представить в виде (3, 2), где 3 означает, что значение проекции вектора на ось X равно 3, 2 означает, что значение проекции на ось Y равно 2.
То есть мы фактически неявно ввели определение: вектор длиной 1 в положительном направлении оси x и оси y является эталоном. Тогда вектор (3,2) на самом деле означает, что проекция на ось x равна 3, а проекция на ось y равна 2. Обратите внимание, что проекция является вектором, поэтому она может быть отрицательной.
Таким образом, вектор (x,y) на самом деле представляет собой линейную комбинацию: ?x(1,0)^\mathsf{T}+y(0,1)^\mathsf{T}? А здесь (1,0), (0,1) называется набором базиса в двумерном пространстве. также является набором ортонормированных базисов.
Причина, по которой мы выбираем (1,0) и (0,1) в качестве оснований по умолчанию, конечно, более удобна, потому что они представляют собой единичные векторы в положительных направлениях осей x и y соответственно, так что точка координаты и векторы на двумерной плоскости - одно однозначное соответствие, очень удобно. Но на самом деле любые два линейно независимых двумерных вектора могут стать множеством базисов.Так называемая линейно независимая двумерная плоскость интуитивно может рассматриваться как два вектора, не лежащие на одной прямой.
Например, (1,1) и (-1,1) также могут быть набором оснований. Вообще говоря, мы хотим, чтобы модуль базиса был равен 1, потому что из значения скалярного произведения видно, что если модуль базиса равен 1, то удобно умножить базис на векторную точку, чтобы непосредственно получить его координаты на новой основе. ! На самом деле, для любого вектора мы всегда можем найти вектор, модуль которого равен 1 в том же направлении, если два компонента делятся на модуль. Например, указанный выше базис может стать ?(\frac{1}{\sqrt{2}},\frac{1}{\sqrt{2}}) и (-\frac{1}{\sqrt{2}) },\frac{1}{\sqrt{2}}). ?
Теперь, мы хотим получить координаты (3,2) на новом базисе, то есть спроецированные векторные значения в двух направлениях, тогда по геометрическому смыслу скалярного произведения нам нужно вычислить только (3 ,2) и два базисных внутреннего произведения, нетрудно получить новые координаты как. На следующем рисунке показана принципиальная схема нового базиса и значения координат (3,2) на новом базисе:
Матричное представление базисного преобразования
Из предыдущего описания мы знаем, что преобразование (3,2) в координаты на новом базисе означает использование (3,2) для выполнения операции скалярного произведения с каждым новым базисом. Мы можем кратко выразить это преобразование в форме умножения матриц:
Обобщая несколько векторов, предполагая, что есть m векторов, просто упорядочите двумерные векторы в матрицу с двумя строками и m-столбцами, а затем умножьте эту матрицу на «базовую матрицу» и получите все эти векторы под новой базой , значение. Например, (1,1), (2,2), (3,3), если вы хотите прямо сейчас преобразовать в набор оснований, вы можете выразить это так:
Отсюда мы видим, что базисное преобразование может быть выражено как умножение матриц
В общем, если у нас есть M N-мерных векторов и мы хотим преобразовать их в новое пространство, представленное R N-мерными векторами, то сначала R оснований формируются в матрицу A по строкам, а затем векторы формируются в матрицу B по столбцу, тогда произведение AB двух матриц является результатом преобразования, где m-й столбец AB является результатом преобразования m-го столбца в A. Математически выражается как:
Если R меньше N, это означает преобразование N-мерных данных в пространство с меньшими размерностями, поэтому представление этого матричного умножения также может представлять собой преобразование с уменьшением размерности.
Смысл умножения двух матриц состоит в том, чтобы преобразовать каждый столбец и вектор-столбец в правой матрице в пространство, представленное каждой строкой и вектором-строкой в левой матрице в качестве основы.
оптимизировать цель
Из вышеизложенного мы знаем, что, выбирая разный набор оснований, одному и тому же набору данных можно придать разные представления, и если количество оснований в наборе оснований меньше размерности самого вектора, эффект может быть достигнуто уменьшение размерности.
Тогда наша следующая задача состоит в том, как найти набор оптимального базиса, то есть если у нас есть набор N-мерных векторов, и теперь мы хотим свести его к K-мерному (K меньше N), то, как мы выбираем K Базис может сохранить информацию исходного N-мерного вектора в наибольшей степени.
Давайте начнем с конкретного примера, предполагая, что наши данные имеют 5 записей, как показано ниже:
Каждый столбец содержит часть данных, а каждая строка содержит поле, то есть функцию.
Прежде всего, для удобства последующей обработки мы обнуляем данные, то есть из всех значений в каждом поле (то есть каждой строке) вычитаем среднее значение поля.После обработки среднее значение каждого поля в новых данных равно 0. Преобразованные данные выглядят следующим образом:
Распределение в системе координат следующее:
Теперь мы хотим уменьшить эти данные до одного измерения, но максимально сохранить исходную информацию. Как с этим бороться?
Из вышеприведенного обсуждения мы знаем, что проблема фактически состоит в том, чтобы выбрать направление в двумерной плоскости и спроецировать все данные на линию, где это направление находится.Тогда как выбрать это направление (или базис) может быть более Как насчет сохраненной исходной информации? Интуитивный взгляд таков: мы хотим сделать проецируемые значения как можно более рассредоточенными.
Возьмем приведенный выше рисунок в качестве примера.Можно увидеть, что если вы спроецируете на ось X, две крайние левые точки будут перекрываться, а две средние точки будут перекрываться, поэтому проецируются четыре разные двумерные точки. осталось только два разных значения, что является серьезной потерей информации.Точно так же, если две верхние точки проецируются на ось Y, две точки, распределенные по оси X, также будут перекрываться. Таким образом, кажется, что ни ось x, ни y не являются лучшим выбором для проецирования. Мы интуитивно замечаем, что если мы спроецируем косую линию, проходящую через первый и третий квадранты, пять точек все еще можно будет различить после проецирования.
Далее сформулируем эту задачу с помощью конкретных математических методов
дисперсия
Выше мы обсуждали, что хотим, чтобы проецируемые значения были максимально разбросаны, а степень разброса можно было математически выразить через дисперсию. Дисперсия поля выражается как:
Поскольку мы обнулили среднее значение для каждого поля выше, поэтому:
Ковариация
Для описанной выше двумерной редукции к одномерной задаче достаточно найти направление, максимизирующее дисперсию. Однако для более высоких измерений существует проблема, которую необходимо решить. Рассмотрим задачу преобразования 3D в 2D. Как и раньше, сначала мы хотим найти направление, которое максимизирует дисперсию после проекции, что завершает выбор первого направления, а затем мы выбираем второе направление проекции.
Если мы просто выберем направление с наибольшей дисперсией, то очевидно, что это направление и первое направление должны быть "почти совпадающими". Очевидно, что такая размерность бесполезна, поэтому должны быть другие ограничения. Интуитивно, пусть два поля представляют как можно больше исходной информации, мы не хотим (линейной) корреляции между ними, потому что корреляция означает, что два поля не являются полностью независимыми, и должны быть повторяющиеся представления информации.
Математически ковариация двух полей может быть выражена как их корреляция:
Когда ковариация равна 0, это означает, что два поля полностью независимы. Чтобы сделать ковариацию равной 0, мы можем выбрать второй базис только в направлении, ортогональном первому базису (ортогонализация, внутренний продукт равен 0, что соответствует ковариации 0). Следовательно, два окончательно выбранных направления должны быть ортогональны.
На данный момент мы получили цель оптимизации задачи уменьшения размерности: Сведение набора N-мерных векторов к K-мерному (K больше 0, меньше N), цель состоит в том, чтобы выбрать K единиц (по модулю 1) ортонормированного базиса, чтобы после преобразования исходных данных в эту группу базис, каждое поле является парным. Взаимная ковариация равна 0, а дисперсия поля максимально велика (при ограничении ортогональности берутся наибольшие K дисперсий).
ковариационная матрица
Мы видим, что конечная цель тесно связана с дисперсией внутри поля и ковариацией между полями. Поэтому мы надеемся выразить их единым способом.После тщательного наблюдения мы обнаруживаем, что оба могут быть выражены в форме скалярного произведения, а скалярное произведение тесно связано с умножением матриц. Итак, наше вдохновение:
Предположим, у нас есть только два поля a и b, тогда мы формируем матрицу X по строкам:
Затем мы умножаем X на транспонирование X и умножаем на коэффициент 1/m:
Согласно алгоритму умножения матриц этот вывод легко обобщается на общий случай:
Предположим, у нас есть m n-мерных записей данных, расположенных в столбцах в матрицу X размера n на m, пусть, то C — симметричная матрица, диагональ которой представляет собой дисперсию каждого поля, а i-я строка j-го столбца и j-я строка i-го столбца имеют одинаковые элементы, указывающие на ковариацию двух полей i и j
диагонализация ковариационной матрицы
В соответствии с вышеприведенным выводом находим, что для достижения оптимального тока эквивалентно диагонализации ковариационной матрицы: то есть все элементы, кроме диагональных, сводятся к 0, а элементы располагаются по диагонали сверху вниз по размеру, чтобы мы достигли цели оптимизации, может быть, не очень понятно об этом говорить, давайте далее посмотрим на связь между исходной матрицей и матричной ковариационной матрицей после базисного преобразования:
Пусть ковариационная матрица, соответствующая исходной матрице данных X, будет C, а P будет матрицей, состоящей из набора оснований (каждое основание представляет собой вектор-столбец), множество, то Y — это данные после преобразования базиса X в группу базиса, содержащуюся в P. Пусть ковариационная матрица Y равна D, тогда мы имеем:
Теперь все ясно! Искомое P — это не что иное, как P, диагонализирующее исходную ковариационную матрицу. Другими словами, целью оптимизации становится поиск матрицы P, которая удовлетворяетявляется диагональной матрицей, и диагональные элементы расположены в порядке убывания, тогда первые K столбцов P являются базой, которую нужно найти, и транспонирование матрицы, состоящей из первых K столбцов P, умножается на X, чтобы получить X от N Размерность уменьшена до K размерности, и вышеуказанные условия оптимизации выполнены.
Как мы знаем выше, ковариационная матрица C является вещественной симметричной матрицей, В линейной алгебре действительные симметричные матрицы обладают рядом очень хороших свойств:
1) Собственными значениями вещественной симметричной матрицы являются все действительные числа
2) Все собственные векторы вещественной симметричной матрицы ортогональны.
.
3) Установить собственные значенияЕсли кратность равна r, то должно быть r линейно независимых собственных векторов, соответствующих
, поэтому собственные векторы r могут быть единично ортогонализированы.
Из приведенных выше двух видно, что реальная симметричная матрица с n строками и n столбцами может определенно найти n единичных ортогональных собственных векторов, Пусть эти n собственных векторов равны, формируем матрицу по столбцам:
Тогда ковариационная матрица C имеет следующие выводы:
впредставляет собой диагональную матрицу, диагональные элементы которой являются соответствующими собственными значениями каждого собственного вектора (могут быть повторения).
На данный момент мы нашли нужную нам матрицу P = E
P — матрица, в которой собственные векторы ковариационной матрицы нормированы и расположены в столбцах, где каждый столбец является собственным вектором C. Если P установлен в соответствии сСобственные значения в середине расположены от больших к малым, а собственные векторы расположены слева направо, затем умножьте исходную матрицу данных X на устройство матрицы, состоящей из первых K строк P, чтобы получить уменьшенную размерность матрица данных Y нам нужна.
Выше приведено обсуждение математических принципов всего PCA.
Алгоритм PCA
Обобщим шаги алгоритма PCA:
Есть m частей n-мерных данных.
1) Сформируйте исходные данные в матрицу X с n строками и m столбцами.
2) Нуль означает каждую строку X (представляющую поле атрибута), то есть вычесть среднее значение этой строки
3) Найдите ковариационную матрицу C=\frac{1}{m}XX^\mathsf{T}
4) Найдите собственные значения ковариационной матрицы и соответствующие собственные векторы
5) Расположите собственные векторы в матрицу слева направо в соответствии с размером соответствующих собственных значений и возьмите первые k столбцов, чтобы сформировать матрицу P
6) Y=P^TX — это данные после приведения размерности к размерности k.
Пример
упомянутый выше
В качестве примера мы используем метод PCA, чтобы уменьшить этот набор двумерных данных до одного измерения.
Так как каждая строка этой матрицы уже имеет нулевое среднее, здесь мы непосредственно находим ковариационную матрицу:
Затем найдите его собственные значения и собственные векторы.Конкретный метод решения подробно описываться не будет, и вы можете обратиться к соответствующим материалам. Собственные значения после решения:
Соответствующие собственные векторы:
Соответствующие собственные векторы являются общим решением, а c_1 и c_2 могут принимать любые действительные числа. Тогда нормализованный вектор признаков:
Итак, наша матрица P:
Диагонализация ковариационной матрицы C может быть проверена:
Наконец, мы умножаем первую строку P на матрицу данных, чтобы получить представление с уменьшенной размерностью:
Код
import numpy as np
import pandas as pd
## X: 需要降维的原始数据 topNfeat:需要降到的维数
def PCA(X, topNfeat=9999999):
# 1.原始数据默认都是每一行为一个样本数据,每一列为一个特征,
# 所以进行转置,让每一列代表一个样本数据
X = X.T
# 2.将数据的每一行(代表一个属性字段)进行零均值化
meanValues = np.mean(X, axis=1) #计算每一行的均值
meanValues = np.mat(meanValues).T #将一个向量转换成n*1的矩阵
meanRemoved = X - meanValues #均值归零
#3.求出协方差矩阵
covMat = np.cov(meanRemoved) #cov计算协方差时除的是 (样本个数-1),也就是自由度
# covMat = meanRemoved @ meanRemoved.T / (meanRemoved.shape[1])
print("协方差矩阵:\n",covMat)
#4求出协方差矩阵的特征值及对应的特征向量
eigVals, eigVects = np.linalg.eig(covMat) #eigVals:特征值 eigVects:特征向量
print("特征值\n",eigVals)
print("特征向量\n",eigVects)
#5将特征向量按对应特征值大小从左到右按列排列成矩阵,取前k列组成矩阵
# argsort函数返回的是数组值从小到大的索引值,参数中加个-号,变为从大到小
eigValInd = np.argsort(-eigVals)
eigValInd = eigValInd[0:topNfeat] #取出前topNfeat个最大的特征值所对应的索引
redEigVects = eigVects[:,eigValInd] #redEigVects 即为需要的变换矩阵,即P
print("变换矩阵:\n",redEigVects)
#6 Y=P^TX即为降维到k维后的数据
X_PCA = redEigVects.T @ X
return X_PCA
PCA(X, topNfeat = 1)
协方差矩阵:
[[1.5 1. ]
[1. 1.5]]
特征值
[2.5 0.5]
特征向量
[[ 0.70710678 -0.70710678]
[ 0.70710678 0.70710678]]
变换矩阵:
[[0.70710678]
[0.70710678]]
array([[-2.12132034, -0.70710678, 0. , 2.12132034, 0.70710678]])
sklearn
Мы инкапсулировали соответствующий интерфейс PCA в sklearn.Затем мы используем PCA, чтобы уменьшить размер набора рукописных чисел, который поставляется со sklearn.
from sklearn import datasets
digits = datasets.load_digits()
X = digits.data
y = digits.target
X.shape,y.shape
((1797, 64), (1797,))
Сначала разделите набор данных на обучающий набор и тестовый набор.
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=666)
X_train.shape
(1347, 64)
Во-первых, используйте алгоритм knn для создания и прогнозирования модели без уменьшения размерности PCA.
%%time
from sklearn.neighbors import KNeighborsClassifier
knn_clf = KNeighborsClassifier()
knn_clf.fit(X_train, y_train)
knn_clf.score(X_test,y_test) #准确率为
Wall time: 69.8 ms
knn_clf.score(X_test,y_test) #准确率为
0.9866666666666667
Далее, давайте взглянем на уменьшение размерности PCA.
#decomposition(分解)
from sklearn.decomposition import PCA
# n_components 要降到的维数,第一次我们直接降到2维
pca = PCA(n_components =2)
pca.fit(X_train)
X_train_reducation = pca.transform(X_train)
X_test_reducation = pca.transform(X_test) #注意测试集也需要做降维处理
X_train_reducation.shape
(1347, 2)
pca.explained_variance_ratio_
#代表降维后的各主成分的方差值占总方差值的比例,这个比例越大,则越是重要的主成分。
array([0.14566817, 0.13735469])
%%time
knn_clf = KNeighborsClassifier()
knn_clf.fit(X_train_reducation, y_train) # #降维后,所用时间明显减少
Wall time: 2 ms
knn_clf.score(X_test_reducation,y_test)
#由于我们将64维的数据直接降到了两维,所以信息损失严重,准确率只有0.6
0.6066666666666667
#如果我们直接传入一个小数值,则表示要保留的信息占原始信息的比例
#比如下面,保留95%的主要信息
pca = PCA(0.95)
pca.fit(X_train)
X_train_reducation = pca.transform(X_train)
X_test_reducation = pca.transform(X_test)
pca.n_components_ #n_components_可以查看pca后降到的具体维数
28
knn_clf = KNeighborsClassifier()
knn_clf.fit(X_train_reducation, y_train)
knn_clf.score(X_test_reducation,y_test)
0.98
Видно, что точность практически не изменилась, но размерность уменьшилась с прежних 64 до 28, что позволило сэкономить много ресурсов. Это принцип и кодовая реализация метода анализа главных компонентов PCA.
Справочная статья:Блог Woo Woo.cn на.com/Mike wolf200…
Добро пожаловать, чтобы обратить внимание на мою личную общедоступную учетную запись AI Computer Vision Workshop. Эта общедоступная учетная запись будет время от времени публиковать статьи о машинном обучении, глубоком обучении, компьютерном зрении и другие связанные статьи. Приглашаю всех учиться и общаться со мной.