• 3. sklearn的K-Means的使用


    1. K-Means原理解析

    2. K-Means的优化

    3. sklearn的K-Means的使用

    4. K-Means和K-Means++实现

    1. 前言

    在机器学习中有几个重要的python学习包。

    1. sklearn:sklearn里面包含了各种机器学习的算法结构
    2. numpy:numpy里面主要是矩阵的运算和数据的处理的内容,和sklearn搭配使用。
    3. matplotlib:matplotlib库是用来绘图的。

    2. K-Means参数

    • n_clusters : 聚类的个数k,default:8.
    • init : 初始化的方式,default:k-means++
    • n_init : 运行k-means的次数,最后取效果最好的一次, 默认值: 10
    • max_iter : 最大迭代次数, default: 300
    • tol : 收敛的阈值, default: 1e-4
    • n_jobs : 多线程运算, default=None,None代表一个线程,-1代表启用计算机的全部线程。
    • algorithm : 有“auto”, “full” or “elkan”三种选择。"full"就是我们传统的K-Means算法, “elkan”是我们讲的elkan K-Means算法。默认的"auto"则会根据数据值是否是稀疏的,来决定如何选择"full"和“elkan”。一般数据是稠密的,那么就是“elkan”,否则就是"full"。一般来说建议直接用默认的"auto"。

    3. K-Means使用(1)

    from sklearn.cluster import KMeans
    import numpy as np
    X = np.array([[1, 2], [1, 4], [1, 0],[4, 2], [4, 4], [4, 0]])
    kmeans = KMeans(n_clusters=2, random_state=0).fit(X)
    kmeans.labels_ #输出原始数据的聚类后的标签值
    >>> array([0, 0, 0, 1, 1, 1], dtype=int32)
    kmeans.predict([[0, 0], [4, 4]]) #根据已经建模好的数据,对新的数据进行预测
    >>> array([0, 1], dtype=int32)
    kmeans.cluster_centers_ #输出两个质心的位置。
    >>> array([[1., 2.],[4., 2.]])
    

    KMeans在sklearn.cluster的包里面,在sklearn里面都是使用fit函数进行聚类。顺便提一句,在sklearn中基本所有的模型的建模的函数都是fit,预测的函数都是predict。

    4. K-Means使用(2)

    这个例子有会生成4幅图。

    image

    1. 对数据用k=8去聚类。因为数据本身只有3类,所以聚类效果不好。
    2. 对数据用k=3去聚类,效果不错。
    3. 还是用k=3去聚类,但是改变初始化方式init=random,n_init=1,这样的随机初始化,最后的效果会不好。
    4. 最后一张图是数据本身的label,和第二幅相差不大。

    具体代码如下:

    import numpy as np
    import matplotlib.pyplot as plt
    from mpl_toolkits.mplot3d import Axes3D #3D的库
    
    from sklearn.cluster import KMeans
    from sklearn import datasets
    
    np.random.seed(5) #设置随机数种子
    
    iris = datasets.load_iris()
    X = iris.data
    y = iris.target
    
    estimators = [('k_means_iris_8', KMeans(n_clusters=8)),#k=8的kmeans
                  ('k_means_iris_3', KMeans(n_clusters=3)), #k=3的kmeans
                  ('k_means_iris_bad_init', KMeans(n_clusters=3, n_init=1,init='random')) #k=3,随机初始化的kmeans
                  ]
    
    fignum = 1
    titles = ['8 clusters', '3 clusters', '3 clusters, bad initialization']
    for name, est in estimators:
        fig = plt.figure(fignum, figsize=(4, 3))
        ax = Axes3D(fig, rect=[0, 0, .95, 1], elev=48, azim=134)
        est.fit(X) #fit建立模型
        labels = est.labels_ #获得模型聚类后的label
    
        ax.scatter(X[:, 3], X[:, 0], X[:, 2],
                   c=labels.astype(np.float), edgecolor='k') #绘制X中的第3,0,2个维度的特征
    
        ax.w_xaxis.set_ticklabels([])
        ax.w_yaxis.set_ticklabels([])
        ax.w_zaxis.set_ticklabels([])
        ax.set_xlabel('Petal width') #设置坐标轴名
        ax.set_ylabel('Sepal length')
        ax.set_zlabel('Petal length')
        ax.set_title(titles[fignum - 1]) #设置图的名字
        ax.dist = 12
        fignum = fignum + 1
    
    # 绘制数据真实标签
    fig = plt.figure(fignum, figsize=(4, 3))
    ax = Axes3D(fig, rect=[0, 0, .95, 1], elev=48, azim=134)
    
    for name, label in [('Setosa', 0),
                        ('Versicolour', 1),
                        ('Virginica', 2)]:
        ax.text3D(X[y == label, 3].mean(), #寻找特征的均值点
                  X[y == label, 0].mean(),
                  X[y == label, 2].mean() + 2, name,
                  horizontalalignment='center',
                  bbox=dict(alpha=.2, edgecolor='w', facecolor='w'))
    
    y = np.choose(y, [1, 2, 0]).astype(np.float)
    ax.scatter(X[:, 3], X[:, 0], X[:, 2], c=y, edgecolor='k')
    
    ax.w_xaxis.set_ticklabels([])
    ax.w_yaxis.set_ticklabels([])
    ax.w_zaxis.set_ticklabels([])
    ax.set_xlabel('Petal width')
    ax.set_ylabel('Sepal length')
    ax.set_zlabel('Petal length')
    ax.set_title('Ground Truth')
    ax.dist = 12
    
    fig.show() #绘制整张图
    
  • 相关阅读:
    大型网站技术架构读书笔记目录
    读书笔记1: 大型网站架构演化
    关于HTML5中的canvas标签的个个人理解
    javascript的部分功能实现
    简易计算机的做法
    关于C语言的学习和理解
    体验LESS CSS 框架
    在学习ps中的问题和理解。
    关于做登录页面
    css实现动画功能
  • 原文地址:https://www.cnblogs.com/huangyc/p/10229064.html
Copyright © 2020-2023  润新知