1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 数据挖掘学习--主成分分析

数据挖掘学习--主成分分析

时间:2022-08-10 21:51:35

相关推荐

数据挖掘学习--主成分分析

1.前言

花了好几天的时间去学习数据挖掘里面的主成分分析(principal component analysis , PCA)。PCA是一种常用的无监督学习方法,他作为一种数据降维的方法是很有效的。选择的数据集很经常的都是高维数据,处理起来要么就是处理时间太慢,要么就是训练出来的学习模型精度会很低。同时,这些高维数据里面就有的数据是不相关的,这些特征(维)是我们不需要的。那么对于这种情况,降维是必须的。

2.主成分分析算法

据《统计学习方法》一书的表达:“主成分分析是利用正交变换把由线性相关变量表示的观测数据转换为少数几个由线性无关变量表示的数据,线性无关的变量称为主成分。”按我的理解,就是将所有的高维数据点,通过投影映射的方法,将数据点转换至一个新的坐标系,而这个坐标系的维度是小于或等于原先的坐标系维度的。同时,找到这个我们想要的坐标系的标准就是,在新坐标系中,投影后的数据对应的每个坐标轴上的数据的方差和都是最大的,这样我们保存下来的数据就是最完整的。而为了找到这个坐标轴,我们可以拆分子问题,先找第一个坐标轴,第二个…知道找到想要的结果。这里的第一坐标轴,就称为是第一主成分,以此类推。

3.总体主成分的定义(a = (a1 , a2 , … , ak)T ,其中a1 , a2 , … 都是一组n维向量)T:

满足以下三点:

一、每一个向量a1都是单位向量

二、a矩阵中的每一个向量a1 , a2 , …两两的协方差均为0,即他们之间互不相关

三、a1是x数据的所有线性变换中方差最大的,a2是与a1无关的x的所有线性变换中方差和最大的…

4.数学推导

一、针对某个均值为0的数据集x中,找到一个相对于当前x方差最大的主成分,也就是一个坐标轴,坐标轴的方向向量是w = (w1 , w2 , w3 ,…,wn)

得到方差函数f(x)

二、针对当前的方差函数,求出他的最大值,即方差最大化,用的是梯度上升的方法进行寻找。对多元函数的极值,还是同样的方法,求偏导。

三、当求出一个主成分,想求下一个主成分,此时应先对当前的x进行操作,就是使得新的x与刚刚的主成分无关,这样才确保求出来的新的主成分是和原来的主成分是不相关的。

四、不断循环上述过程,直到得到自己预想数量的总体主成分

5.PCA代码

import numpy as npclass PCA:def __init__(self , n_components):assert n_components >= 1 , "The number of n is not valid."self.n_components = ponents_ = None#对这个PCA实例,传入一个待主成分分析的矩阵X,用PCA来适应这个X,提取出他的k个主成分(k个方向向量)#保存再PCA实例的components里面,是个k*n维矩阵,k是主成分的个数,n是X的列数def fit_(self , X1):assert X1.shape[1] >= self.n_components , "It's not legal."# 对数据进行demean操作,使得数据在各个特征下的均值为0def demean(X):return X - np.mean(X , axis = 0)# 求数据点投影到一个方向向量后的方差,这个函数越大越可取def f(X , w):return ((np.sum(X.dot(w))) ** 2 ) / X.shape[0]# 求方差的导数,用这个得到一个对w向量每一个项的导数,返回的也是一个n维的向量def df(X , w):return (X.T.dot(X.dot(w))) * 2. / X.shape[0]# 对w进行单位化def direction(w):return w / np.linalg.norm(w)# 得到下一个主成分的方法,就是将原先的数据点除去前一个主成分方向上的数值,具体就是# 针对某一个点X(i),他在前一个主成分W上的投影是Xproject,然后紧接着就可以做差X(i) - X(i)project得到去除第一主成分的矩阵def delete_pca(X , w):X2 = np.empty(X.shape)for i in range(0 , X.shape[0]):X2[i] = X[i] - (X[i].dot(w)) * wreturn X2##梯度上升法求出最佳的向量w,也就是最佳的参数def get_next_pca(X , initial_w , eta = 0.01 , n_iter = 1e4 , epional = 1e-8):w = direction(initial_w)count = 0while count < n_iter:history_w = wgradient = df(X , w)w = w + eta * gradientw = direction(w)if(abs(f(X , history_w) - f(X , w)) < epional):breakcount += 1return w# 如果是想得到n个主成分,通过一次调用函数就想得出def get_n_pca(X, n , eta = 0.01 , n_iter = 1e4 , epional = 1e-8):X_pca = X.copy()#注意这里的W矩阵(里面包括n个方向向量w,即前n个主成分)的矩阵大小,一共有n行(前n个主成分),并且有X.shape[1]行total_w = np.empty((self.n_components , X.shape[1]))for i in range(0 , n):initial_w = np.random.random(X.shape[1])w = get_next_pca(X_pca , initial_w)for j in range(0 , len(w)):total_w[i,j] = w[j]X_pca = delete_pca(X_pca , w)return total_wX1 = demean(X1)ponents_ = get_n_pca(X1 , self.n_components)return self#当PCA已经fit之后,可以用此PCA来转化X得到将维后的矩阵Xdef tranport(self , X):print(ponents_)return X.dot(ponents_.T)

6.scikit-learn封装的PCA类使用

pca = PCA(0.95)pca.fit(X_train)X_train_reduction = pca.transform(X_train)X_test_reduction = pca.transform(X_test)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。