Monday, June 27, 2022

General PCA processes

Анализ основных компонентов (PCA) — это один из наиболее часто используемых алгоритмов машинного обучения без учителя в различных приложениях: исследовательский анализ данных, уменьшение размерности, сжатие информации, удаление шума из данных и многое другое

 Общие процессы PCA:

1.PCA находит новое начало данных, взяв среднее значение горизонтального и вертикального диапазона всех точек данных (обратите внимание, что PCA проецирует данные на 2D-плоскость).

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

3.PCA устанавливает последующую ось ортогонально первой, а также максимизирует оставшуюся инерцию.

=================================================

Карты PCA и их интерпретации:

После проецирования всех точек данных на новую плоскость PCA исследует отношения в данных как между наблюдениями (строки), так и между переменными (столбцы). Используя различную интерпретацию, основные компоненты помогают объяснить эти отношения.

Карта наблюдений PCA называется факторными оценками. Мы можем интерпретировать карту оценок факторов, оценивая расстояния между точками данных строки, используя такие методы, как поиск средних значений группы, интервалы допуска, интервалы начальной загрузки и кластеризацию. Расстояние между точками представляет собой сходство между ними, точки, расположенные близко друг к другу, являются окрестностями с аналогичными профилями, а точки, расположенные далеко друг от друга, имеют разные профили.

Карта переменных PCA называется нагрузкой. Мы можем интерпретировать карту нагрузки, оценивая углы между ними (лучше всего делать это на круговой карте загрузки, где эффекты переменных стандартизированы). Угол между векторами является аппроксимацией корреляции между переменными. Небольшой угол указывает, что переменные имеют положительную корреляцию, угол 90 градусов указывает, что переменные не коррелированы, а угол, близкий к 180 градусам, указывает на то, что переменные имеют отрицательную корреляцию.

================================================

(.env) boris@boris-All-Series:~/VOTING/PCA$ cat plottingPCA2.py

import pandas as pd

import numpy as np

from sklearn.decomposition import PCA

import matplotlib.pyplot as plt

import seaborn as sns

import warnings

warnings.filterwarnings("ignore")

 

# Get the iris dataset

sns.set_style("white")

df = sns.load_dataset('iris')


# create figure

my_dpi=96

plt.figure(figsize=(480/my_dpi, 480/my_dpi), dpi=my_dpi)

 

# Keep the 'species' column appart + make it numeric for coloring

df['species']=pd.Categorical(df['species'])

my_color=df['species'].cat.codes

df = df.drop('species', 1)

 

# Run The PCA

pca = PCA(n_components=3)

pca.fit(df)

 

# Store results of PCA in a data frame

result=pd.DataFrame(pca.transform(df), columns=['PCA%i' % i for i in range(3)], index=df.index)

 

# Plot initialisation

fig = plt.figure()

ax = fig.add_subplot(111, projection='3d')

ax.scatter(result['PCA0'], result['PCA1'], result['PCA2'], \

           c=my_color, cmap="Set2_r", s=60)

 

# make simple, bare axis lines through space:

xAxisLine = ((min(result['PCA0']), max(result['PCA0'])), (0, 0), (0,0))

ax.plot(xAxisLine[0], xAxisLine[1], xAxisLine[2], 'r')

yAxisLine = ((0, 0), (min(result['PCA1']), max(result['PCA1'])), (0,0))

ax.plot(yAxisLine[0], yAxisLine[1], yAxisLine[2], 'r')

zAxisLine = ((0, 0), (0,0), (min(result['PCA2']), max(result['PCA2'])))

ax.plot(zAxisLine[0], zAxisLine[1], zAxisLine[2], 'r')

 

# label the axes

ax.set_xlabel("PC1")

ax.set_ylabel("PC2")

ax.set_zlabel("PC3")

ax.set_title("PCA on the iris data set")

plt.show()





























(.env) boris@boris-All-Series:~/VOTING/PCA$ cat plot_pca_3d.py
"""
=====================================
Principal components analysis (PCA)
=====================================

Эти рисунки помогают проиллюстрировать, как облако точек может быть очень плоским в одном направлении — именно здесь PCA приходит, чтобы выбрать направление, которое не является плоским.
"""

import numpy as np
from scipy import stats

e = np.exp(1)
np.random.seed(4)

def pdf(x):
    return 0.5 * (stats.norm(scale=0.25 / e).pdf(x) + stats.norm(scale=4 / e).pdf(x))

y = np.random.normal(scale=0.5, size=(30000))
x = np.random.normal(scale=0.5, size=(30000))
z = np.random.normal(scale=0.1, size=len(x))

density = pdf(x) * pdf(y)
pdf_z = pdf(5 * z)

density *= pdf_z

a = x + y
b = 2 * y
c = a - b + z

norm = np.sqrt(a.var() + b.var())
a /= norm
b /= norm

# Plot the figures
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt

def plot_figs(fig_num, elev, azim):
    fig = plt.figure(fig_num, figsize=(4, 3))
    plt.clf()
    ax = fig.add_subplot(111, projection="3d", elev=elev, azim=azim)
    ax.set_position([0, 0, 0.95, 1])

    ax.scatter(a[::10], b[::10], c[::10], c=density[::10], marker="+", alpha=0.4)
    Y = np.c_[a, b, c]

    # Using SciPy's SVD, this would be:
    # _, pca_score, Vt = scipy.linalg.svd(Y, full_matrices=False)

    pca = PCA(n_components=3)
    pca.fit(Y)
    V = pca.components_.T

    x_pca_axis, y_pca_axis, z_pca_axis = 3 * V
    x_pca_plane = np.r_[x_pca_axis[:2], -x_pca_axis[1::-1]]
    y_pca_plane = np.r_[y_pca_axis[:2], -y_pca_axis[1::-1]]
    z_pca_plane = np.r_[z_pca_axis[:2], -z_pca_axis[1::-1]]
    x_pca_plane.shape = (2, 2)
    y_pca_plane.shape = (2, 2)
    z_pca_plane.shape = (2, 2)
    ax.plot_surface(x_pca_plane, y_pca_plane, z_pca_plane)
    ax.w_xaxis.set_ticklabels([])
    ax.w_yaxis.set_ticklabels([])
    ax.w_zaxis.set_ticklabels([])

elev = -40
azim = -80
plot_figs(1, elev, azim)

elev = 30
azim = 20
plot_figs(2, elev, azim)
plt.show()





























No comments:

Post a Comment