• Python实现聚类分析和数据降维


    目录

    KMeans聚类算法

    实战——KMeans聚类分析

    PCA降维原理

     实战_PCA对红酒数据降维并可视化

     实战_KPCA核主成分分析

     实战_t-SNE数据降维


    KMeans聚类算法

     KMeans算法介绍

            K-Means是聚类算法中最常用的一种,是一种迭代求解的聚类分析算法; 聚类是一种 无监督学习,事先并不知道分类标签是什么,它能够将具有相似特征的对象划分 到同一个集 合(簇)中。簇内的对象越相似,聚类算法的效果越好。

    KMeans算法原理

    • 1 从样本中随机选择K个点——聚类中心(也可以随机生成K个并不存在于原始 数据中的样 本点作为初始聚类中心)
    • 2 簇分配:遍历每个样本,然后根据每一个点是与红色聚类中心更近,还是与 蓝色聚类中心更近,来将每个数据点分配给K个聚类中心之一
    • 3 根据聚类结果,重新计算k个簇各自的平均值(Means)位置,将该平均值位 置作为该簇新的聚类中心
    • 4 不断重复迭代上述的(2)与(3)两个步骤,直到聚类中心点的变化很小, 或者达到指定的迭代次数

     KMeans损失函数

    •  KMeans损失函数是每个数据点与其所关联的聚类中心点之间的平均距离
    • 最小化损失函数可以帮助k-means找到更好的簇

    注意 : 对于聚类数量的选择(参数K的选择),没有一个统一的选择方法,可以根 据业务需要选择

    KMeans的衡量指标

    CH指标:同时考虑了各个簇之间的分离程度与簇内部的分离程度,来衡量聚类 效果。CH分数越高,说明聚类效果越好 

    实战——KMeans聚类分析

    sklearn中使用sklearn.cluster.KMeans实现KMeans算法

    KMeans聚类效果衡量指标使用sklearn.metrics.calinski_harabasz_score

    1. import numpy as np
    2. import matplotlib.pyplot as plt
    3. from sklearn.datasets import make_blobs
    4. # 生成数据样本
    5. X,y = make_blobs(n_samples=1000,n_features=2,
    6. centers=[[-1,-1],[0,0],[1,1],[2,2]],
    7. cluster_std=[0.4,0.2,0.2,0.2],random_state=666)
    8. plt.scatter(X[:,0],X[:,1])
    9. plt.show()

     先用KMeans聚成两类观察

    1. from sklearn.cluster import KMeans
    2. # 创建KMeans算法对象,设置聚成两类
    3. km = KMeans(n_clusters=2,random_state=666)
    4. km.fit(X) # 无监督学习,拟合的时候不需要样本标签
    5. y_predict = km.predict(X) # 预测
    6. plt.scatter(X[:,0],X[:,1],c=y_predict) # 预测为同一簇的样本同颜色
    7. plt.show()

    1. # 使用CH指标评价聚类效果(本题是在训练样本集上评价)
    2. from sklearn.metrics import calinski_harabasz_score
    3. calinski_harabasz_score(X,y_predict)

     

     KMeans聚成四类观察

    1. from sklearn.cluster import KMeans
    2. # 创建KMeans算法对象,设置聚成四类
    3. km2 = KMeans(n_clusters=4,random_state=666)
    4. km2.fit(X) # 无监督学习,拟合的时候不需要样本标签
    5. y_predict2 = km2.predict(X) # 预测
    6. plt.scatter(X[:,0],X[:,1],c=y_predict2) # 预测为同一簇的样本同颜色
    7. plt.show()

    1. # 使用CH指标评价聚类效果(本题是在训练样本集上评价)
    2. from sklearn.metrics import calinski_harabasz_score
    3. calinski_harabasz_score(X,y_predict2)

     显然聚成四类要比聚成两类效果好

    PCA降维原理

    PCA(Principal Component Analysis),主成分分析是线性 的数据降维技术,采用一 种数学降维的方法,在损失很少信息的前提下,找出几个综合变量 作为主成分,来代替原来 众多的变量,使这些主成分能够尽可能地代表原始数据的信息,其 中每个主成分都是原始变 量的线性组合,而且各个主成分之间不相关(即线性无关)。

    sklearn中使用PCA

    • 在sklearn中使用PCA降维要使用sklearn.decomposition.PCA
    • PCA对象的explained_variance_表示PCA的解释方差得分
    • 拟合使用fit方法,降维使用transform方法

     实战_PCA对红酒数据降维并可视化

    1. from sklearn.decomposition import PCA
    2. from sklearn.preprocessing import StandardScaler
    3. from sklearn import datasets
    4. wine_x,wine_y = datasets.load_wine(return_X_y=True) # 加载红酒数据
    5. wine_x = StandardScaler().fit_transform(wine_x) # 对酒的特征进行标准化
    6. import matplotlib.pyplot as plt
    7. # 使用PCA对酒数据集进行降维
    8. pca = PCA(n_components=13,random_state=123)
    9. pca.fit(wine_x)
    10. # 可视化PCA的解释方差得分
    11. exvar = pca.explained_variance_ # 获取PCA的解释方差得分
    12. plt.figure(figsize=(10,6))
    13. plt.plot(exvar,"r-o")
    14. plt.hlines(y=1,xmin=0,xmax=12) # 横线绘制
    15. plt.xlabel("the number of attribute")
    16. plt.ylabel("explained variance")
    17. plt.title("PCA")
    18. plt.show()

    可以发现,使用数据的前三个主成分较合适

    1. pca_wine_x = pca.transform(wine_x)[:,:3] # 降维操作
    2. pca_wine_x.shape
    3. colors = ["red","blue","green"]
    4. shapes = ["o","s","*"]
    5. fig = plt.figure(figsize=(10,6))
    6. # 将坐标系设置为3D坐标系
    7. ax1 = fig.add_subplot(111,projection="3d")
    8. for ii,y in enumerate(wine_y):
    9. ax1.scatter(pca_wine_x[ii,0],pca_wine_x[ii,1],pca_wine_x[ii,2],
    10. s=40,c=colors[y],marker=shapes[y])
    11. ax1.set_xlabel("Principal Component 1",rotation=20)
    12. ax1.set_ylabel("Principal Component 2",rotation=-20)
    13. ax1.set_zlabel("Principal Component 3",rotation=90)
    14. ax1.azim = 225
    15. ax1.set_title("PCA ")
    16. plt.show()

     实战_KPCA核主成分分析

     KPCA降维原理

            核主成分分析(Kernel Principal Component Analysis)对于 输入空间中的矩阵X,先 用一个非线性映射把X中的所有样本映射到一个高维甚至是无穷维的 空间(特征空间),使 其线性可分,然后在这个高维空间进行PCA降维。

    sklearn中使用KPCA

    • 在sklearn中使用PCA降维要使用 sklearn.decomposition.KernelPCA
    • KernelPCA对象的lambdas_表示KPCA的中心核矩阵特征值
    • 拟合使用fit方法,降维使用transform方法
    1. from sklearn.decomposition import KernelPCA
    2. from sklearn.preprocessing import StandardScaler
    3. from sklearn import datasets
    4. # 解决中文乱码和负号显示的设置
    5. import matplotlib as mpl
    6. mpl.rcParams['font.sans-serif'] = ['SimHei']
    7. mpl.rcParams['font.serif'] = ['SimHei']
    8. mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题,或者转换负号为字符串
    9. wine_x,wine_y = datasets.load_wine(return_X_y=True) # 加载红酒数据
    10. wine_x = StandardScaler().fit_transform(wine_x) # 对酒的特征进行标准化
    11. import matplotlib.pyplot as plt
    12. # 使用KPCA获取数据的主成分
    13. # 核函数使用rbf核
    14. kpca = KernelPCA(n_components=13,kernel="rbf",gamma=0.2,random_state=123)
    15. kpca.fit(wine_x)
    16. # 可视化KPCA的中心矩阵特征值
    17. lambdas = kpca.lambdas_
    18. plt.figure(figsize=(10,6))
    19. plt.plot(lambdas,"r-o")
    20. plt.hlines(y=4,xmin=0,xmax=12)
    21. plt.xlabel("特征数量")
    22. plt.ylabel("中心核矩阵的特征值大小")
    23. plt.title("核主成分分析")
    24. plt.show()

    1. # 获取前3个核主成分
    2. kpca_wine_x = kpca.transform(wine_x)[:,:3] # 降维操作
    3. kpca_wine_x.shape
    4. # 在3D空间中可视化KPCA分析后的数据空间分布
    5. colors = ["red","blue","green"]
    6. shapes = ["o","s","*"]
    7. fig = plt.figure(figsize=(10,6))
    8. # 将坐标系设置为3D坐标系
    9. ax1 = fig.add_subplot(111,projection="3d")
    10. for ii,y in enumerate(wine_y):
    11. ax1.scatter(kpca_wine_x[ii,0],kpca_wine_x[ii,1],kpca_wine_x[ii,2],
    12. s=40,c=colors[y],marker=shapes[y])
    13. ax1.set_xlabel("核主成分1",rotation=20)
    14. ax1.set_ylabel("核主成分2",rotation=-20)
    15. ax1.set_zlabel("核主成分3",rotation=90)
    16. ax1.azim = 225
    17. ax1.set_title("KPCA特征空间可视化")
    18. plt.show()

     

     实战_t-SNE数据降维

    t-SNE降维原理

            TSNE是另一种常用的数据降维方法。由T和SNE组成,也就是T 分布和随机近邻嵌入 (Stochastic neighbour Embedding)。其主要优势在于高维数据 空间中距离相近的点投 影到低维空间中仍然相近。 t-SNE(TSNE)将数据点之间的相似度转换为概率。原始空间中的 相似度由高斯联合概率 表示,嵌入空间的相似度由“学生t分布”表示。

            简单解释t-SNE的降维原理:想要将二维数据点映射到一维,并 且还要保存原来二维空间 中的聚类情况。

     

     

     sklearn中使用t-SNE

    1. from sklearn.decomposition import PCA
    2. from sklearn.manifold import TSNE
    3. from sklearn.preprocessing import StandardScaler
    4. from sklearn import datasets
    5. # 解决中文乱码和负号显示的设置
    6. import matplotlib as mpl
    7. mpl.rcParams['font.sans-serif'] = ['SimHei']
    8. mpl.rcParams['font.serif'] = ['SimHei']
    9. mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题,或者转换负号为字符串
    10. wine_x,wine_y = datasets.load_wine(return_X_y=True) # 加载红酒数据
    11. wine_x = StandardScaler().fit_transform(wine_x) # 对酒的特征进行标准化
    12. # 创建TSNE对象,设置低维空间的维度(保留的特征数)
    13. tsne = TSNE(n_components=3,perplexity=25,early_exaggeration=3,
    14. random_state=123)
    15. tsne_wine_x = tsne.fit_transform(wine_x) # 拟合并转换(降维)
    16. import matplotlib.pyplot as plt
    17. colors = ["red","blue","green"]
    18. shapes = ["o","s","*"]
    19. fig = plt.figure(figsize=(10,6))
    20. # 将坐标系设置为3D坐标系
    21. ax1 = fig.add_subplot(111,projection="3d")
    22. for ii,y in enumerate(wine_y):
    23. ax1.scatter(tsne_wine_x[ii,0],tsne_wine_x[ii,1],tsne_wine_x[ii,2],
    24. s=40,c=colors[y],marker=shapes[y])
    25. ax1.set_xlabel("特征1",rotation=20)
    26. ax1.set_ylabel("特征2",rotation=-20)
    27. ax1.set_zlabel("特征3",rotation=90)
    28. ax1.azim = 225
    29. ax1.set_title("TSNE降维并可视化")
    30. plt.show()

  • 相关阅读:
    短剧出海火爆,Flat Ads独家流量助泛娱乐赛道App迅速获客增长
    修改jquery-validation让你的验证提示更漂亮
    SSH安全外壳协议
    pyinstaller打包技巧
    【包管理软件】彻底了解 npm、cnpm、yarn、pnpm 几种包管理器
    C#使用WebSocket与网页实时通信
    node(coderwhy)
    C++PrimerPlus 第六章 分支语句和逻辑运算符 - 6.8 简单文件输入/输出
    前端编程应该了解的数据结构——树
    大厂裁员潮下,测试人员路在何方?
  • 原文地址:https://blog.csdn.net/m0_64336780/article/details/127095285