PCA降维模块 simple_ml.pca

一、主成分分析 (PCA)

from simple_ml.base.base_model import BaseTransform

class PCA(BaseTransform):

    def __init__(self, top_n):
        pass

simple_ml提供了常规的主成分分析方法进行降维


1.1 初始化

  名称 类型 描述
Parameters: top_n int 希望保留几个维度

1.2 类方法

1 拟合

def fit(self, x, y=None)

拟合特征

  名称 类型 描述
Parameters: x np.2darray 特征
  y np.array 标签,可以没有
Returns:   Void  

2 转换

def transform(self, x)

将x转换为PCA降维之后的形式,输出维度为(n, top_n),n为样本数,top_n为初始化值

  名称 类型 描述
Parameters: x np.2darray 特征
Returns:   np.2darray 特征选择后的数组

3 拟合+转换

def fit_transform(self, x, y)

拟合并且转换为处理后的数组,等于fit+transform

  名称 类型 描述
Parameters: x np.2darray 特征
  y np.array 标签,可以没有
Returns:   np.2darray 特征选择后的数组

1.3 类属性

名称 类型 描述
explain_ratio float 前top_n个主成分的解释比
eigen_value np.array 训练数据的特征值
eigen_vecttor np.2darray 训练数据的特征向量

二、针对高维数据的主成分分析 (SuperPCA)

from simple_ml.pca import PCA

class SuperPCA(PCA):

    def __init__(self, top_n):
        """
        针对数据维度大于样本数目的情况,可以通过矩阵分解简化计算,
        但是最多只能得到等同于样本数目的主成分个数:
            Pv = lambda v
            XX'v = lambda v
            X'XX'v = X'lambda v
            sigma x' v = lambda X'v
            sigma (X'v) = lambda (X'v)
        所以只要求 XX'的主成分即可,其中X为去每列减去均值后除以根号(总行数-1),
        保证协方差矩阵sigma等于 X'X
        :param top_n: 主成分个数,当大于样本个数时报错
        """
        super(SuperPCA, self).__init__(top_n)

当数据维度较高,且样本较少,尤其是遇到图像降维的问题时, simple_ml提供了针对高维数据的降维方法

优点:

缺点:


2.1 初始化

  名称 类型 描述
Parameters: top_n int 希望保留几个维度

2.2 类方法

1 拟合

def fit(self, x, y=None)

拟合特征

  名称 类型 描述
Parameters: x np.2darray 特征
  y np.array 标签,可以没有
Returns:   Void  

2 转换

def transform(self, x)

将x转换为SuperPCA降维之后的形式,输出维度为(n, top_n),n为样本数,top_n为初始化值

  名称 类型 描述
Parameters: x np.2darray 特征
Returns:   np.2darray 特征选择后的数组

3 拟合+转换

def fit_transform(self, x, y)

拟合并且转换为处理后的数组,等于fit+transform

  名称 类型 描述
Parameters: x np.2darray 特征
  y np.array 标签,可以没有
Returns:   np.2darray 特征选择后的数组

2.3 类属性

名称 类型 描述
explain_ratio float 前top_n个主成分的解释比
eigen_value np.array 训练数据的特征值
eigen_vecttor np.2darray 训练数据的特征向量

Examples

from simple_ml.classify_data import get_iris
from simple_ml.pca import PCA
import matplotlib.pyplot as plt

x, y = get_iris()
pca = PCA(2)
new_x = pca.fit_transform(x, y)
print(new_x.shape)

ax1 = plt.subplot(1, 2, 2)
ax1.scatter(new_x[:, 0], new_x[:, 1], c=y)
ax1.set_title("After PCA")
ax2 = plt.subplot(1, 2, 1)
ax2.scatter(x[:, 0], x[:, 1], c=y)
ax2.set_title("Before PCA")
plt.show()

返回主页