zoukankan      html  css  js  c++  java
  • 聚类K-means算法

    聚类K-means算法

      问题:给你一张这样的图,也没给其他信息,让你去给他们分类?怎么分类

       那么,我们可能会以帽子头发等为特征对他们进行分类,物以类聚,人以群分


    聚类的原理:

      1. 随机在数据当中抽取三个样本,当做三个类别的中心点(k1,k2,k3). ##图一,颜色实心标记##
      2. 计算其余的点分别到这三个中心点的距离,这样每一个点(样本)就有3个距离(a,b,c),从中选出距离最近的一个中心点作为自己的标记形成三个族群.
      3. 分别计算这三个族群的平均值,把三个平均值与三个旧的中心点进行比较.
           - 如果相同:结束聚类.
           - 如果不同:把这个平均值当做新的中心点,重复第二步第三步直到结束聚类.

    K-means步骤:

    1. 随机设置k个特征空间内的点作为初始的聚类中心
    2. 对于其他每个点计算到k个中心的距离,未知的点选择最近的一个聚类中心点作为标记类别
    3. 接着对标记聚类中心之后,计算每个聚类的新中心点(平均值)
    4. 如果计算得出的新中心点与原中心点一样,那么聚类结束,否则重新进行第二步骤
    

    K-means→API:

    sklearn.cluster.KMeans(n_clusters=8,init='k-means++')
        k-means聚类
        n_clusters:开始的聚类中心数量
        init:初始化方法,默认为'k-means++'
        labels_:默认标记的类型,可以和真实值比较(不是值比较)

    聚类有什么作用?

      聚类一般用在分类算法之前,然后进行预测.

    聚类流程:

    • 降维之后的数据
    • k-means聚类
    • 聚类结果显示

    案例演示:

    # 导入案例数据
    import
    pandas as pd from sklearn.decomposition import PCA # 读取四张表的数据 prior = pd.read_csv(r'C:UsersluoweDesktopweek9week9instacartorder_products__prior.csv') product = pd.read_csv(r'C:UsersluoweDesktopweek9week9instacartproducts.csv') orders = pd.read_csv(r'C:UsersluoweDesktopweek9week9instacartorders.csv') aisles = pd.read_csv(r'C:UsersluoweDesktopweek9week9instacartaisles.csv') # 合并四张表到一张表,(用户-物品类别) data = pd.merge(prior, product, on='product_id') data = pd.merge(data, orders, on='order_id' ) data = pd.merge(data, aisles, on='aisle_id') # 建立一个以用户为行,产品为列的表 # 即用户和产品进行交叉 table = pd.crosstab(data['user_id'], data['aisle']) # 数据结构为(206209, 134),需要做主成分分析,进行降维 pca = PCA(n_components=0.9) # 保留90%的数据 res = pca.fit_transform(table) #之前的数据降维学习的数据

    # 数据量大,把数据减
    x = res[:500]
    
    # 假设用户一共分为4个类别
    from sklearn.cluster import KMeans
    km = KMeans(n_clusters=4)
    km.fit(x)
    
    # 聚类 ,分类加上标记
    predict = km.predict(x)少

    输出结果:

     500个结果,把这四个类别画出来:

    import matplotlib.pyplot as plt
    plt.figure(figsize=(10,10))
    
    # 建立四个颜色
    colored = ['green','red','yellow','blue']
    color=[colored[i] for i in predict]
    plt.scatter(x[:, 1],x[:, 11],color=color)  # 散点图,x第1列,y第11列
    plt.xlabel('1')
    plt.ylabel('2') 
    plt.show()  #因为只取了2个维度,所以看上去...


    聚类的评估标准:

      聚类效果的好坏

     # 外部聚类最大化,内部距离最小化 #


     ## 轮廓系数,计算聚类效果的好坏 ##

    考虑极端情况:

    完美聚类 bi>>ai : sci=1
    最差聚类 bi<<ai : sci = -1 轮廓系数[-1,1] 一般轮廓系数大于0.1就是非常好的效果
    

      

    聚类评估API:

    sklearn.metrics.silhouette_score(x,labels)
        计算所有样本的平均轮廓系数
        x:特征值
        labels:被聚类标记的目标值
    ## 评判聚类效果,轮廓系数
    from sklearn.metrics import silhouette_score
    
    silhouette_score(x,predict)  
    # 通过不停的调优,网格搜索,交叉验证可以得到最好的聚类效果

    输出:


    K-means总结:

    特点
        采用迭代, 直观易懂, 并且实用
    
    缺点
        容易收敛到局部最优解.(多次聚类)....#类 里面有局部聚类#
    
    注意 : 聚类一般做在分类之前
  • 相关阅读:
    组合,封装与多态
    继承与派生
    面向对象基础练习
    面向对象基础
    类与对象
    数组与pandas模块
    Flask基础(15)-->模板代码的复用【宏(Macro)、继承(Block)、包含(include)】
    Flask基础(14)-->自定义过滤器
    Flask基础(13)-->Flask扩展Flask-Script
    Flask基础(12)-->请求上下文和应用上下文
  • 原文地址:https://www.cnblogs.com/luowei93/p/11964738.html
Copyright © 2011-2022 走看看