加速,可视化数据,节省空间
缺点:丢失信息,计算密集,转换过程难以理解
什么时候用到降维分类前,加速;聚类前,可视化数据
维度诅咒高维数据集——非常稀疏——训练实例彼此远离——容易过拟合
主要动机:特征过多,训练变得缓慢,难以寻找更好的解决方案
例子:MNIST数据集中图像边界的像素全是白色,删除这些像素也不会丢失太多信息,或者相邻两个像素合并。
投影:适用于一个分布接近于2D子空间的3D数据集
流形学习:瑞士卷数据集
投影投影的方法:PCA (主成分分析)寻找训练集中可获得最大方差的轴。
奇异值分解(SVD)
使用numpy提供的svd()函数获得训练集的主成分如果不是用sklearn的PCA类,就要将数据集做中心化处理.
X_centered=X-X.mean(axis=0)`
`U,s,V=np.linalg.svd(X_centered)`
`c1=V.T[:,0]`
`c2=V.T[:,1]
有了奇异值分解得到的V,任意选取前d个主成分点乘原始数据集便可实现在d维的投影。
W2 = V.T[:,:2]`
`X2D=X_centered.dot(W2)
sklearn实现PCA
from sklearn.decomposition import PCA`
`pca=PCA(n_components=2)`
`X2D=pca.fit_transform(X)
使用components_访问每一个主成分
`pca.components_.T[:,0]`
方差解释率
pca.explained_variance_ratio_`
`pca = PCA(n_components=0.95)
- 可以将 n_components 设置为 0.0 到 1.0 之间的浮点数,表明希望保留的方差比率
cumsum = np.cumsum(pca.explained_variance_ratio_)`
`d = np.argmax(cumsum >= 0.95)+1
-
也可以保留相加足够大的方差部分维度
-
也可以画图寻找拐点
plt.plot(cumsum,linewidth=3)
Q:假设你对一个 1000 维的数据集应用 PCA,同时设置方差解释率为 95%,你的最终数据集将会有多少维?
可能是1-1000之间的任何数字,取决于数据集,
`pca = PCA(n_components=154)`
`X_reduced = pca.fit_transform(X_train)`
`X_recovered = pca.inverse_transform(X_reduced)`
几种不同的PCA
- 随机PCA
`rnd_pca = PCA(n_components=154,svd_solver='randomized',random_state=42)`
`X_reduced = rnd_pca.fit_transform(X_train)`
- 增量PCA:对于大型数据集可以划分成小批量,但是要在每个小批量里调用partial_fit方法
from sklearn.decomposition import IncrementalPCA`
`n_batches = 100`
`inc_pca = IncrementalPCA(n_components=154)`
`for X_batch in np.array_split(X_train,n_batches):`
`inc_pca.partial_fit(X_batch)`
`X_reduced = inc_pca.transform(X_train)`
- Kernel PCA
`from sklearn.decomposition import KernelPCA rbf_pca=KernelPCA(n_components=2,kernel='rbf',gamma=0.04) X_reduced=rbf_pca.fit_transform(X)`
- 为kPCA调参方法
-
引入模型,通过最优化模型表现调参
`from sklearn.model_selection import GridSearchCV` `from sklearn.linear_model import LogisticRegression` `from sklearn.pipeline import Pipeline` `clf = Pipeline([` `("kpca",KernelPCA(n_components=2)),` `("log_reg",LogisticRegression(solver="lbfgs"))` `])` `param_grid = [{` `"kpca__gamma":np.linspace(0.03,0.05,10), "kpca__kernel":["rbf","sigmoid"]` `}]` `grid_search = GridSearchCV(clf,param_grid,cv=3)` `grid_search.fit(X,y)`
2.基于重建功能算误差
`best_score = 0.0`
`for gamma in np.linspace(0.01, 0.05, 10):`
`for kernel in ["rbf", "sigmoid"]:`
`kpca = KernelPCA(n_components=27,fit_inverse_transform=True)`
`X_reduced = kpca.fit_transform(X)`
`X_preimage = kpca.inverse_transform(X_reduced )`
score = mean_squared_error(X, X_preimage)
if score > best_score:
best_score = score
best_parameters = {'gamma':gamma,'kernel':kernel}
print(best_parameters,best_score)
各种PCA的选择
首选常规PCA,不适合内存的大型数据集用增量PCA,想要大幅度降低维度并且追求速度用随机PCA,非线性数据集用内核PCA
流形学习 LLEfrom sklearn.manifold import LocallyLinearEmbedding
lle=LocallyLinearEmbedding(n_components=2,n_neighbors=10)
X_reduced=lle.fit_transform(X)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)