聚类&K-means算法

1.聚类

  • 啥是聚类?聚类简单来说就是大集体中抱团出现小团体。那专业术语怎么讲呢?聚类就是将相似的对象归到同一个簇中,使得同一个簇内的数据对象的相似性尽可能大,同时不在同一个簇中的数据对象的差异性也尽可能地大。即聚类后同一类的数据尽可能聚集到一起,不同数据尽量分离。
    在这里插入图片描述

在这里插入图片描述

如上述两幅图变化,散点->分类

  • 此处引入监督学习和无监督学习的概念:

    对于有标签的数据,我们进行有监督学习,常见的分类任务就是监督学习;

    而对于无标签的数据,我们希望发现无标签的数据中的潜在信息,这就是无监督学习。

2.K-means算法

  • K-means算法是最简单的聚类算法,又称K-均值算法。对于给定的样本集,按照样本之间的距离大小,将样本集划分为K个簇。让簇内的点尽量紧密的连在一起,而让簇间的距离尽量的大

  • K-Means 聚类的步骤如下:

    1.随机的选取K个中心点,代表K个类别;

    2.计算N个样本点和K个中心点之间的欧氏距离;

    3.将每个样本点划分到最近的(欧氏距离最小的)中心点类别中——迭代1;

    4.计算每个类别中样本点的均值,得到K个均值,将K个均值作为新的中心点——迭代2;

    5.重复步骤2、3、4;

    6.满足收敛条件后,得到收敛后的K个中心点(中心点不再变化)。

  • 注:欧式距离笔者上一篇博客有所介绍

2.1图解

在这里插入图片描述

  • 上图各点为散点,选定右侧两个中心点(K=2)

在这里插入图片描述

  • 按照距离各自抱团,分为红黑两类

在这里插入图片描述

  • 中心点换成每一类图像意义上的中心点(新的中心点离类别里样本的距离之和必须是最小的)

在这里插入图片描述

  • 因为C离黑色一簇的中心点更近,所以C“叛变”
  • 如此迭代,再次更换新的中心点,知道达到结束条件(更换中心点前后簇内单位没有改变)

3.代码实现

3.1生成随机点

import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets.samples_generator import make_blobs
X, y_true = make_blobs(n_samples=300, centers=4,
                       cluster_std=0.60, random_state=0)
plt.scatter(X[:, 0], X[:, 1], s=50)
plt.show()

3.2K-means聚类

from sklearn.cluster import KMeans
"""
    KMeans(n_clusters=8, init='k-means++', n_init=10, max_iter=300,
            tol=0.0001, precompute_distances='auto', verbose=0, 
            random_state=None, copy_x=True, n_jobs=1, algorithm='auto')
        Parameters:
             n_clusters: 聚类个数
             max_iter:  最大迭代数
             n_init:    用不同的质心初始化值运行算法的次数
             init:      初始化质心的方法
             precompute_distances:预计算距离
             tol:       关于收敛的参数
             n_jobs:    计算的进程数
             random_state: 随机种子
             copy_x:是否修改原始数据
             algorithm:“auto”, “full” or “elkan”
                         ”full”就是我们传统的K-Means算法, 
                         “elkan”elkan K-Means算法。默认的
                         ”auto”则会根据数据值是否是稀疏的,来决定如何选择”full”和“elkan”,稠密的选 “elkan”,否则就是”full”
        Attributes:
             cluster_centers_:质心坐标
             Labels_: 每个点的分类 
             inertia_:每个点到其簇的质心的距离之和。 
"""
m_kmeans = KMeans(n_clusters=4)
from sklearn import metrics
 
def draw(m_kmeans,X,y_pred,n_clusters):
    centers = m_kmeans.cluster_centers_
    print(centers)
    plt.scatter(X[:, 0], X[:, 1], c=y_pred, s=50, cmap='viridis')
    #中心点(质心)用红色标出
    plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.5)
    print("Calinski-Harabasz score:%lf"%metrics.calinski_harabasz_score(X, y_pred) )
    plt.title("K-Means (clusters = %d)"%n_clusters,fontsize=20)
    plt.show()
m_kmeans.fit(X)
KMeans(algorithm='auto', copy_x=True, init='k-means++', max_iter=300,
    n_clusters=4, n_init=10, n_jobs=None, precompute_distances='auto',
    random_state=None, tol=0.0001, verbose=0)
y_pred = m_kmeans.predict(X)
draw(m_kmeans,X,y_pred,4)

4.参考

https://cuijiahua.com/blog/2021/04/ml-14.html

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值