【Day23-降维】相信你的眼睛,在训练模型之前一定要做的事情——利用降维技巧检视资料分群状态:PCA, tSNE, SVD, SOM

昨天我们稍微讲了一下如何透过一些基本的图来让在做资料分析的时候有一个初步的认识
但有的时候我们的资料维度还是实在太多了,这个时候适当的使用一些降维技巧也可以帮助我们建立起对於资料的基本理解

降维

降维是什麽,为什麽可以降维?

明明是表示10个不同资讯的维度的资料,为什麽可以降到2维或3维呢?
其实是因为通常原始资料的不同维度之间其实不是独立的,而在降维的过程就好像是在做图片压缩一样,能用比较少的维度来表示原来资料大部分的资讯内容

降维可以做什麽,什麽时候很有用?

对於维度特别高而每个维度所蕴含的资讯又没有那麽密集的时候,就有可能会有维度灾难的产生,因此适当的压缩一下维度对解决这个现象有一定程度的帮助

降维不是什麽,使用时候要注意的事情

就好像牛奶加到红茶里面里面一样,今天既然用了比较低的维度去表示原来的资料,表示几乎一定会有一部分的资讯被遗失,而且有些降维方式并不具备可以直接反转换回本来维度的意义,因此要如何解释新的维度也是一个需要思考的问题。

常见的降维方式

可以拿来降维的方式有很多,我这边主要以比较常用的四种为例子

今天也一样用iris来当范例

# 范例资料使用鸢尾花资料集
iris = sns.load_dataset('iris')
iris_feature = iris.iloc[:,:4]

主成分分析PCA(Principal Component Analysis)

  • 主要想法:透过线性变化的方式,尽量保留彼此之间不同的成分
    • 而且是一个可以回推每个维度代表原始维度组成比例的方式。
from sklearn.decomposition import PCA
pca = PCA(n_components=2, copy=True, whiten=False) # 建立转换器
iris_pca = pca.fit_transform(iris_feature) # 转换
df_tsne = pd.DataFrame({
    "Dim1":iris_pca[:,0],
    "Dim2":iris_pca[:,1],
    "Label": iris["species"]
}) # 重建DataFrame
ax = sns.scatterplot(x="Dim1", y="Dim2", hue="Label",
                  data=df_tsne) # 绘图

输出:

t-随机邻近嵌入法tSNE(t-distributed stochastic neighbor embedding)

  • 主要想法:使用条件机率和高斯分布(低维时为t分布)来定义高维和低维中样本点之间的相似度
# 建立tsne转换器
from sklearn.manifold import TSNE
tsne = TSNE(n_components=2, init='pca', random_state=0,perplexity=3) # 困惑度慎选
iris_tsne = tsne.fit_transform(iris_feature)
df_tsne = pd.DataFrame({
    "Dim1":iris_tsne[:,0],
    "Dim2":iris_tsne[:,1],
    "Label": iris["species"]
})# 重建DataFrame
ax = sns.scatterplot(x="Dim1", y="Dim2", hue="Label",
                  data=df_tsne)# 绘图

输出:

奇异值分解SVD(singular value decomposition)

  • 主要想法:透过奇异值分解来找到不同的特徵值
from sklearn.decomposition import TruncatedSVD
svd = TruncatedSVD(n_components=2)
iris_svd = svd.fit_transform(iris_feature)
df_svd = pd.DataFrame({
    "Dim1":iris_svd[:,0],
    "Dim2":iris_svd[:,1],
    "Label": iris["species"]
})
ax = sns.scatterplot(x="Dim1", y="Dim2", hue="Label",
                  data=df_svd)

输出:

自组织映射SOM(Self-organizing map)

哦对了这个转换出来的会是离散的结果哦,稍微提醒一下

# 建立SOM
from minisom import MiniSom
som = MiniSom(x=20, y= 20, input_len= 4, random_seed=1)
som.train_batch(data=iris_feature.values.tolist(), num_iteration= 1000)

# 绘图
plt.figure(figsize=(15,15))
plt.xlim(0, 10)
plt.ylim(10, 20)
for index, row in iris.iterrows():
    x,y = som.winner(list(row[:-1]))
    if row.species == "setosa":
        plt.text(x,y,"A",fontdict={'weight': 'bold', 'size': 10},color = "C1")
#         plt.plot(x,y,color = "C1")
    elif row.species == "versicolor":
        plt.text(x,y,"B",fontdict={'weight': 'bold', 'size': 10},color = "C3")
#         plt.plot(x,y,color = "C3")
    elif row.species == "virginica":
        plt.text(x,y,"C",fontdict={'weight': 'bold', 'size': 10},color = "C4")


<<:  Day 24:Ansible 的一些设定

>>:  Day_26: 让 Vite 来开启你的Vue之 跌入深坑_ 我该用 reactive 还是 ref

[12] [烧瓶里的部落格] 02. 定义和使用资料库 - 使用 SQLite

什麽是 SQLite SQLite 是遵守ACID的关联式资料库管理系统,基於单一文件所组成且格式定...

Day 7 - Function

大家好,我是长风青云,今天是铁人赛第七天。 因为收假有点不开心,所以今天影片比较短,也算是补偿前面几...

Day 1 - 初探 stimulus

stimulus 这套框架主要在尽可能避免繁重的工作。为了能够让大量的介面互动维持在单纯的 请求-回...

【填坑系列01】IP位址计算 (IPv4 适用)

大二修企业资料通讯(BDC)时,对於IP位址的计算一窍不通,上网看教学影片、文章仍然无法学会,後来...

企划实现(2)

常常有人说创业需要勇气,但绝非这麽简单,创业不只需要勇气还需要运气、人脉、执着 人脉 相信不用说很多...