Task05:聚类

理论部分

  • 相关概念
    • 无监督学习
    • 聚类的定义
  • 常用距离公式
    • 曼哈顿距离
    • 欧式距离
    • 闵可夫斯基距离
    • 切比雪夫距离
    • 夹角余弦
    • 汉明距离
    • 杰卡德相似系数
    • 杰卡德距离
  • K-Means聚类:聚类过程和原理、算法流程、算法优化(k-means++、Mini Batch K-Means)
  • 层次聚类:Agglomerative Clustering过程和原理
  • 密度聚类:DBSCAN过程和原理
  • 谱聚类:谱聚类原理(邻接矩阵、度矩阵、拉普拉斯矩阵、RatioCut、Ncut)和过程
  • 高斯混合聚类:GMM过程和原理、EM算法原理、利用EM算法估计高斯混合聚类参数
  • sklearn参数详解

实战部分

利用sklearn解决聚类问题。

  • sklearn.cluster.KMeans
# 通过简单的例子来直接查看K均值聚类的效果
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import numpy as np



# 聚类前
X = np.random.rand(100, 2)
plt.scatter(X[:, 0], X[:, 1], marker='o')

#聚类后
kmeans = KMeans(n_clusters=2).fit(X)
label_pred = kmeans.labels_
plt.scatter(X[:, 0], X[:, 1], c=label_pred)
plt.show()


def distEclud(vecA, vecB):
    '''
    欧氏距离计算函数
    :param vecA:
    :param vecB:

    :return: float
    '''
    dist = 0.0
    # ========= show me your code ==================
    dist = np.sqrt(np.sum(np.power(vecA - vecB, 2)))

    # ========= show me your code ==================
    return dist


def randCent(dataMat, k):
    '''
    为给定数据集构建一个包含K个随机质心的集合,
    随机质心必须要在整个数据集的边界之内,这可以通过找到数据集每一维的最小和最大值来完成
    然后生成0到1.0之间的随机数并通过取值范围和最小值,以便确保随机点在数据的边界之内
    :param np.dataMat:
    :param k:

    :return: np.dataMat
    '''
    # 获取样本数与特征值
    m, n = np.shape(dataMat)
    # 初始化质心,创建(k,n)个以零填充的矩阵
    centroids = np.mat(np.zeros((k, n)))
    print(centroids)

    # ========= show me your code ==================
    # 循环遍历特征值
    for j in range(n):
        # 计算每一列的最小值
        minJ = np.min(dataMat[:, j])
        # 计算每一列的范围值
        rangeJ = float(np.max(dataMat[:, j]) - minJ)
        # 计算每一列的质心,并将值赋给centroids
        centroids[:, j] = np.mat(minJ + rangeJ * np.random.rand(k, 1))
    # ========= show me your code ==================

    # 返回质心
    return centroids.A


def kMeans(dataMat, k, distMeas=distEclud):
    '''
    创建K个质心,然后将每个店分配到最近的质心,再重新计算质心。
    这个过程重复数次,直到数据点的簇分配结果不再改变为止
    :param dataMat: 数据集
    :param k: 簇的数目
    :param distMeans: 计算距离
    :return:
    '''
    # 获取样本数和特征数
    m, n = np.shape(dataMat)
    # 初始化一个矩阵来存储每个点的簇分配结果
    # clusterAssment包含两个列:一列记录簇索引值,第二列存储误差(误差是指当前点到簇质心的距离,后面会使用该误差来评价聚类的效果)
    clusterAssment = np.mat(np.zeros((m, 2)))
    # 创建质心,随机K个质心
    centroids = randCent(dataMat, k)

    # 初始化标志变量,用于判断迭代是否继续,如果True,则继续迭代
    clusterChanged = True
    while clusterChanged:
        clusterChanged = False
        # 遍历所有数据找到距离每个点最近的质心,
        # 可以通过对每个点遍历所有质心并计算点到每个质心的距离来完成
        for i in range(m):
            minDist = float("inf")
            minIndex = -1
            for j in range(k):
                # 计算数据点到质心的距离
                # 计算距离是使用distMeas参数给出的距离公式,默认距离函数是distEclud
                distJI = distMeas(centroids[j, :], dataMat[i, :])
                # 如果距离比minDist(最小距离)还小,更新minDist(最小距离)和最小质心的index(索引)
                if distJI < minDist:
                    minDist = distJI
                    minIndex = j

            # 如果任一点的簇分配结果发生改变,则更新clusterChanged标志
            # ========= show me your code ==================
            if clusterAssment[i, 0] != minIndex:
                clusterChanged = True
            # ========= show me your code ==================

            # 更新簇分配结果为最小质心的index(索引),minDist(最小距离)的平方
            clusterAssment[i, :] = minIndex, minDist ** 2
        # print(centroids)

        # 遍历所有质心并更新它们的取值
        # ========= show me your code ==================
        for cent in range(k):
            # 通过数据过滤来获得给定簇的所有点
            ptsInClust = dataMat[np.nonzero(clusterAssment[:, 0].A == cent)[0]]
            # 计算所有点的均值,axis=0表示沿矩阵的列方向进行均值计算
            centroids[cent, :] = np.mean(ptsInClust, axis=0)
        # ========= show me your code ==================

    # 返回所有的类质心与点分配结果
    return centroids, clusterAssment

# 运行Kmeans,假设有两聚类中心
center,label_pred = kMeans(X, k=2)

# 将标签转化成易绘图的形式
label = label_pred[:, 0].A.reshape(-1)

# 将结果可视化
plt.scatter(X[:, 0], X[:, 1], c=label)
plt.scatter(center[0, 0], center[0, 1], marker="*", s = 100)
plt.scatter(center[1, 0], center[1, 1], marker="*", s = 100)
plt.show()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
sc-learn是一个机器学习库,它提供了各种聚类算法的实现。聚类算法是一种无监督学习方法,用于将数据分组为具有相似特征的集群。在scikit-learn中,聚类算法的实现可以使用KMeans类。KMeans类使用k-means算法来对数据进行聚类。 要使用scikit-learn的聚类算法,你需要导入一些需要的库,比如numpy、matplotlib和sklearn.cluster中的KMeans类。然后,你可以使用KMeans类的fit方法来对数据进行聚类。你可以指定要分成的集群数量,并可以选择性地设置随机种子。 聚类的好坏可以通过Calinski-Harabaz指数来评估。这个指数通过测量类别内部数据的协方差和类别之间的协方差来判断聚类的质量。在scikit-learn中,你可以使用metrics.calinski_harabaz_score来计算Calinski-Harabaz指数。你需要提供数据和对应的标签作为参数。 综上所述,scikit-learn提供了方便的工具来进行聚类分析,你可以根据需要选择适合的聚类算法,使用KMeans类进行聚类,并使用Calinski-Harabaz指数来评估聚类的质量。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [sklearn实战之聚类算法](https://blog.csdn.net/qq_48314528/article/details/119904631)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [sklearn聚类方法详解](https://blog.csdn.net/ustbbsy/article/details/80960652)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

R_TRIG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值