加速,可视化数据,节省空间
缺点:丢失信息,计算密集,转换过程难以理解
分类前,加速;聚类前,可视化数据
高维数据集——非常稀疏——训练实例彼此远离——容易过拟合
主要动机:特征过多,训练变得缓慢,难以寻找更好的解决方案
例子:MNIST数据集中图像边界的像素全是白色,删除这些像素也不会丢失太多信息,或者相邻两个像素合并。
投影:适用于一个分布接近于2D子空间的3D数据集
流形学习:瑞士卷数据集
投影的方法:PCA (主成分分析)寻找训练集中可获得最大方差的轴。
奇异值分解(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)
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)
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)`
`rnd_pca = PCA(n_components=154,svd_solver='randomized',random_state=42)`
`X_reduced = rnd_pca.fit_transform(X_train)`
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)`
`from sklearn.decomposition import KernelPCA rbf_pca=KernelPCA(n_components=2,kernel='rbf',gamma=0.04) X_reduced=rbf_pca.fit_transform(X)`
引入模型,通过最优化模型表现调参
`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
from sklearn.manifold import LocallyLinearEmbedding
lle=LocallyLinearEmbedding(n_components=2,n_neighbors=10)
X_reduced=lle.fit_transform(X)