/
LeonBlue
/
ML_algos_from_scratch_python
Обзор
Документация
Войти
/
LeonBlue
/
ML_algos_from_scratch_python
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
ml_algorithms/unsupervised/pca.py
96 строк
3 KB
LeonBlue
Минимальный набор алгоритмов для начала работы
03 дек 2025, 18:50
03 дек 2025, 18:50
28b87a5
Код
Авторство
О чём код?
""" Principal Component Analysis (PCA) с нуля """ import numpy as np from ..base.base_model import BaseModel class PCA(BaseModel): """ Метод главных компонент (PCA) """ def __init__(self, n_components=None): """ Parameters: ----------- n_components : int, optional Число главных компонент. Если None, используется min(n_samples, n_features) """ super().__init__() self.n_components = n_components self.components_ = None self.explained_variance_ = None self.explained_variance_ratio_ = None self.mean_ = None def fit(self, X, y=None): """ Обучение модели PCA Parameters: ----------- X : array-like, shape (n_samples, n_features) Обучающие данные y : None Не используется, для совместимости с API """ X = self._validate_input(X) n_samples, n_features = X.shape # Центрирование данных self.mean_ = np.mean(X, axis=0) X_centered = X - self.mean_ # Вычисление ковариационной матрицы cov_matrix = (X_centered.T @ X_centered) / (n_samples - 1) # Собственные значения и векторы eigenvalues, eigenvectors = np.linalg.eigh(cov_matrix) # Сортировка по убыванию собственных значений idx = np.argsort(eigenvalues)[::-1] eigenvalues = eigenvalues[idx] eigenvectors = eigenvectors[:, idx] # Определение числа компонент if self.n_components is None: n_components = min(n_samples, n_features) else: n_components = min(self.n_components, n_samples, n_features) # Сохранение компонент self.components_ = eigenvectors[:, :n_components].T self.explained_variance_ = eigenvalues[:n_components] self.explained_variance_ratio_ = self.explained_variance_ / np.sum(eigenvalues) self.is_fitted = True return self def transform(self, X): """ Применение PCA к данным Parameters: ----------- X : array-like, shape (n_samples, n_features) Данные для преобразования Returns: -------- X_transformed : array-like, shape (n_samples, n_components) Преобразованные данные """ self._check_is_fitted() X = self._validate_input(X) X_centered = X - self.mean_ return X_centered @ self.components_.T def fit_transform(self, X, y=None): """Обучение и преобразование данных""" return self.fit(X, y).transform(X) def predict(self, X): """Алиас для transform для совместимости с BaseModel""" return self.transform(X)