Ng Enda Machine Learning-9-Dimensionality Reduction PCA

машинное обучение искусственный интеллект
Ng Enda Machine Learning-9-Dimensionality Reduction PCA

Продюсер: Ю Эр Хат
Автор: Питер
Редактор: Питер

Ng Enda Machine Learning-9-Dimensionality Reduction PCA

В основном в этой статье представленыСнижение размерности данныхсоответствующий контент, уделяя особое вниманиеPCAалгоритм

  • Зачем внедрять уменьшение размерности
    • Сжатие данных
    • визуализация данных
  • Алгоритм PCA
    • Разница между алгоритмами PCA и линейной регрессии
    • Особенности алгоритма PCA
    • Python реализует PCA
  • Реализовать PCA в sklearn

Почему уменьшение размерности

В случае реальных многомерных данных возникнут такие проблемы, как разреженные выборки данных и сложность вычисления расстояния, что называется维数灾难.

Решение состоит в том, чтобы уменьшить размерность, также известную как «уменьшение размерности», то есть преобразовать исходное многомерное атрибутивное пространство в низкоразмерное «подпространство» с помощью некоторого метода данных. В этом подпространстве сильно увеличивается плотность выборки, «встраивая» пространство низкой размерности в пространство высокой размерности.

Уменьшение размерности

Существует две основные причины уменьшения размерности данных:

  • Сжатие данныхData Compression
  • визуализация данныхData Visualization

Сжатие данных

Пояснение выше:

  1. Собственные векторы в трехмерном пространстве сводятся к двумерным собственным векторам.
  2. При проецировании 3D на 2D-плоскость все данные должны находиться на одной плоскости.
  3. Такая обработка может использоваться для уменьшения данных любого измерения до любого желаемого измерения, например1000размерные характеристики до100измерение.

Визуализация данных

Уменьшение размерности может помочь нам визуализировать данные.

Пояснение к картинке выше:

  1. Предположим, что заданы данные с несколькими различными свойствами
  2. Некоторые атрибуты могут иметь одинаковое значение и размещаться на одной оси графика для уменьшения размерности данных.

PCA- Principal Component Analysis

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

Вектор направления — это вектор, проходящий через начало координат, а ошибка проецирования — это длина перпендикуляра от собственного вектора к вектору направления.

Разница между PCA и линейной регрессией

  1. Вертикальная ось линейной регрессии представляет собой прогнозируемое значение,PCAявляется характерным признаком
  2. Ошибка другая:PCA— ошибка проекции, а линейная регрессия пытается минимизировать ошибку прогноза.
  3. Целью линейной регрессии является прогнозирование результатов, PCA не выполняет никакого анализа.

Алгоритм PCA

В анализе главных компонентов данные сначала нормализуются так, чтобы среднее значение каждой переменной в данных равнялось 0, а дисперсия равнялась 1.

данные послеОртогональное преобразование, который используется для представления данных, представленных линейной корреляцией, посредством ортогонального преобразования в данные, представленные несколькими линейно независимыми новыми переменными.

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

Процесс перехода от измерения n к измерению k в алгоритме PCA представляет собой

  • средняя нормализация. Вычислите среднее значение всех функций, пустьxj=xjμjx_j=x_j-\mu_j, если признаки не по порядку, нужно разделить на стандартное отклонение

  • рассчитатьковариационная матрица ковариационная матрица

Σ:=1mi=1n(x(i))(x(i))T\Sigma: \quad \sum=\frac{1}{m} \sum_{i=1}^{n}\left(x^{(i)}\right)\left(x^{(i)}\right)^{T}

  • Вычислить ковариационную матрицу\sumизсобственные векторы

В арбузной книге это описано как

Количество главных компонентов определяется

оPCAКоличество главных компонент в алгоритмеkОпределение обычно основано на формуле:

1mi=1mx(i)xapprox(i)21mi=1mx(i)20.01\frac{\frac{1}{m} \sum_{i=1}^{m}\left|x^{(i)}-x_{a p p r o x}^{(i)}\right|^{2}}{\frac{1}{m} \sum_{i=1}^{m}\left|x^{(i)}\right|^{2}} \leq 0.01

правая часть неравенства0.01возможно0.05,или0.1и т. д. встречаются относительно часто. в виде0.01, он зарезервирован99%Дисперсия данных, то есть большинство признаков данных сохраняются.

когда числоk, ковариационная матрицаSКаждое собственное значение, решенное в, удовлетворяет формуле:

1i=1kSiii=1nSii0.011- \frac{\sum^k_{i=1}S_{ii}}{\sum^n_{i=1}S_{ii}} \leq0.01

То есть удовлетворить:

i=1kSiii=1nSii0.99\frac{\sum^k_{i=1}S_{ii}}{\sum^n_{i=1}S_{ii}} \geq 0.99

Это эквивалентно приведенной выше формуле.

реконструированное сжатое представление

реконструированное сжатое представлениеReconstruction from Compressed RepresentationОтносится к процессу преобразования данных из малоразмерных в многомерные.

На изображении выше есть два образцаs(1),x(2)s^{(1)},x^{(2)}. по заданному реальному числуzz, удовлетворятьz=UreduceTxz={U_{r e d u c e}^{T}} x,

Чтобы сопоставить указанные местоположения точек с 3D-поверхностью, решите предыдущее уравнение в обратном порядке:

xappox=Ureducez,xappoxxx_{\text {appox}}=U_{\text {reduce}} \cdot z, x_{\text {appox}} \approx x

Особенности PCA

  1. PCAПо существу, направление с наибольшей дисперсией используется в качестве основного признака, так что эти признаки не имеют корреляции в разных ортогональных направлениях.
  2. PCAЭто безпараметрическая технология, не требующая какой-либо настройки параметров.

Python реализует PCA

использоватьnumpy、pandas、matplotlibреализация библиотекиPCAалгоритм

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

def loadData(filename):
  # 文件加载函数
  df = pd.read_table(filename, seq='\t')
  return np.array(df)  # 一定要返回array数组

def showData(dataMat, reconMat):
  # 图片显示函数
  fig = plt.figure()  # 画布
  ax = fig.add_subplot(111)  # 子图显示
  ax.scatter(dataMat[:, 0], dataMat[:, 1], c='green')  # 散点图
  ax.scatter(np.array(reconMat[:, 0]), reconMat[:, 1], c='red')
  plt.show()

def pca(dataMat, topNfeat):   # topNfeat就是需要筛选的前K个主成分
  # 1. 样本中心化过程:所有样本属性减去属性的平均值
  meanVals = np.mena(dataMat, axis=0)   # 平均值
  meanRemoved = dataMat - meanVals  # 中心化之后的数据

  # 2.计算样本的协方差矩阵 XXT
  covmat = np.cov(meanRemoved, rowvar=0)
  print(covmat)

  # 3. 对协方差矩阵做特征值分解,求出特征向量和特征值,并且将特征值从大到小排序,筛选出topNfeat个
  # np.mat 实际上就是创建矩阵
  # np.linalg.eig 求解矩阵特征向量和特征值
  eigVals, eigVects = np.linalg.eig(np.mat(covmat))
  eigValInd = np.argsort(eigVals)  # 将特征值进行排序,argsort返回的是索引
  eigValInd = eigValInd[:-(topNfeat + 1):-1]   # 比如前7个,[:-8:-1]
  redEigVects = eigVects[:, eigValInd]   # 取前topNfeat大的特征值所对应的特征向量

  # 将数据转换到低维空间中
  lowDataMat = meanRemoved * redEigVects   # 只有topNfeat维,降维之后的数据
  reconMat = (lowDataMat * redEigVects.T) + meanVals   # 重构数据
  return np.array(lowDataMat), np.array(reconMat)

# 主函数部分
if __name__ == "__main__":
  dataMat = loadDataSet(filepath)   # 填写文件路径
  loadDataMat, reconMat = pca(dataMat, 1)
  # showData(dataMat, lowDataMat)
  showData(dataMat, reconMat)
  print(lowDataMat)

Реализовать PCA в sklearn

Linear dimensionality reduction using Singular Value Decomposition of the data to project it to a lower dimensional space. The input data is centered but not scaled for each feature before applying the SVD.

Изучение PCA с помощью sklearn

Модуль реализации

существуетscikit-learnв, сPCAСвязанные классы находятся вsklearn.decompositionв сумке. чаще всего используетсяPCAклассsklearn.decomposition.PCA.

Отбеливание: нормализуйте каждую функцию данных с уменьшенным размером, чтобы дисперсия была равна 1.

class sklearn.decomposition.PCA(n_components=None, # 降维后的特征数目,直接指定一个整数
                                copy=True,
                                whiten=False, # 判断是否进行白化,默认是不白化
                                svd_solver='auto', # 指定奇异值分解SVD的方法
                                tol=0.0,
                                iterated_power='auto',
                                random_state=None)

demo

Вот пример использованияPCAалгоритм, чтобы сделатьIRISКлассификация данных

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D  # 3D模块
from sklearn import decomposition  # 压缩模块
from sklearn import datasets

np.random.seed(5)

centers = [[1,1], [-1,-1], [1,-1]]
iris = datasets.load_iris()  # 导入数据

X = iris.data  # 样本空间
y = iris.target  # 输出

fig = plt.figure(1, figsize=(4,3))
plt.clf()
ax = Axes3D(fig, rect=[0,0,.95,1], elev=48, azim=134)

plt.cla()
pca = decomposition.PCA(n_components=3)
pca.fit(X)
X = pca.transform(X)

for name, label in [('Setosa', 0), ('Versicolour', 1), ('Virginica', 2)]:
  ax.text3D(X[y == label, 0].mean(),
           X[y == label, 1].mean() + 1.5,
           X[y == label, 2].mean(), name,
           horizontalalignment = 'center',
           bbox = dict(alpha=.5, edgecolor='w', facecolor='w'))

y = np.choose(y, [1,2,0]).astype(np.float)
ax.scatter(X[:, 0], X[:, 1], X[:, 2], c=y, cmap=plt.cm.nipy_spectral, edgecolor='k')

ax.w_xaxis.set_ticklabels([])
ax.w_yaxis.set_ticklabels([])
ax.w_zaxis.set_ticklabels([])

plt.show()