k均值聚类算法优缺点_sklearn-learn机器学习 聚类算法:k-均值算法 0117-2020

目录
k-均值算法简述及应用场景
k-均值算法步骤
k-均值算法数学描述
scikit-learn 里的 k-均值算法
  • k-均值算法简述及应用场景

k-均值算法是无监督算法,只给出一组无标记的数据集

,目标是找出这组数据的模式特征,如哪些数据是同一种类型的,哪些数据是另外一种类型

典型的无监督式学习包括市场细分,即通过分析用户数据,把一个产 品的市场进行细分,找出细分人群。另外一个是社交网络分析,分析社交网络中参与人 员的不同特点 , 根据特点区分出不同群体。这些都是无监督式学习里的聚类问题

  • k-均值算法步骤

k-均值算法算法包含以下两个步骤:

(1)给聚类中心分配点。 计算所有的训练样例,把每个训练样例分配到距离其最近的聚类中心所在的类别里

(2)移动聚类中心。新的聚类中心移动到这个聚类所有的点的平均值处。 一直重复做上面的动作,直到聚类中心不再移动为止,这时就探索出了数据集的结构了

  • k-均值算法数学描述

使用数学方法来描述 k-均值算法:算法有两个输入信息, 一是 k, 表示选取的聚类个数; 另一个是训练、数据集

(1)随机选择 k 个聚类中心,

(2)从 1~m 中遍历所有的数据集,计算

分别到
的距离,记录距离最短的聚类中心点
,然后把
这个点分配给这个聚类。 令
。计算距离时, 一般使用
来计算。

(3)从 1 ~ k 中遍历所有的聚类中心,计算每个簇的均值,作为新的聚类中心, 即:

其中 ,c表示分配给这个聚类的训练样例点的个数,

表示属于
类别的点

(4)重复步骤(2),直到聚类中心不再移动为止

  • scikit-learn 里的k-均值算法
from 

9fc9c253afc55ffe7aaeb02c7d5ad75b.png

7c6bf44dcf957a7fcbcea2a7123bb9c7.png

KMeans.score()函数计算 k-均值算法拟合后的成本,用负数表示,其绝对值越大,说明成本越高

把分类后的样本及其所属的聚类中心都画出来,这样可以更直观地 观察算法的拟合结果:

labels = kmean.labels_
centers = kmean.cluster_centers_
markers = ['o','^','*']
colors = ['r','b','y']
plt.figure(figsize=(6,4),dpi=144)
plt.xticks(())
plt.yticks(())

for c in range(n_clusters):
    cluster = X[labels==c]
    plt.scatter(cluster[:,0],cluster[:,1],
                marker = markers[c],s=20,
                c=colors[c])
    
plt.scatter(centers[:,0],centers[:,1],
            marker='o',c='white',alpha=0.9,
            s=300)

for i,c in enumerate(centers):
    plt.scatter(c[0],c[1],marker='$%d$'%i,s=50,c=colors[i])
    
plt.show()

42a7fde86fc202bab016a254af80de4a.png

分别选择 k = 2, 3, 4 这 3 种不同的聚类个数,来观察一下 k均值算法最终拟合的结果及其成本值

def fit_plot_kmean_model(n_clusters,X):
    plt.xticks(())
    plt.yticks(())
    
    kmean = KMeans(n_clusters=n_clusters)
    kmean.fit_predict(X)
    
    labels = kmean.labels_
    centers = kmean.cluster_centers_
    markers = ['o','^','*','s']
    colors = ['r','b','y','k']
    score = kmean.score(X)
    plt.title("k={},score={}".format(n_clusters,(int)(score)))
    
    for c in range(n_clusters):
        cluster = X[labels==c]
        plt.scatter(cluster[:,0],cluster[:,1],
                    marker=markers[c],s=20,
                    c=colors[c])
   
    plt.scatter(centers[:,0],centers[:,1],
                marker='o',c="white",alpha=0.9,
                s=300)
    
    for i,c in enumerate(centers):
        plt.scatter(c[0],c[1],marker='$%d$'%i,s=50,c=colors[i])

        
from sklearn.cluster import KMeans
n_clusters=[2,3,4]
plt.figure(figsize=(10,3),dpi=144)
for i,c in enumerate(n_clusters):
    plt.subplot(1,3,i+1)
    fit_plot_kmean_model(c,X)
    
plt.show()  

08077971e0abc6153ec83425ffcd7011.png


函数接受两个参数, 一 个是聚类个数,即 k 的值,另一个是数据样本。 有了这个函数,接下来的代码就简单了, 可以很容易地分别对[2, 3, 4] 3 种不同的 k 值情况进行聚类分析,并把聚类结果可视化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值