洋萝莉 数据降维的 7 种要领,附 Python 代码
-
图片洋萝莉洋萝莉
大侠幸会,不才全网同名[算法金]
图片
0 基础转 AI 上岸,多个算法赛 Top[日更万日,让更多东说念主享受智能乐趣]数据降维是一种通过减少数据的维度来索求最病确信息的技艺,其病笃性在于简化数据集、加速模子检会速率、减少存储空间需求,并匡助发现数据中的潜在结构和阵势,超越适用于高维数据下的野心复杂性和过拟合问题。先容 7 种 降维要领1. 线性降维要领:
1.1 主要素分析(PCA) 1.2 孤苦要素分析(ICA) 1.3 线性判别分析(LDA) 2. 非线性降维要领:
2.1 t-散布邻域镶嵌(t-SNE) 2.2 自编码器(Autoencoder) 2.3 局部线性镶嵌(LLE) 3. 保抓距离关系的降维要领:
3.1多维缩放(MDS)
图片
1 线性降维要领1.1 主要素分析(PCA)是一种常用的线性降维技艺,通过寻找数据中方差最大的标的,将原始高维数据映射到一个低维子空间中,以保留尽可能多的信息。图片
底下咱们使用 sklearn 内部的 PCA 器用,在一组东说念主脸数据上直不雅感受下,# 导入必要的库import numpy as npimport matplotlib.pyplot as pltfrom sklearn.datasets import fetch_olivetti_facesfrom sklearn.decomposition import PCA# 加载Olivetti东说念主脸数据集faces_data = fetch_olivetti_faces()X = faces_data.data# 可视化原始图像和对应的主要素n_images = 4 # 每行泄露的图像数目n_rows = 4 # 系数的行数fig, axes = plt.subplots(n_rows, 2*n_images, figsize=(16, 10), subplot_kw={'xticks':[], 'yticks':[]})# 使用PCA降维n_components = 50 # 成立PCA保留的主要素数目pca = PCA(n_components=n_components, whiten=True, random_state=42)X_pca = pca.fit_transform(X)for r in range(n_rows): for i in range(n_images): index = r * n_images + i axes[r, 2*i].imshow(X[index].reshape(64, 64), cmap='gray') axes[r, 2*i].set_title(f'大侠 {index+1} 图像', fontproperties='SimHei') # 手动成立字体 axes[r, 2*i+1].imshow(pca.inverse_transform(X_pca[index]).reshape(64, 64), cmap='bone') axes[r, 2*i+1].set_title(f'大侠 {index+1} 主要素', fontproperties='SimHei') # 手动成立字体plt.tight_layout()plt.show()咱们保留了前 50 个主要素
通过可视化对比图直不雅感受下,信息保留了多几许,耗费了几许
通过对比图可以看到,某一张东说念主脸的基本信息齐保留了下来
要是保留 前 100 个主要素,那就更接近原始图片了
你也可以试下,保留 1 个主要素会怎么?通过保留的信息你还认得出来哪过大侠是哪过吗
图片
图片
更多 PCA 关连现实,见往期著述 PCA 主要素分析这你看不懂,我吃!1.2 孤苦要素分析(ICA)孤苦要素分析(ICA)是一种用于将搀杂信号瓦解为孤苦源信号的技艺,其责任旨趣是通过找到最大孤苦性来估量源信号特质是可以有用地差异搀杂信号中的孤苦要素,举例音频信号中的不同谈话者经典示例是图像降噪、时辰序列数据中的伪影排斥或金融数据中启动组件的识别这儿有个意思的示例:https://github.com/akcarsten/Independent_Component_Analysis1.3 线性判别分析(LDA)通过最大化类间距离和最小化类内距离,将数据投影到低维空间中,以罢了数据的分类和可视化,适用于数据分类、特征索乞降可视化分析等场景。异同:LDA是一种监督学习要领,需要罕有据样本的标签;PCA是一种无监督学习要领,莫得标签下也能使用import numpy as npimport matplotlib.pyplot as pltfrom sklearn.datasets import make_classification# 成立matplotlib营救汉文泄露plt.rcParams['font.sans-serif'] = ['SimHei'] # 成立汉文泄露plt.rcParams['axes.unicode_minus'] = False # 正确泄露负号# 生成捏造武侠东说念主物数据集np.random.seed(42)X, y = make_classification(n_samples=1000, n_features=4, n_informative=3, n_redundant=1, n_classes=3, n_clusters_per_class=2, random_state=42)# 确认类别再行定名y_names = {0: '刚直', 1: '中立', 2: '邪派'}y_labels = np.vectorize(lambda x: y_names[x])(y)# 创建 LDA 模子并拟合数据lda = LinearDiscriminantAnalysis(n_components=2)X_r = lda.fit(X, y).transform(X)# 绘图降维后的数据plt.figure(figsize=(8, 6))colors = ['navy', 'turquoise', 'darkorange']lw = 2for color, i, target_name in zip(colors, [0, 1, 2], ['刚直', '中立', '邪派']): plt.scatter(X_r[y == i, 0], X_r[y == i, 1], color=color, alpha=.8, lw=lw, label=target_name)plt.legend(loc='best', shadow=False, scatterpoints=1)plt.title('LDA of Martial Arts Heroes dataset')plt.xlabel('LD1')plt.ylabel('LD2')plt.show()
图片
这个可视化遵循展示了过程线性判别分析(LDA)降维后的数据在二维空间中的散布情况。每个点代表一个捏造武侠东说念主物数据样本,其位置由 LDA 调节后的两个新特征(LD1 和 LD2)决定。更多现实,见免费学问星球图片
2. 非线性降维要领2.1 t-散布邻域镶嵌(t-SNE)
t-散布邻域镶嵌(t-SNE)是一种非线性降维技艺,旨在将高维数据映射到二维或三维空间,保抓数据点之间的局部结构,适用于可视化高维数据和发现数据中的潜在结构。
t-SNE 的责任旨趣是通过测量数据点之间的相通度,然后在低维空间中尽可能地保抓相通度,特质是好像有用地保留数据点之间的局部结构和聚类信息,但不保抓全局结构。
import numpy as npimport matplotlib.pyplot as pltfrom sklearn.datasets import load_irisfrom sklearn.manifold import TSNE# 加载鸢尾花数据集iris = load_iris()X = iris.datay = iris.target# 使用 t-SNE 进行降维tsne = TSNE(n_components=2, random_state=42)X_tsne = tsne.fit_transform(X)# 绘图降维后的数据plt.figure(figsize=(8, 6))colors = ['navy', 'turquoise', 'darkorange']lw = 2for color, i, target_name in zip(colors, [0, 1, 2], iris.target_names): plt.scatter(X_tsne[y == i, 0], X_tsne[y == i, 1], color=color, alpha=.8, lw=lw, label=target_name)plt.legend(loc='best', shadow=False, scatterpoints=1)plt.title('t-SNE of IRIS dataset')plt.xlabel('t-SNE Component 1')plt.ylabel('t-SNE Component 2')plt.show()图片
2.2 自编码器(Autoencoder)
一种无监督学习的技艺,旨在通过学习数据的压缩暗示,将高维数据映射到低维空间,适用于特征索乞降数据重建。
责任旨趣:通过神经收集将输入数据压缩到一个低维编码,然后再解码回原始维度,使得重构罪过最小化,特质是好像学习数据中的有用特征抒发,适用于无监督特征学习、降噪和图像去噪等场景。
import numpy as npimport matplotlib.pyplot as pltfrom keras.datasets import mnistfrom keras.models import Modelfrom keras.layers import Input, Dense# 加载 MNIST 数据集(X_train, _), (X_test, _) = mnist.load_data()# 数据预责罚X_train = X_train.astype('float32') / 255.X_test = X_test.astype('float32') / 255.X_train = X_train.reshape((len(X_train), np.prod(X_train.shape[1:])))X_test = X_test.reshape((len(X_test), np.prod(X_test.shape[1:])))# 构建自编码器模子input_img = Input(shape=(784,))encoded = Dense(32, activation='relu')(input_img) # 编码层,将输入压缩到32维decoded = Dense(784, activation='sigmoid')(encoded) # 解码层,将编码遵循解压缩到784维autoencoder = Model(input_img, decoded)autoencoder.compile(optimizer='adam', loss='binary_crossentropy')# 检会自编码器模子autoencoder.fit(X_train, X_train, epochs=50, batch_size=256, shuffle=True, validation_data=(X_test, X_test))# 使用检会好的自编码器模子进行数据降维encoder = Model(input_img, encoded)encoded_imgs = encoder.predict(X_test)# 可视化降维后的遵循n = 10 # 可视化的数字数目plt.figure(figsize=(20, 4))for i in range(n): ax = plt.subplot(2, n, i + 1) plt.imshow(X_test[i].reshape(28, 28)) plt.gray() ax.get_xaxis().set_visible(False) ax.get_yaxis().set_visible(False) ax = plt.subplot(2, n, i + 1 + n) plt.imshow(encoded_imgs[i].reshape(8, 4)) # 将32维的编码遵循reshape为8x4的图像 plt.gray() ax.get_xaxis().set_visible(False) ax.get_yaxis().set_visible(False)plt.show()
2.3 局部线性镶嵌(LLE)
一种非线性降维要领,通过保抓局部数据之间的线性关系,在保留数据结构的同期将高维数据映射到低维空间,适用于保抓局部结构的降维需求。
责任旨趣:在局部邻域内哄骗线性关系重建数据,通过最小化重建罪过来学习数据的低维暗示,特质是好像保抓数据之间的局部结构和流形局势,适用于高维数据的可视化、图像责罚和阵势识别等场景。
import numpy as npimport matplotlib.pyplot as pltfrom sklearn.datasets import make_swiss_rollfrom sklearn.manifold import LocallyLinearEmbedding# 成立matplotlib营救汉文泄露plt.rcParams['font.sans-serif'] = ['SimHei'] # 成立汉文泄露plt.rcParams['axes.unicode_minus'] = False # 正确泄露负号# 生成Swiss Roll数据集X, _ = make_swiss_roll(n_samples=1000, noise=0.2, random_state=42)# 使用局部线性镶嵌进行降维lle = LocallyLinearEmbedding(n_components=2, n_neighbors=10, random_state=42)X_lle = lle.fit_transform(X)# 绘图降维后的数据plt.figure(figsize=(8, 6))plt.scatter(X_lle[:, 0], X_lle[:, 1], c=X[:, 1], cmap='viridis')plt.colorbar(label='Swiss Roll中的高度')plt.title('局部线性镶嵌(LLE)降维')plt.xlabel('新特征1')plt.ylabel('新特征2')plt.show()图片
图片
3. 保抓距离关系的降维要领3.1多维缩放(MDS)
一种用于将高维数据映射到低维空间的技艺,以保抓数据点之间的距离关系为目标,适用于可视化高维数据和发现数据之间的相通性。
放荡护士的自白在线观看责任旨趣:通过优化数据点之间的距离或相通度矩阵,将高维数据点映射到低维空间,特质是好像保抓数据点之间的全局距离关系。
import numpy as npimport matplotlib.pyplot as pltfrom sklearn.datasets import load_irisfrom sklearn.manifold import MDS# 加载鸢尾花数据集iris = load_iris()X = iris.datay = iris.target# 使用多维缩放进行降维mds = MDS(n_components=2, random_state=42)X_mds = mds.fit_transform(X)# 绘图降维后的数据plt.figure(figsize=(8, 6))plt.scatter(X_mds[:, 0], X_mds[:, 1], c=y, cmap='viridis')plt.colorbar(label='鸢尾花类别')plt.title('多维缩放(MDS)降维')plt.xlabel('新特征1')plt.ylabel('新特征2')plt.show()
图片
免费学问星球,接待加入换取[ 抱个拳,总个结 ]遴荐合适的数据降维要领取决于多个因素,包括数据类型、降维目标、野心资源和算法特质等。以下是一些斟酌因素:
数据类型:领先要斟酌数据的类型,包括数据的维度、结构和特征类型。举例,关于结构化数据(如表格数据),主要素分析(PCA)频繁是一个可以的遴荐;关于非线性数据或流形结构数据(如图像、文本、时辰序列等),t-散布邻域镶嵌(t-SNE)和局部线性镶嵌(LLE)可能更稳妥。
降维目标:详情降维的目标是病笃的。偶而候咱们只是是为了可视化数据,而偶而咱们需要保留尽可能多的信息以便后续的机器学习任务。要是目标是可视化数据,则应遴荐好像有用保留数据结构和相通性的要领,如t-SNE;要是目标是尽可能保留数据的信息,则PCA可能更合适。
野心资源:一些降维要领在责罚大边界数据时可能需要大宗的野心资源和时辰。举例,t-SNE 的野心复杂度较高,关于大边界数据集可能不太适用。在这种情况下,可以斟酌使用PCA或增量式的降维要领来责罚大边界数据。
算法特质:不同的降维要领有不同的算法特质和假定条目。举例,PCA 假定数据是线性可分的,适用于线性关连的数据;t-SNE 假定数据在高维空间中呈现流形结构,适用于非线性数据。因此,要确认数据的特质遴荐合适的降维要领。
[ 算法金,碎碎念 ]图片
带小一又友去市集玩,中午在初满吃饭点了一份拉面,面还挺适口其中有有一个蛋,我用筷子一夹心里暗叫一声:不好这个蛋如何这样软姐姐看出了我的心想,问:你是不是想这个蛋没弄好,咋这样软我忙点头称是,她哈哈笑了起来,说:这叫溏心蛋,是他们家的特色害,我阿谁窘态啊。没目力,真可怕但愿今天的日更能给人人涨些目力,hhh全网同名,日更万日,让更多东说念主享受智能乐趣,本日 116/10000 本站仅提供存储职业,整个现实均由用户发布,如发现存害或侵权现实,请点击举报。