zoukankan      html  css  js  c++  java
  • PCA实现

    代码实现分成好多种层级,有的代码只使用标准库实现,有的代码基于其它库实现,有的代码直接调用库中现有的实现。
    在本文中,按照不同的层级分别实现PCA

    对于分类问题基本任务可以描述如下
    x11 x12 x13 x14 y1
    x21 x22 x23 x24 y2
    x31 x32 x33 x34 y3
    ......

    PCA用于提取样本的主要特征,它只跟属性有关,而跟类别数据无关。也就是说,PCA只跟X有关而跟Y无关。

    import numpy as np
    from sklearn.decomposition import PCA
    
    # 10个样本,每个样本7个属性,现在要取其中的3个属性
    train_x = np.random.rand(10, 7)
    train_y = np.random.randint(0, 3, (100, 1))
    
    #使用sklearn
    p = PCA(n_components=3)
    p.fit(train_x, train_y)
    train_data = p.transform(train_x)
    
    # 使用numpy中的协方差计算、特征值求解来实现
    mu = np.mean(train_x, axis=0)  # 均值向量
    # 协方差矩阵,cov默认是列向量,这里需要T表示将行向量转置称列向量
    # 使用参数rowvar=False相当于矩阵转置
    A = np.cov(np.asmatrix(train_x - mu).T)
    root, vec = np.linalg.eig(A)
    ind = np.argsort(root)
    transform_matrix = np.asmatrix(vec[:, ind[-3:]])
    train_data2 = np.asmatrix(train_x - mu) * transform_matrix
    
    # 自己实现协方差计算,只使用numpy中的特征值求解来实现
    mu = np.mean(train_x, axis=0)
    A = np.dot((train_x - mu).T, (train_x - mu)) / (len(train_x) - 1)
    root, vec = np.linalg.eig(A)
    # 返回的特征根是无序的,需要进行排序
    ind = np.argsort(root)
    # vec[:ind[-3:]]或者vec[:ind[-1:-4:-1]]都是可以的
    transform_matrix = np.asmatrix(vec[:, ind[-3:]])
    train_data3 = np.asmatrix(train_x - mu) * transform_matrix
    print(np.sum(train_data - train_data2), np.sum(train_data - train_data3))
    
    
  • 相关阅读:
    STM32F407Discovery开发板使用环境搭建
    NIO初识
    Mac下Boost环境搭建
    Android Studio增加NDK代码编译支持--Mac环境
    LNMP平台搭建---PHP安装篇
    LNMP平台搭建---MySQL安装篇
    支付系统流程
    从html字符串中获取div内容---jquery
    记一次进入新公司快速融入开发团队经历
    DataTable复制自身行
  • 原文地址:https://www.cnblogs.com/weiyinfu/p/8488074.html
Copyright © 2011-2022 走看看