Линейная алгебра с Tensorflow 2.0 (4 части серии)
PCA – это методика уменьшения сложности, которая пытается уменьшить набор переменных вниз до меньшего набора компонентов, которые представляют большую часть информации в переменных. Это можно подумать о том, что для набора точек данных, применяющих сжатие с потерями, означающее хранение точек таким образом, чтобы требовать меньше памяти, торговая некоторая точность. На концептуальном уровне PCA работает путем выявления наборов переменных, которые делятся дисперсию и создание компонента для представления этой дисперсии.
Ранее, когда мы делали транспонирование или матрицу обратно, мы полагались на использование встроенных функций Tensorflow, но для PCA такого функции не существует, кроме одного в расширенном разделении Tensorflow (TFT).
Существует несколько способов реализовать PCA в Tensorflow, но поскольку этот алгоритм такой важный в мире машинного обучения, мы возьмем длинный маршрут.
Причина наличия PCA под линейной алгеброй состоит в том, чтобы показать, что PCA может быть реализован с использованием теорем, которые мы изучали в этой главе.
# To start working with PCA, let's start by creating a 2D data set x_data = tf.multiply(5, tf.random.uniform([100], minval=0, maxval=100, dtype = tf.float32, seed = 0)) y_data = tf.multiply(2, x_data) + 1 + tf.random.uniform([100], minval=0, maxval=100, dtype = tf.float32, seed = 0) X = tf.stack([x_data, y_data], axis=1) plt.rc_context({'axes.edgecolor':'orange', 'xtick.color':'red', 'ytick.color':'red'}) plt.plot(X[:,0], X[:,1], '+', color='b') plt.grid()
Начнем с стандартизации данных. Несмотря на то, что данные, которые мы создали, находятся на одних и тех же масштабах, она всегда хорошая практика для начала стандартизации данных, потому что большую часть времени, когда данные вы будете работать, будет в разных масштабах.
def normalize(data): # creates a copy of data X = tf.identity(data) # calculates the mean X -=tf.reduce_mean(data, axis=0) return X normalized_data = normalize(X) plt.plot(normalized_data[:,0], normalized_data[:,1], '+', color='b') plt.grid()
Напомним, что PCA можно рассматривать как применение сжатия с потерями в коллекцию х Точки данных. То, как мы можем минимизировать потерю точностью, находя функцию декодирования f (x) ≈ C где C будет соответствующий вектор.
PCA определяется нашим выбором этой функции декодирования. В частности, сделать декодер очень просто, мы решили использовать Matrix умножение на карту C и определить G (C) Отказ Наша цель – минимизировать расстояние между входной точкой х к его реконструкции и сделать то, что мы используем L ^ 2 норма. Который сводится к нашей функции кодирования C ^ T x Отказ
Наконец, чтобы восстановить PCA, мы используем ту же матрицу D Чтобы декодировать все точки и решить эту проблему оптимизации, мы используем Eigendecomposition.
Обратите внимание, что следующее уравнение является окончательной версией большого количества матричных преобразований. Я не предоставляю производные, потому что цель состоит в том, чтобы сосредоточиться на математической реализации, а не на выводу. Но для любопытных, вы можете прочитать о выводе в Глава 2 Раздел 11 Отказ
d ^ * tr (d ^ t x ^ t xd)
Найти D Мы можем рассчитать собственныевекторы Х ^ т х .
# Finding the Eigne Values and Vectors for the data eigen_values, eigen_vectors = tf.linalg.eigh(tf.tensordot(tf.transpose(normalized_data), normalized_data, axes=1)) print("Eigen Vectors: \n{} \nEigen Values: \n{}".format(eigen_vectors, eigen_values)) Eigen Vectors: [[-0.8908606 -0.45427683] [ 0.45427683 -0.8908606 ]] Eigen Values: [ 16500.715 11025234. ]
Eigenvectors (основные компоненты) определяют направления нового пространства функций, а собственные значения определяют их величину.
Теперь давайте будем использовать эти собственные векторы, чтобы повернуть наши данные. Цель вращения заключается в том, чтобы в конечном итоге с новой системой координат, где данные нерелируются и, таким образом, когда оси основы собирают все дисперсию. Тем самым уменьшая размерность.
Напомним нашу функцию кодирования C ^ T x , где D Это матрица, содержащая собственныеветеры, которые мы рассчитали ранее.
X_new = tf.tensordot(tf.transpose(eigen_vectors), tf.transpose(normalized_data), axes=1) plt.plot(X_new[0, :], X_new[1, :], '+', color='b') plt.xlim(-500, 500) plt.ylim(-700, 700) plt.grid()
Это преобразованные данные.
Это раздел Двенадцать главы на линейной алгебре с Tensorflow 2.0 книги Глубокое обучение с Tensorflow 2.0 Отказ
Вы можете прочитать этот раздел и следующие темы:
02.01 – скалярные, векторы, матрицы и тензоры 02.02 – размножающие матрицы и векторы 02.03 – личность и обратные матрицы 02.04 – линейная зависимость и промежуток 02.05 – Нормы 02.06 – Специальные виды матриц и векторов 02.07 – Eigendecomposition 02.08 – Особое значение. Мур-Пенроуз псевдоинверсий 02.10 – оператор трассировки 02.11 – определитель 02.12 – пример: анализ основных компонентов
на Глубокое обучение с TF 2.0: 02.00- линейная алгебра . Вы можете получить код для этой статьи и остальной части главы здесь Отказ Ссылки на ноутбук в Google Colab и Jupyter Binder находятся в конце ноутбук Отказ
Линейная алгебра с Tensorflow 2.0 (4 части серии)
Оригинал: “https://dev.to/mmithrakumar/principal-components-analysis-with-tensorflow-2-0-21hl”