栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Python 主成分分析法 PCA

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python 主成分分析法 PCA

主成分分析法是一种利用相关系数对数据进行降维的方法,可用于处理维数过多、指标意义不明确的数据。求相关系数的方法有很多种,下面只以协方差法为例

相关系数

输入是 shape 为 [sample, feature] 的原始数据,先对数据进行标准化,再求其协方差,即为各个维度之间的相关系数

import numpy as np


def standardize(data, axis=None):
    ''' 标准化'''
    data = np.array(data)
    mean = np.mean(data, axis=axis, keepdims=True)
    std = np.std(data, axis=axis, keepdims=True)
    return (data - mean) / std


def association(data):
    ''' 相关系数矩阵 (协方差矩阵)
        data: 形如 [n_sample, n_features] 的 array'''
    return np.cov(standardize(data, axis=0).T)

旋转降维矩阵

输入是上文中得到的相关系数矩阵 (行列数相同的方阵),求解特征方程之后按照每个特征向量的绝对值的最大值进行变号 (纯属强迫症),将特征值按降序排序 (对应的特征向量同步)。特征值之比即为贡献率之比,按照给定的累积贡献度阈值对主成分进行选定

def principal(asso, thresh=0.80):
    ''' 主成分分析
        asso: 形如 [n_features, n_features] 的 array
        thresh: 累积贡献率阈值
        return: 旋转降维矩阵'''
    cha_value, rota = np.linalg.eig(asso)
    max_idx = np.abs(rota).argmax(axis=0)
    sign = np.sign([c[i] for i, c in zip(max_idx, rota.T)])
    # 得到绝对值最大数的符号
    rota *= sign
    index = np.argsort(cha_value)[::-1]
    cha_value, rota = cha_value[index], rota[:, index]
    # 降序排序: 特征值、特征向量
    sum_contribute = np.cumsum(cha_value) / cha_value.sum()
    # 累计贡献率
    for idx, sum_con in enumerate(sum_contribute):
        if sum_con >= thresh:
            info_contribute = cha_value[:idx + 1] / cha_value.sum()
            # 取前 m 个主成分, 计算信息贡献率
            print(f'主成分贡献率: {info_contribute}n')
            rota = rota[:, :idx + 1]
            return rota

实战:数据降维
省份食品衣着家庭设备医疗交通娱乐居住杂项
北京2959.19730.79749.41513.34467.871141.82478.42457.64
天津2459.77495.47697.33302.87284.19735.97570.84305.08
河北1495.63515.9362.37285.32272.95540.58364.91188.63
山西1406.33477.77290.15208.57201.5414.72281.84212.1
内蒙古1303.97524.29254.83192.17249.81463.09287.87192.96
辽宁1730.84553.9246.91279.81239.18445.2330.24163.86
吉林1561.86492.42200.49218.36220.69459.62360.48147.76
黑龙江1410.11510.71211.88277.11224.65376.82317.61152.85
上海3712.31550.74893.37346.935271034.98720.33462.03
江苏2207.58449.37572.4211.92302.09585.23429.77252.54
浙江2629.16557.32689.73435.69514.66795.87575.76323.36
安徽1844.78430.29271.28126.33250.56513.18314151.39
福建2709.46428.11334.12160.77405.14461.67535.13232.29
江西1563.78303.65233.81107.9209.7393.99509.39160.12
山东1675.75613.32550.71219.79272.59599.43371.62211.84
河南1427.65431.79288.55208.14217337.76421.31165.32
湖南1942.23512.27401.39206.06321.29697.22492.6226.45
湖北1783.43511.88282.84201.01237.6617.74523.52182.52
广东3055.17353.23564.56356.27811.88873.061082.82420.81
广西2033.87300.82338.65157.78329.06621.74587.02218.27
海南2057.86186.44202.72171.79329.65477.17312.93279.19
重庆2303.29589.99516.21236.55403.92730.05438.41225.8
四川1974.28507.76344.79203.21240.24575.1430.36223.46
贵州1673.82437.75461.61153.32254.66445.59346.11191.48
云南2194.25537.01369.07249.54290.84561.91407.7330.95
西藏2646.61839.7204.44209.11379.3371.04269.59389.33
陕西1472.95390.89447.95259.51230.61490.9469.1191.34
甘肃1525.57472.98328.9219.86206.65449.69249.66228.19
青海1654.69437.77258.78303244.93479.53288.56236.51
宁夏1375.46480.89273.84317.32251.08424.75228.73195.93
新疆1608.82536.05432.46235.82250.28541.3344.85214.4
import pandas as pd


data = pd.read_excel("居民家庭人均全年消费性支出.xlsx")
# 支出数据
cost = data[data.columns[1:]]

# 相关系数
asso = association(cost)
print(asso.shape)
# 降维旋转矩阵: 城市发达程度
rota = principal(asso)
print(pd.DataFrame(rota, index=data.columns[1:]))
# 对数据进行降维
cost = np.array(cost @ rota)
print(cost)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/834790.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号