kmeans聚类方法

from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=5,n_init = 'auto',init='k-means++',random_state=42)
kmeans聚类方法是以 k 个点为中心的有监督聚类方法。 

 kmeans原理

         实现方法是:首先以随机的K个点为质心(即聚类的中心),然后计算每个点到质心的距离,以确定每个点该属于的类别;然后轮换质心,再重复上述操作对每个点归类,每次都能计算出一个距离平方和;以此方法经过有限次质心轮换,子厚趋于稳定,达到最小的距离平方和,以此作为分类的结果。

优点是原理简单,分类效果好。
缺点是初始的中心点选择不太好时,经过有限次质心测算,到达的最终聚类效果也不理想。如下图:

因此使用此方法设定随机数作为初始质心,质心之间尽量分散

K值 确定:肘方法

         还有一个关键问题是选取多少分类个数合适呢?如果输入都是xy散点,我们可以绘图大概看出分类个数,当没有图形的时候,我们可以用“肘方法”——依次计算出以1到n个点为质心时平方差之和(簇中心距离平方和),分类越多说明分得越细,那么平方差的和是依次递减的,最小值是0(也就是以n个点为中心,即没有分类,每个点到自己的距离都为0,簇中心距离平方和即为0)

我们追求的是簇中心距离平方和最小,同时也要有分类效果,(例如当簇中心距离平方和为0时,达到了最小,同时也表明没有分类),所以综合两个因素,我们以簇中心距离平方和迅速下降出现拐点时的个数作为分类个数。作图出来像人的手臂,拐点是肘,所以称为“肘方法”。

如图所示:下图中拐点时的分类个数是3

 案例

数据预览:200条顾客数据,以最后两列(收入和消费指数)划分顾客群体

 

用肘方法确定分类个数:

# 肘方法确定聚类个数
    wcss = []
    for i in range(2,11):
        kmeans = KMeans(n_clusters=i,n_init = 'auto',init='k-means++',random_state=42) #随机数种子
        kmeans.fit(x)
        ws = kmeans.inertia_  #簇内误差平方和
        wcss.append(ws)
    plt.plot(range(2,11),wcss)
    plt.show()

从图中可以看出横坐标为5时拐点显著,因此以5为分类个数

kmeans方法的代码实现 :

import pandas as pd
import sklearn.cluster as KMeans
def kmeans_exam1():
    dataset = pd.read_csv(r'D:\数据\customers.csv')
    x = dataset.iloc[:,[3,4]].values
    # 使用kmeans方法分类    
    kmeans = KMeans(n_clusters=5,n_init = 'auto',init='k-means++',random_state=42) #随机数种子
    group_tag = kmeans.fit_predict(x)
    # 将分类标签添加到dataframe中
    dataset['group_tag'] = group_tag
    # 查看分组后各组年龄特征
    print(dataset.groupby('group_tag')['Age'].describe())
    # 绘图查看分类效果
    plt.scatter(x[group_tag==0,0],x[group_tag==0,1],c='red',s=100,label = 'Standard')
    plt.scatter(x[group_tag==1,0],x[group_tag==1,1],c='blue',s=100,label = 'Target赚得多花的多')
    plt.scatter(x[group_tag==2,0],x[group_tag==2,1],c='yellow',s=100,label = 'Youth赚得少花的多')
    plt.scatter(x[group_tag==3,0],x[group_tag==3,1],c='green',s=100,label = 'traditional Old赚得多花的少')
    plt.scatter(x[group_tag==4,0],x[group_tag==4,1],c='brown',s=100,label = 'normal赚得少花的少')
    # 聚类中心点坐标
    plt.scatter(kmeans.cluster_centers_[:,0],kmeans.cluster_centers_[:,1],c = 'black')
    plt.legend()
    plt.show()
    

if __name__ == '__main__':
    kmeans_exam1()

 分类效果图

缺点2

数据量过大时耗时久。复杂度是:O(n * k * t),其中n是样本量、 k是划分的聚类数、t是迭代次数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值