知识学习
整体思想就是根据重要特征(为主)附加其他特征(为辅)生成新的维度的特征
; 代码实战
学习视频链接:b站传送门
这里使用了来自视频教程的数据集:github传送门
数据集下载方式:CSDN传送门
首先是数据预处理部分:
过程中所需要使用的所有包
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
获得原始数据并进行简要查看,可以借助info和head工具
traindata_0 = pd.read_csv(r'C:\Users\Administrator\Desktop\train_titanic.csv', index_col = 'PassengerId')
'''Pandas dataframe.info()函数用于获取 DataFrame 的简要摘要。在对数据进行探索性分析时,它非常方便。为了快速浏览数据集,我们使用dataframe.info()功能。
用法: DataFrame.info(verbose=None, buf=None, max_cols=None, memory_usage=None, null_counts=None)
参数:verbose:是否打印完整的摘要。屏幕上将不显示任何内容。max_info_columns设置。 True或False会覆盖显示。max_info_columns设置。buf:可写缓冲区,默认为sys.stdoutmax_cols:确定是打印完整摘要还是简短摘要。屏幕上将不显示任何内容。max_info_columns设置。memory_usage:指定是否应显示DataFrame元素(包括索引)的总内存使用情况。屏幕上将不显示任何内容。memory_usage设置。 True或False会覆盖显示。memory_usage设置。 " deep"的值与True相同,具有自省性。内存使用情况以人类可读的单位(以2为基数的表示形式)显示。null_counts:是否显示非空计数。如果为None,则仅显示框架是否小于max_info_rows和max_info_columns。如果为True,则始终显示计数。如果为False,则从不显示计数。'''
print(traindata_0.info())
'''Pandas DataFrame head()方法返回DataFrame或Series的前n行,其中n是用户输入值。 head()函数用于获取前n行。这对于快速测试对象中的数据类型是否正确非常有用。对于n的负值,head()函数返回除最后n行之外的所有行,等效于df[:-n]。
句法:DataFrame.head(n=5) (n=5 is default we can set any value)
参量:python中的head()方法仅包含一个参数,即n。它是一个可选参数。通过设置它,我们固定了想要从DataFrame获得的行数。
返回值:head()函数从DataFrame返回n行。'''
traindata_0.head()
处理缺失数据
traindata = traindata_0.copy()
traindata.Sex = traindata.Sex.replace({'female':0, 'male':1})
traindata.Embarked = traindata_0.Embarked.replace({'C':0, 'Q':1, 'S':2})
traindata.Age.fillna(traindata.Age.mean(), inplace = True)
traindata.Embarked.fillna(method = 'ffill', inplace = True)
traindata.drop(columns = ['Survived', 'Name', 'Ticket', 'Cabin'], inplace = True)
traindata.info()
print(traindata.head())
traindata.to_csv(r'C:\Users\Administrator\Desktop\data_pca.csv')
然后是pca部分:
读入数据,得有一个矩阵x,维度为(m,n),m个采样数据,每个数据有n个feature
data = pd.read_csv(r'C:\Users\Administrator\Desktop\data_pca.csv')
data.describe()
对x去均值、标准化
def norm_(x):
xmean = np.mean(x, 0)
std = np.std(x,0)
return (x - xmean)/std
data_ = norm_(data)
data_.describe()
求 X T X X^TX X T X 或 C o v ( X T ) Cov(X^T)C o v (X T ) 的特征值 ( e w ) (ew)(e w ) 和特征向量 ( e v ) (ev)(e v ) ,其中维度: e w ( 1 , n ) , e v ( n , n ) ew(1,n),ev(n,n)e w (1 ,n ),e v (n ,n )
借助numpy工具提取特征值
ew, ev = np.linalg.eig(data_.T.dot(data_))
print(ew)
print(ev)
print('\n')
ew, ev = np.linalg.eig(np.cov(data_.T))
print(ew)
print(ev)
print('\n')
按照 e w ew e w 从大到小的顺序,取 e v ev e v 的对应的列。 e v ev e v 取前k列得到矩阵 V V V ,维度 ( n , k ) (n,k)(n ,k )
将特征值进行排序
'''在输出数据中可以看出有七个特征值(分别对应七个特征,但是没有按照顺序排布)'''
ew_order = np.argsort(ew)[::-1]
print(ew_order)
ew_sort = ew[ew_order]
ev_sort = ev[:,ew_order]
print(ew_sort)
print(ev_sort)
画图来直观认识一下特征向量:
pd.DataFrame(ew_sort).plot(kind='bar')
得到图片如下:
我们希望使得前k个的核远大于后几个,能达到总核的95%就是最理想的,这样的话主成分提取就会效果比较好。
因为我们需要将原始的7个feature降到几个feature去代表观察,这里的话前两个可以近似代表观察。
于是我们提取关键特征
V = ev_sort[:,:2]
有 X n e w = X ∗ V X_{new}=X * V X n e w =X ∗V , 维度: X n e w ( m , k ) X_{new}(m,k)X n e w (m ,k )
X_new = data_.dot(V)
print(x_new.shape)
前k个 e v ev e v 即主成分(主方向)。因为前k个很重要,就实现了从n维到k维的降维
此时可以画图查看一下(不知道为什么我画的图和教程不是特别一致)
print(type(X_new))
%matplotlib notebook
sc = plt.scatter(X_new.iloc[:,0], X_new.iloc[:,1],s=5, c = traindata_0.Survived,cmap = plt.cm.coolwarm)
plt.xlabel('PC 0')
plt.ylabel('PC 1')
plt.colorbar(sc)
Original: https://blog.csdn.net/m0_52414727/article/details/123465803
Author: m0_52414727
Title: PCA及其实战学习
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/675623/
转载文章受原作者版权保护。转载请注明原作者出处!