机器学习入门三(无监督学习中的降维算法)

目录

前言

一、降维算法简介     

二、下载自带的酒数据集,并作简单分析

三.主成分分析(PCA)

3.1 算法简介

3.2算法实战

四、核主成分分析(KPCA)        

4.1算法简介

4.2算法实战

五、 t-SNE

5.1算法简介

5.2算法实战   

 六、多维尺度分析(MDS)

 6.1算法简介

6.2算法实战

总结 


前言

        上篇介绍了无监督学习的聚类算法,具体讲了K-Means和DBSCAN算法,无监督学习剩下来的一部分便是降维。这篇作者将带大家学习一下无监督学习中的降维算法。本次重点介绍 主成分分析、核主成分分析、t-SNE、多维尺度分析方法。


一、降维算法简介     

        先通俗的讲解一下何为降维。我想大家以前应该都玩过魔方,一般来说我们玩的是三阶魔方,其实还有四阶、五阶甚至更高层数的魔方,这里就拿四阶魔方当例子吧。我们还原四阶魔方的过程是将一面4*4,最中心的四个块看为三阶魔方的中心块,每个棱边看作一个整体。然后降解为三阶魔方。如下图所示:

        经过降维后我们会发现问题变得熟悉且更为简单。

        接着我们详细的讲解一下降维算法:

        降维算法是一种将高维数据映射到低维空间的方法。在现实生活中,很多数据都是高维的,例如文本、图像、音频等。然而,高维数据不仅难以可视化,而且处理和分析也会变得更加复杂。因此,降维算法可以帮助我们更好地理解和分析数据。

        降维算法的目的是找到一个低维空间,该空间能够最大程度地保留原始数据的特征。在这个过程中,我们可以丢弃那些不必要的维度,并减少计算和存储的成本。通常情况下,降维算法可以分为线性降维和非线性降维两类。

        线性降维方法包括主成分分析(PCA)、线性判别分析(LDA)等。这些方法是基于线性代数的思想,用于寻找数据中的主要特征或提取最相关的特征。而非线性降维方法则包括t-SNE、LLE等,这些方法可以处理非线性关系的数据,并在保留重要信息的同时减少数据维度。

        降维算法在数据分析、图像处理、自然语言处理等领域都有广泛应用。例如,在图像处理中,我们可以使用降维算法压缩和减少图像的维度,从而实现图像压缩和加速处理的目的。

二、下载自带的酒数据集,并作简单分析

        因为作者考虑到下载数据比较麻烦,所以这里我们直接用sklearn自带的数据集,这样方便很多,但同时有个缺点,就是我们看数据的时候会一脸懵。所以这里作者给大家详细讲讲。

        话不多说先上代码

from sklearn.datasets import load_wine #考虑到大家找数据麻烦,我们直接使用sklearn自带的数据集酒数据集
from sklearn.decomposition import PCA, KernelPCA
from sklearn.manifold import  MDS, TSNE
from sklearn.preprocessing import StandardScaler
#先分析一下数据情况,看看数据集的特征维度和标签维度
wine_x,wine_y = load_wine(return_X_y=True)
print(wine_x.shape)#(178, 13) 表示13个特征,数据集有178个样本,类型是连续数据,里面有果糖啊,酒精度啊,酸度啊等等
print(wine_y)   #标签是0,1,2三个类别 具体是啥类别我们不知道,但是我们可以通过降维可视化看看

         这个数据集还是挺有意思的哈,下载完之后会发现返回的是个元组类型的数据,然后我们拆开这个元组,发现wine_x中全部是连续数据,wine_y中是分类型数据,里面的编码为0,1,2。

         接下来便是我们利用不同的降维算法对其进行降维了。 哦对了还要对数据做个简单的处理

wine_x = StandardScaler().fit_transform(wine_x) #标准化数据

        这列做的数据标准化。数据的标准化是特征缩放的方法,是数据预处理的关键步骤。不同评价指标往往具有不同的量纲和量纲单位,这样的情况会影响到数据分析的结果,为了消除指标之间的量纲影响,需要进行数据标准化处理,以解决数据指标之间的可比性。原始数据经过数据标准化处理后,各指标处于同一数量级,适合进行综合对比评价。 至于具体的数学知识可能要问度娘了,这里作者一知半解。

三.主成分分析(PCA)

3.1 算法简介

        主成分分析(PCA)是一种常用的数据降维方法,通过将原始的高维数据映射到一个低维空间中,保留数据的主要特征,而丢弃次要特征。其基本思想是通过线性变换将高维空间中的数据映射到低维空间中,使得数据在低维空间中的方差最大化。

主成分分析的步骤如下:

1.数据预处理:去中心化,即将每个变量减去其平均值,使其均值为0。

2.计算协方差矩阵:将去中心化的数据乘以自己的转置矩阵,得到协方差矩阵。

(这里涉及到了那个啥的线性代数的知识)

3.计算特征向量及特征值:对协方差矩阵进行特征分解,得到特征向量和特征值。

4.选择主成分:将特征值排序,选取前k个特征向量作为主成分。

5.映射到低维空间:将数据乘以所选的特征向量构成的矩阵,即可将原始数据映射到低维空间中。

        这是线性降维的一种算法,虽然步骤及其麻烦还要算特征值啥的,但是在程序中我们只用调用库就可以完成。废话不多说直接实战

3.2算法实战

        我们直接把wine_x的数据进行主成分分析,其中一共13个特征

import matplotlib.pyplot as plt
plt.style.use('ggplot')
# 支持中文
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
## 使用主成分分析对酒数据集进行降维
pca = PCA(n_components = 13,random_state = 111)#n_components表示降维后的维度数,random_state表示随机种子,保证每次运行结果一致
pca.fit(wine_x)#训练模型
## 可视化主成分分析的解释方差得分
jieshifangcha = pca.explained_variance_#获取解释方差
print(jieshifangcha)
plt.figure(figsize=(10,6))
plt.plot(jieshifangcha,"r-o")#画图
plt.hlines(y = 1, xmin = 0, xmax = 12)
plt.xlabel("特征数量")
plt.ylabel("解释方差大小")
plt.title("主成分分析")
plt.show()

     


 

        这里强调一下,解释方差越大,特征的代表性其实就越强,可以看到降维后三个特征的解释方差都是大于1的,因此我们选择前3个特征,接着我们做主成分分析的可视化 。

        

from mpl_toolkits import mplot3d
## 可以发现使用数据的前个主成分较合适
pca_wine_x = pca.transform(wine_x)[:,0:3]
## 在3D空间中可视化主成分分析后的数据空间分布
colors = ["red","blue","green"]
shapes = ["o","s","*"]
fig = plt.figure(figsize=(10,6))
## 将坐标系设置为3D
ax1 = fig.add_subplot(111, projection="3d")
for i,j in enumerate(wine_y):#j是标签,i是索引
    ax1.scatter(pca_wine_x[i,0],pca_wine_x[i,1],pca_wine_x[i,2],
                s = 40,c = colors[j],marker = shapes[j])#s表示点的大小,c表示颜色,marker表示形状
ax1.set_xlabel("主成分1")
ax1.set_ylabel("主成分2")
ax1.set_zlabel("主成分3")
ax1.azim = 215#设置坐标轴的角度 调了一下这个合适的角度
ax1.set_title("主成分特征空间可视化")
plt.show()

     出图:  

四、核主成分分析(KPCA)        

4.1算法简介

        PCA做的是线性降维,KPCA组事故非线性降维,用到的库是KernelPCA。这个好像没啥好讲的就和上面那个结果不同

        KPCA也是一种降维方法,它是对传统PCA的一种扩展。与传统PCA不同的是,KPCA利用核函数对原始数据进行非线性映射,将数据映射到一个高维的特征空间中,然后在这个高维的特征空间中进行PCA降维。这样,KPCA可以处理非线性的数据结构,从而更好地保留数据的本质特征。

        KPCA的基本思想是先将原始数据通过核函数映射到一个高维的特征空间,然后在特征空间中进行PCA分析,得到主成分和它们对应的权重。这些特征向量和权重可以用来重构原始数据或者用于后续的模型训练。

KPCA的步骤如下:

1.选择核函数:由于KPCA依赖于核函数,因此需要选择合适的核函数,如线性核函数、多项式核函数、高斯核函数等。

2.计算核矩阵:将原始数据通过核函数进行计算,得到核矩阵。#这里有点触及到作者的知识盲区了。

3.中心化核矩阵:对核矩阵进行中心化,使得每行和每列的平均值为0。

4.计算特征向量和权重:对中心化的核矩阵进行PCA分析,得到主成分和它们对应的权重。

5.映射到低维空间:将数据通过特征向量和权重映射到低维空间中。

4.2算法实战

        和上面的PCA差不多先看中心矩阵的特征值大小

## 使用核主成分分析获取数据的主成分
kpca = KernelPCA(n_components = 13,kernel = "rbf", ## 核函数为rbf核
                 gamma = 0.2,random_state = 123)
kpca.fit(wine_x)
## 可视化核主成分分析的中心矩阵特征值
lambdas = kpca.lambdas_
plt.figure(figsize=(10,6))
plt.plot(lambdas,"r-o")
plt.hlines(y = 4, xmin = 0, xmax = 12)
plt.xlabel("特征数量")
plt.ylabel("中心核矩阵的特征值大小")
plt.title("核主成分分析")
plt.show()
## 可以发现使用数据的前3个核主成分较合适

        

## 获取前3个核主成分
kpca_wine_x = kpca.transform(wine_x)[:,0:3]
print(kpca_wine_x.shape)
## 在3D空间中可视化主成分分析后的数据空间分布
colors = ["red","blue","green"]
shapes = ["o","s","*"]
fig = plt.figure(figsize=(10,6))
## 将坐标系设置为3D
ax1 = fig.add_subplot(111, projection="3d")
for i,j in enumerate(wine_y):
    ax1.scatter(kpca_wine_x[i,0],kpca_wine_x[i,1],kpca_wine_x[i,2],
                s = 40,c = colors[j],marker = shapes[j])
ax1.set_xlabel("核主成分1",rotation=20)
ax1.set_ylabel("核主成分2",rotation=-20)
ax1.set_zlabel("核主成分3",rotation=90)
ax1.azim = 225
ax1.set_title("核主成分特征空间可视化")
plt.show()

 

        仔细观察其实这俩降维方法还是有一定差别的 。

五、 t-SNE

5.1算法简介

        t-SNE是一种用于数据降维和可视化的非线性算法。它被广泛应用于机器学习、数据挖掘、自然语言处理等领域。

        t-SNE算法具有很好的可视化效果,可以帮助我们快速地理解数据集的结构和不同样本之间的关系。但是,t-SNE算法也有一些限制,如计算复杂度较高,对参数的选择敏感等等。因此,在使用t-SNE算法时,需要根据具体的数据集和任务来进行参数调整和优化。

5.2算法实战   

        世界上代码跟上面类似,就是改变一下模型

## TSNE进行数据的降维,降维到3维空间中 基本维度都是3
tsne = TSNE(n_components = 3,perplexity =25,
            early_exaggeration =3,random_state=123) #n_components表示降维后的维度数,perplexity表示困惑度,early_exaggeration表示早期压缩
## 获取降维后的数据
tsne_wine_x = tsne.fit_transform(wine_x)
## 在3D空间中可视化流行降维后的数据空间分布
colors = ["red","blue","green"]
shapes = ["o","s","*"]
fig = plt.figure(figsize=(10,6))
## 将坐标系设置为3D
ax1 = fig.add_subplot(111, projection="3d")
for i,j in enumerate(wine_y):
    ax1.scatter(tsne_wine_x[i,0],tsne_wine_x[i,1],tsne_wine_x[i,2],
                s = 40,c = colors[j],marker = shapes[j])
ax1.set_xlabel("特征1")
ax1.set_ylabel("特征2")
ax1.set_zlabel("特征3")
ax1.azim = 210
ax1.set_title("TSNE降维可视化")
plt.show()

   

 六、多维尺度分析(MDS)

 6.1算法简介

        通俗的来讲这是一种通过数据低维度空间的可视化,从而对高维度数据进行可视化的方法。

        与t-SNE算法相比,MDS算法计算复杂度较低,而且对参数的选择不太敏感,但是在某些情况下可能会存在数据失真的问题。因此,在使用MDS算法时,需要根据具体的数据集和任务进行参数设置和优化。

6.2算法实战

        

# MDS进行数据的降维 维度3
mds = MDS(n_components = 3,dissimilarity = "euclidean",random_state=111) #n_components表示降维后的维度数,dissimilarity表示距离度量
# 获取降维后的数据
mds_wine_x = mds.fit_transform(wine_x)
# 在3D空间中可视化流行降维后的数据空间分布
colors = ["red","blue","green"]
shapes = ["o","s","*"]
fig = plt.figure(figsize=(10,6))
# 将坐标系设置为3D
ax1 = fig.add_subplot(111, projection="3d")
for i,j in enumerate(wine_y):
    ax1.scatter(mds_wine_x[i,0],mds_wine_x[i,1],mds_wine_x[i,2],
                s = 40,c = colors[j],marker = shapes[j])
ax1.set_xlabel("特征1")
ax1.set_ylabel("特征2")
ax1.set_zlabel("特征3")
ax1.azim = 210
ax1.set_title("MDS降维可视化")
plt.show()


总结 

        降维总的来说就是这么个意思,将复杂的信息,以最少丢失的方式简单化。其中涉及的数学原理还是比较复杂的,主要是矩阵方面的运算,各位一定要学习好线性代数,否则这方面的理解将会及其的苦难。暑假也快要结束,作者还在赶统计调查大赛的事情。有空的时候会抽出一些时间来继续学习机器学习,同时将所学的东西分享给大家。创作不易,希望大家可以支持一下,这里作者也希望能更快的到达500粉,成为一个创作者。

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

朱笨笨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值