• 特征降维学习笔记(pca和lda)(1)


    现在存在两种主流的降维方式:投影与流形学习,投影是指将高维数据投影在低维度的平面上,但是可能导致子空间旋转扭曲。而流形学习依赖于流形设计,流形设计主要认为现实世界高维数据集接近于低维度流体。

    主成分分析(PCA):它是通过识别靠近数据的超平面进行投影,本质上是通过比较原始数据集,到新平面的方差最小,则为第一主成分,当第二个主成分与第一个组成分的协方差为0,说明不相关,则为第二个主成分,以此类推。

    使用python计算pca:

    1. import numpy as np
    2. np.random.seed(4)
    3. m = 60
    4. w1, w2 = 0.1, 0.3
    5. noise = 0.1
    6. angles = np.random.rand(m) * 3 * np.pi / 2 - 0.5
    7. X = np.empty((m, 3))
    8. X[:, 0] = np.cos(angles) + np.sin(angles)/2 + noise * np.random.randn(m) / 2
    9. X[:, 1] = np.sin(angles) * 0.7 + noise * np.random.randn(m) / 2
    10. X[:, 2] = X[:, 0] * w1 + X[:, 1] * w2 + noise * np.random.randn(m)
    11. X_centered = X-X.mean(axis=0)
    12. U,S,Vt =np.linalg.svd(X_centered)
    13. c1 = Vt.T[:,0]
    14. c2 = Vt.T[:,1]
    15. w2 =Vt.T[:,:2]
    16. X2D = X_centered.dot(w2)
    17. X2D

    这里使用了svd方法(奇异值分解),它的作用是旋转坐标轴,进行拉伸后再进行旋转,计算均值的目的是在计算主成分的过程中,需要得到每一类主成分的均值,进而使每一类主成分的均值点距离最大,而每一类样本点中间的差异最小。

    使用sklearn中的decomposition的pca方法进行模拟

    1. from sklearn.decomposition import PCA
    2. pca =PCA(n_components=2)
    3. X_2D =pca.fit_transform(X)
    4. pca.components_.T[:,0]##第一个主成分的单位向量

    在主成分分析中,有一类方法,累计求主成分的和,当总的主成分大于95%时,就取这些主成分作为全部分成进行计算。

    pca.explained_variance_ratio_##可解释方差比,说明前两个主成分的方差占比

    这里使用pca的函数explained_variance_ratio可解释方差,本质是就是特征的重要性。

    1. from sklearn.datasets import fetch_openml
    2. mnist = fetch_openml('mnist_784', version=1, as_frame=False)
    3. mnist.target = mnist.target.astype(np.uint8)
    4. from sklearn.model_selection import train_test_split
    5. X = mnist["data"]
    6. y = mnist["target"]
    7. X_train, X_test, y_train, y_test = train_test_split(X, y)
    8. pca = PCA()
    9. pca.fit_transform(X_train)
    10. cumsum = np.cumsum(pca.explained_variance_ratio_)##对数据按行求和
    11. d = np.argmax(cumsum>0.95)+1

    也可以通过pca的超参数进行设置

    1. pca = PCA(n_components=0.95)
    2. X_reduced = pca.fit_transform(X_train)

    也可以在pca中设置参数,对数据进行压缩

    1. ##使用pca进行压缩
    2. pca = PCA(n_components=154)
    3. x_reduced = pca.fit_transform(X_train)
    4. x_reversed = pca.inverse_transform(x_reduced)

    pca.inverse_transform可以将压缩特征进行还原。

    随机pca:快速找到前d个主成分的近似值。pca中的svd_solver='randomized'

    1. rnd_pca = PCA(n_components=154,svd_solver = 'randomized')
    2. x_reduced = rnd_pca.fit_transform(X_train)
    3. rnd_pca.explained_variance_ratio_.sum()

    增量pca:将小批量的数据送入内存进行降维,完成后再输入少量数据,增加运行速度,同时节约了内存空间。这里使用了sklearn.decomposition.incrementalPCA

    1. from sklearn.decomposition import IncrementalPCA
    2. IPCA =IncrementalPCA(n_components=154)
    3. n_batches=100
    4. for x_batch in np.array_split(X_train,n_batches):
    5. IPCA.partial_fit(x_batch)
    6. x_reduced =IPCA.transform(X_train)

     也可以使用np.menmap类进行操作。

    1. filename = "my_mnist.data"
    2. m, n = X_train.shape
    3. X_mm = np.memmap(filename, dtype='float32', mode='write', shape=(m, n))
    4. X_mm[:] = X_train
    5. X_mm = np.memmap(filename, dtype="float32", mode="readonly", shape=(m, n))
    6. batch_size = m // n_batches
    7. inc_pca = IncrementalPCA(n_components=154, batch_size=batch_size)
    8. inc_pca.fit(X_mm)

    内核pca:可以解决非线性的复杂投影,可以使用网格化搜索GridSearchCV进行筛选。

    1. from sklearn.decomposition import KernelPCA
    2. from sklearn.datasets import make_swiss_roll
    3. X, t = make_swiss_roll(n_samples=1000, noise=0.2, random_state=42)
    4. rbf_pca = KernelPCA(n_components=2,kernel='rbf',gamma=0.04)
    5. x_reduced = rbf_pca.fit_transform(X)
    6. from sklearn.decomposition import KernelPCA
    7. import matplotlib.pyplot as plt
    8. lin_pca = KernelPCA(n_components = 2, kernel="linear", fit_inverse_transform=True)
    9. rbf_pca = KernelPCA(n_components = 2, kernel="rbf", gamma=0.0433, fit_inverse_transform=True)
    10. sig_pca = KernelPCA(n_components = 2, kernel="sigmoid", gamma=0.001, coef0=1, fit_inverse_transform=True)
    11. y = t > 6.9
    12. plt.figure(figsize=(11, 4))
    13. for subplot, pca, title in ((131, lin_pca, "Linear kernel"), (132, rbf_pca, "RBF kernel, $\gamma=0.04$"), (133, sig_pca, "Sigmoid kernel, $\gamma=10^{-3}, r=1$")):
    14. X_reduced = pca.fit_transform(X)
    15. if subplot == 132:
    16. X_reduced_rbf = X_reduced
    17. plt.subplot(subplot)
    18. #plt.plot(X_reduced[y, 0], X_reduced[y, 1], "gs")
    19. #plt.plot(X_reduced[~y, 0], X_reduced[~y, 1], "y^")
    20. plt.title(title, fontsize=14)
    21. plt.scatter(X_reduced[:, 0], X_reduced[:, 1], c=t, cmap=plt.cm.hot)
    22. plt.xlabel("$z_1$", fontsize=18)
    23. if subplot == 131:
    24. plt.ylabel("$z_2$", fontsize=18, rotation=0)
    25. plt.grid(True)
    26. plt.show()

    1. from sklearn.model_selection import GridSearchCV
    2. from sklearn.linear_model import LogisticRegression
    3. from sklearn.pipeline import Pipeline
    4. clf = Pipeline([
    5. ("kpca", KernelPCA(n_components=2)),
    6. ("log_reg", LogisticRegression(solver="lbfgs"))
    7. ])
    8. param_grid = [{
    9. "kpca__gamma": np.linspace(0.03, 0.05, 10),
    10. "kpca__kernel": ["rbf", "sigmoid"]
    11. }]
    12. grid_search = GridSearchCV(clf, param_grid, cv=3)
    13. grid_search.fit(X, y)
    14. print(grid_search.best_params_)
    15. rbf_pca = KernelPCA(n_components=2,kernel='rbf',gamma=0.0433,fit_inverse_transform=True)
    16. x_reduced = rbf_pca.fit_transform(X)
    17. X_preimage =rbf_pca.inverse_transform(X_reduced)
    18. from sklearn.metrics import mean_squared_error
    19. mean_squared_error(X,X_preimage)

     习题:使用MNIST数据集训练随机森林分类器,测试其花的时间与性能,然后进行降维后,判断其花费时间与性能,进行比较。

    1. from sklearn.datasets import fetch_openml
    2. mnist = fetch_openml('mnist_784', version=1, as_frame=False)
    3. mnist.target = mnist.target.astype(np.uint8)
    4. X = mnist['data']
    5. Y = mnist['target']
    6. from sklearn.model_selection import train_test_split
    7. x_train,x_test,y_train,y_test =train_test_split(X,Y,test_size=10000)
    8. from sklearn.ensemble import RandomForestClassifier
    9. import time
    10. rfc = RandomForestClassifier()
    11. start_time =time.time()
    12. rfc.fit(x_train,y_train)
    13. end_time = time.time()
    14. print(end_time-start_time)
    15. from sklearn.decomposition import PCA
    16. PCA = PCA(n_components=0.95)
    17. x_reduced_train = PCA.fit_transform(x_train)
    18. rfc_pca = RandomForestClassifier()
    19. start_time =time.time()
    20. rfc_pca.fit(x_reduced_train,y_train)
    21. end_time = time.time()
    22. print(end_time-start_time)
    23. from sklearn.metrics import mean_squared_error
    24. from sklearn.metrics import accuracy_score
    25. def model_descirbe(model,x_test):
    26. y_pred = model.predict(x_test)
    27. print('mse',mean_squared_error(y_pred,y_test))
    28. print('accuracy',accuracy_score(y_pred,y_test))
    29. model_descirbe(rfc)
    30. x_reduced_test = PCA.transform(x_test)
    31. model_descirbe(rfc_pca,x_reduced_test)

    结果发现:降维后训练时间边长,而且均方误差与正确率都低于没有降维的

  • 相关阅读:
    所谓的模糊「互联网」和「金融」两种元素的做法,不过是一个梦想罢了
    抖音实战~分享模块~生成短视频二维码
    【Linux(二)】最详细的centos7.6下载与安装
    面向对象中的继承
    Go对Json的支持[encoding/json]
    (MySQL)SQL语句练习题【老杜34题】
    华为云云耀云服务器L实例评测|使用Portainer部署showdoc文档工具
    075:vue+openlayers: Drag-and-Drop拖拽文件解析显示图形(代码示例)
    ROS机器人外网远程控制(一种基于Frp内网穿透,使用websocket/http通信方式)
    8086汇编段地址和偏移地址分配原则,深入理解.
  • 原文地址:https://blog.csdn.net/lovexyyforever/article/details/126113049