Продюсер: Ю Эр Хат
Автор: Питер
Редактор: Питер
Ng Enda Machine Learning-9-Dimensionality Reduction PCA
В основном в этой статье представленыСнижение размерности данныхсоответствующий контент, уделяя особое вниманиеPCA
алгоритм
- Зачем внедрять уменьшение размерности
- Сжатие данных
- визуализация данных
- Алгоритм PCA
- Разница между алгоритмами PCA и линейной регрессии
- Особенности алгоритма PCA
- Python реализует PCA
- Реализовать PCA в sklearn
Почему уменьшение размерности
В случае реальных многомерных данных возникнут такие проблемы, как разреженные выборки данных и сложность вычисления расстояния, что называется维数灾难
.
Решение состоит в том, чтобы уменьшить размерность, также известную как «уменьшение размерности», то есть преобразовать исходное многомерное атрибутивное пространство в низкоразмерное «подпространство» с помощью некоторого метода данных. В этом подпространстве сильно увеличивается плотность выборки, «встраивая» пространство низкой размерности в пространство высокой размерности.
Уменьшение размерности
Существует две основные причины уменьшения размерности данных:
- Сжатие данных
Data Compression
- визуализация данных
Data Visualization
Сжатие данных
Пояснение выше:
- Собственные векторы в трехмерном пространстве сводятся к двумерным собственным векторам.
- При проецировании 3D на 2D-плоскость все данные должны находиться на одной плоскости.
- Такая обработка может использоваться для уменьшения данных любого измерения до любого желаемого измерения, например
1000
размерные характеристики до100
измерение.
Визуализация данных
Уменьшение размерности может помочь нам визуализировать данные.
Пояснение к картинке выше:
- Предположим, что заданы данные с несколькими различными свойствами
- Некоторые атрибуты могут иметь одинаковое значение и размещаться на одной оси графика для уменьшения размерности данных.
PCA- Principal Component Analysis
существуетPCA
, нам нужно найти вектор направления (Vector direction), когда все данные проецируются на этот вектор,PCA
Ключевым моментом является то, чтоНайдите плоскость проекции, которая минимизирует ошибку проекции.
Вектор направления — это вектор, проходящий через начало координат, а ошибка проецирования — это длина перпендикуляра от собственного вектора к вектору направления.
Разница между PCA и линейной регрессией
- Вертикальная ось линейной регрессии представляет собой прогнозируемое значение,
PCA
является характерным признаком - Ошибка другая:
PCA
— ошибка проекции, а линейная регрессия пытается минимизировать ошибку прогноза. - Целью линейной регрессии является прогнозирование результатов, PCA не выполняет никакого анализа.
Алгоритм PCA
В анализе главных компонентов данные сначала нормализуются так, чтобы среднее значение каждой переменной в данных равнялось 0, а дисперсия равнялась 1.
данные послеОртогональное преобразование, который используется для представления данных, представленных линейной корреляцией, посредством ортогонального преобразования в данные, представленные несколькими линейно независимыми новыми переменными.
Новая переменная имеет наибольшую сумму дисперсий (сохранение информации) переменных, возможных при ортогональном преобразовании, и дисперсия представляет собой величину информации о новой переменной. Сделайте новую переменную первым основным компонентом, вторым основным компонентом и т. д. за раз. С помощью анализа основных компонентов исходные данные могут быть приблизительно представлены главными компонентами, что позволяет уменьшить размерность данных.
Процесс перехода от измерения n к измерению k в алгоритме PCA представляет собой
-
средняя нормализация. Вычислите среднее значение всех функций, пусть, если признаки не по порядку, нужно разделить на стандартное отклонение
-
рассчитатьковариационная матрица ковариационная матрица
- Вычислить ковариационную матрицуизсобственные векторы
В арбузной книге это описано как
Количество главных компонентов определяется
оPCA
Количество главных компонент в алгоритмеk
Определение обычно основано на формуле:
правая часть неравенства0.01
возможно0.05
,или0.1
и т. д. встречаются относительно часто. в виде0.01
, он зарезервирован99%
Дисперсия данных, то есть большинство признаков данных сохраняются.
когда числоk
, ковариационная матрицаS
Каждое собственное значение, решенное в, удовлетворяет формуле:
То есть удовлетворить:
Это эквивалентно приведенной выше формуле.
реконструированное сжатое представление
реконструированное сжатое представлениеReconstruction from Compressed Representation
Относится к процессу преобразования данных из малоразмерных в многомерные.
На изображении выше есть два образца. по заданному реальному числу, удовлетворять,
Чтобы сопоставить указанные местоположения точек с 3D-поверхностью, решите предыдущее уравнение в обратном порядке:
Особенности PCA
-
PCA
По существу, направление с наибольшей дисперсией используется в качестве основного признака, так что эти признаки не имеют корреляции в разных ортогональных направлениях. -
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()