自己做的网站显示不安全怎么回事,网站系统与程序的链接,百度竞价排名官网,哪个公司建网站最好PCA的概念#xff1a;
PCA是用来实现特征提取的。 特征提取的主要目的是为了排除信息量小的特征#xff0c;减少计算量等。 简单来说#xff1a; 当数据含有多个特征的时候#xff0c;选取主要的特征#xff0c;排除次要特征或者不重要的特征。 比如说#xff1a;我们要…PCA的概念
PCA是用来实现特征提取的。 特征提取的主要目的是为了排除信息量小的特征减少计算量等。 简单来说 当数据含有多个特征的时候选取主要的特征排除次要特征或者不重要的特征。 比如说我们要区分猫和狗。那么猫和狗是否有胡子就变得尤为重要这属于主要特征但是猫和狗的颜色就变得不重要了这就属于不重要特征了。但是当我们要区分猫的种类的时候猫的颜色又变成主要特征了。这说明主要特征是相对的而不是绝对的。而我们要保留那些对结果更重要的特征减少不重要的特征这就是主成分分析。
PCA的实现
PCA算法是如何实现的
简单来说就是将数据从原始的空间中转换到新的特征空间中例如原始的空间是三维的(x,y,z)x、y、z分别是原始空间的三个基我们可以通过某种方法用新的坐标系(a,b,c)来表示原始的数据那么a、b、c就是新的基它们组成新的特征空间。在新的特征空间中可能所有的数据在c上的投影都接近于0即可以忽略那么我们就可以直接用(a,b)来表示数据这样数据就从三维的(x,y,z)降到了二维的(a,b)。
问题是如何求新的基(a,b,c)?
一般步骤是这样的
对原始数据零均值化中心化求协方差矩阵对协方差矩阵求特征向量和特征值这些特征向量组成了新的特征空间。
1.PCA–零均值化中心化
只有中心化数据之后计算得到的方向才能比较好的“概括”原来的数据。 此图形象的表述了中心化的几何意义就是将样本集的中心平移到坐标系的原点O上。 这一步其实也可以没有但是有了更加锦上添花
2.PCA–求协方差矩阵
这里更多是线性代数知识 协方差就是一种用来度量两个随机变量关系的统计量。 同一元素的协方差就表示该元素的方差不同元素之间的协方差就表示它们的相关性。 协方差 方差
协方差的性质 由定义可看出 比如三维(x,y,z)的协方差矩阵 协方差矩阵的特点 • 协方差矩阵计算的是不同维度之间的协方差 而不是不同样本之间的。 • 样本矩阵的每行是一个样本每列为一个维度所以我们要按列计算均值。 • 协方差矩阵的对角线就是各个维度上的方差
特别的如果做了中心化则协方差矩阵为中心化矩阵的协方差矩阵公式
3. 对协方差矩阵求特征向量和特征值这些特征向量组成了新的特征空间。
A为n阶矩阵若数λ和n维非0列向量x满足Axλx那么数λ称为A的特征值x称为A的对应于特征值λ 的特征向量。 式Axλx也可写成( A-λE)x0E是单位矩阵并且|A-λE|叫做A 的特征多项式。当特征多项式等于0的 时候称为A的特征方程特征方程是一个齐次线性方程组求解特征值的过程其实就是求解特征方 程的解。 对于协方差矩阵A其特征值 可能有多个计算方法为 这里就是线性代数知识 接下来进行排序特征值越大意味着相关性越大
PCA–评价模型的好坏K值的确定
通过特征值的计算我们可以得到主成分所占的百分比用来衡量模型的好坏。 对于前k个特征值所保留下的信息量计算方法如下
PCA–PCA降维的几何意义
我们对于一组数据如果它在某一坐标轴上的方差越大说明坐标点越分散该属性能够比较 好的反映源数据。所以在进行降维的时候主要目的是找到一个超平面它能使得数据点的分 布方差呈最大这样数据表现在新的坐标轴上时候已经足够分散了。 PCA算法的优化目标就是: ① 降维后同一维度的方差最大 ② 不同维度之间的相关性为0
PCA算法的优缺点
优点
完全无参数限制的。在PCA的计算过程中完全不需要人为的设定参数或是根据任何经验模型对计 算进行干预最后的结果只与数据相关与用户是独立的。用PCA技术可以对数据进行降维同时对新求出的“主元”向量的重要性进行排序根据需要取前 面最重要的部分将后面的维数省去可以达到降维从而简化模型或是对数据进行压缩的效果。同 时最大程度的保持了原有数据的信息。各主成分之间正交可消除原始数据成分间的相互影响。计算方法简单易于在计算机上实现。
缺点
如果用户对观测对象有一定的先验知识掌握了数据的一些特征却无法通过参数化等方法对处 理过程进行干预可能会得不到预期的效果效率也不高。贡献率小的主成分往往可能含有对样本差异的重要信息。
PCA的代码实现
PCA接口实现
import numpy as np
from sklearn.decomposition import PCA
X np.array([[-1,2,66,-1], [-2,6,58,-1], [-3,8,45,-2], [1,9,36,1], [2,10,62,1], [3,5,83,2]]) #导入数据维度为4
pca PCA(n_components2) #降到2维
pca.fit(X) #训练
newXpca.fit_transform(X) #降维后的数据
# PCA(copyTrue, n_components2, whitenFalse)
print(pca.explained_variance_ratio_) #输出贡献率
print(newX) #输出降维后的数据
PCA函数实现
import numpy as np
class PCA():def __init__(self,n_components):self.n_components n_componentsdef fit_transform(self,X):self.n_features_ X.shape[1]# 求协方差矩阵X X - X.mean(axis0)self.covariance np.dot(X.T,X)/X.shape[0]# 求协方差矩阵的特征值和特征向量eig_vals,eig_vectors np.linalg.eig(self.covariance)# 获得降序排列特征值的序号idx np.argsort(-eig_vals)# 降维矩阵self.components_ eig_vectors[:,idx[:self.n_components]]# 对X进行降维return np.dot(X,self.components_)# 调用
pca PCA(n_components2)
X np.array([[-1,2,66,-1], [-2,6,58,-1], [-3,8,45,-2], [1,9,36,1], [2,10,62,1], [3,5,83,2]]) #导入数据维度为4
newXpca.fit_transform(X)
print(newX) #输出降维后的数据
PCA手动函数实现 使用PCA求样本矩阵X的K阶降维矩阵Z
import numpy as npclass CPCA(object):用PCA求样本矩阵X的K阶降维矩阵ZNote:请保证输入的样本矩阵X shape(m, n)m行样例n个特征def __init__(self, X, K)::param X,训练样本矩阵X:param K,X的降维矩阵的阶数即X要特征降维成k阶self.X X #样本矩阵Xself.K K #K阶降维矩阵的K值self.centrX [] #矩阵X的中心化self.C [] #样本集的协方差矩阵Cself.U [] #样本矩阵X的降维转换矩阵self.Z [] #样本矩阵X的降维矩阵Zself.centrX self._centralized()self.C self._cov()self.U self._U()self.Z self._Z() #ZXU求得def _centralized(self):矩阵X的中心化print(样本矩阵X:\n, self.X)centrX []mean np.array([np.mean(attr) for attr in self.X.T]) #样本集的特征均值print(样本集的特征均值:\n,mean)centrX self.X - mean ##样本集的中心化print(样本矩阵X的中心化centrX:\n, centrX)return centrXdef _cov(self):求样本矩阵X的协方差矩阵C#样本集的样例总数ns np.shape(self.centrX)[0]#样本矩阵的协方差矩阵CC np.dot(self.centrX.T, self.centrX)/(ns - 1)print(样本矩阵X的协方差矩阵C:\n, C)return Cdef _U(self):求X的降维转换矩阵U, shape(n,k), n是X的特征维度总数k是降维矩阵的特征维度#先求X的协方差矩阵C的特征值和特征向量a,b np.linalg.eig(self.C) #特征值赋值给a对应特征向量赋值给b。函数dochttps://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.linalg.eig.html print(样本集的协方差矩阵C的特征值:\n, a)print(样本集的协方差矩阵C的特征向量:\n, b)#给出特征值降序的topK的索引序列ind np.argsort(-1*a)#构建K阶降维的降维转换矩阵UUT [b[:,ind[i]] for i in range(self.K)]U np.transpose(UT)print(%d阶降维转换矩阵U:\n%self.K, U)return Udef _Z(self):按照ZXU求降维矩阵Z, shape(m,k), n是样本总数k是降维矩阵中特征维度总数Z np.dot(self.X, self.U)print(X shape:, np.shape(self.X))print(U shape:, np.shape(self.U))print(Z shape:, np.shape(Z))print(样本矩阵X的降维矩阵Z:\n, Z)return Zif __name____main__:10样本3特征的样本集, 行为样例列为特征维度X np.array([[10, 15, 29],[15, 46, 13],[23, 21, 30],[11, 9, 35],[42, 45, 11],[9, 48, 5],[11, 21, 14],[8, 5, 15],[11, 12, 21],[21, 20, 25]])K np.shape(X)[1] - 1print(样本集(10行3列10个样例每个样例3个特征):\n, X)pca CPCA(X,K)
PCA应用——鸢尾花数据集
import matplotlib.pyplot as plt
import sklearn.decomposition as dp
from sklearn.datasets.base import load_irisx,yload_iris(return_X_yTrue) #加载数据x表示数据集中的属性数据y表示数据标签
pcadp.PCA(n_components2) #加载pca算法设置降维后主成分数目为2
reduced_xpca.fit_transform(x) #对原始数据进行降维保存在reduced_x中
red_x,red_y[],[]
blue_x,blue_y[],[]
green_x,green_y[],[]
for i in range(len(reduced_x)): #按鸢尾花的类别将降维后的数据点保存在不同的表中if y[i]0:red_x.append(reduced_x[i][0])red_y.append(reduced_x[i][1])elif y[i]1:blue_x.append(reduced_x[i][0])blue_y.append(reduced_x[i][1])else:green_x.append(reduced_x[i][0])green_y.append(reduced_x[i][1])
plt.scatter(red_x,red_y,cr,markerx)
plt.scatter(blue_x,blue_y,cb,markerD)
plt.scatter(green_x,green_y,cg,marker.)
plt.show()
PCA的一点思考
正如开头我举的例子当区分猫狗之间时PCA将胡子等关键信息作为主要特征但是当区分猫的种类时PCA是如何做到在猫中把颜色也作为主要特征就是说从随着算法目标的改变如何做到主要特征的改变 我后来想了想我觉得PCA是针对数据集中各数据互相之间的差距。当分析猫狗时数据集中主要是猫和狗当对数据集中进行PCA时针对的是方差较大的一些数据特征但是当分析猫的种类时数据集中主要是猫方差较大的数据特征就变成了颜色等主要特征。