# PCA算法 | 数据集特征数量太多怎么办？用这个算法对它降维打击！

## 降维算法

ICA的英文是Independent Component Analysis即独立成分分析，在这个算法当中它假设数据是通过N个数据源生成的。假设数据是这N个数据源数据混合观察的结果。这些数据源在统计上是互相独立的，如果数据源的数目少于原始特征的数目，也可以完成降维。

## 理论推导

### 对角化

1. 对称矩阵不同的特征值对应的特征向量必然正交
2. 特征值是实数，K重特征值对应的线性无关的特征向量刚好有K个

1. 每一维特征减去平均值
2. 计算协方差矩阵
3. 求解协方差矩阵的特征值和特征向量
4. 对特征值降序排序，选择其中最大的K个，然后将对应的K个特征向量作为行向量组成特征向量P
5. 转换之后的结果 import numpy as np

def pca(df, k):
mean = np.mean(df, axis=0)
new_df = df - mean
# 计算协方差矩阵，也可以用公式自己算
cov = np.cov(new_df, rowvar=0)
# 求解矩阵特征值和特征向量
eigVals, eigVects = np.linalg.eig(np.mat(cov))
# 对特征值排序，选最大的K个，由于是从小到大排，所以我们取反
eigValIndice = np.argsort(-eigVals)
# 构建变换矩阵
n_eigValIndice = eigValIndice[:k]
n_eigVect = eigVects[:, n_eigValIndice]
data_ret = new_df.dot(n_eigVect)
return data_ret
{"ft_lang_label":"__label__zh","ft_lang_prob":0.9829374,"math_prob":0.99597114,"size":4557,"snap":"2020-45-2020-50","text_gpt3_token_len":4501,"char_repetition_ratio":0.045244895,"word_repetition_ratio":0.0,"special_character_ratio":0.12486285,"punctuation_ratio":0.05,"nsfw_num_words":0,"has_unicode_error":false,"math_prob_llama3":0.97192514,"pos_list":[0,1,2],"im_url_duplicate_count":[null,null,null],"WARC_HEADER":"{\"WARC-Type\":\"response\",\"WARC-Date\":\"2020-11-26T16:19:58Z\",\"WARC-Record-ID\":\"<urn:uuid:a2b31bff-226c-4bfb-acf3-48eb11d42750>\",\"Content-Length\":\"230446\",\"Content-Type\":\"application/http; msgtype=response\",\"WARC-Warcinfo-ID\":\"<urn:uuid:f00e7de9-fad0-4194-9ec0-549245c7dcd9>\",\"WARC-Concurrent-To\":\"<urn:uuid:fc55b83b-a362-4202-9fc8-0ab87648b7aa>\",\"WARC-IP-Address\":\"47.246.17.230\",\"WARC-Target-URI\":\"https://juejin.cn/post/6847902219635785741\",\"WARC-Payload-Digest\":\"sha1:Z5XVKZ4K76S4PIQIZHLR2UMTDWS4PU23\",\"WARC-Block-Digest\":\"sha1:QVZO5KEJIN4IHHAGOHBCR2BTP6YVZ3GG\",\"WARC-Identified-Payload-Type\":\"text/html\",\"warc_filename\":\"/cc_download/warc_2020/CC-MAIN-2020-50/CC-MAIN-2020-50_segments_1606141188800.15_warc_CC-MAIN-20201126142720-20201126172720-00064.warc.gz\"}"}