人工智能入门 | K-means聚类算法的应用案例实战(含代码+图示)

前言: Hello大家好,我是小哥谈。 K-means算法是很典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。该算法认为簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标。🌈

     目录

🚀1.k-means算法优缺点

🚀2.算法思想

🚀3.解决的问题

🚀4.k-means原理介绍

🚀5.k-means算法实战

🚀1.k-means算法优缺点

优点:容易实现

缺点:可能收敛到局部最小值,在大规模数据集上收敛较慢.

使用数据类型: 数值型数据

🚀2.算法思想

k-means算法 实际上就是通过计算不同样本间的距离来判断他们的相 近关系的,相近的就会放到同一个类别中去。📚

🚀3.解决的问题

k-means算法属于无监督学习的一种聚类算法,其目的为:在不知数据所属类别及类别数量的前提下,依据数据自身所暗含的特点对数据 进行聚类。对于聚类过程中类别数量 k 的选取,需要一定的先验知识, 也可根据“类内间距小,类间间距大“(一种聚类算法的理想情况) 为目标进行实现。🍃


🚀4.k-means原理介绍

k-means算法以数据间的距离作为数据对象相似性度量的标准,因此选择计算数据间距离的计算方式对最后的聚类效果有显著的影响,常用计算距离的方式有:余弦距离欧式距离曼哈顿距离等。🌻


🚀5.k-means算法实战

实现效果如下:

代码(每一步都已经清楚的进行了说明):
from numpy import *
import pandas as pd
import matplotlib.pyplot as plt
#距离度量函数
def calc_distance(vec1,vec2):
    return sqrt(sum(power(vec1-vec2,2)))

#创建初始聚类中心
def creat_centroid(data,k):
    centroids = zeros((k,n))
    centroids[0,0] = 2
    centroids[0,1] = 10
    centroids[1, 0] = 5
    centroids[1, 1] = 8
    centroids[2, 0] = 1
    centroids[2, 1] = 2
    return  centroids

# k-means聚类
def kMeans(data,k,dist=calc_distance,creat_center =  creat_centroid):
    # 初始化cluster_assment,存储中间结果
    #第一列存储索引,第二列存储距离
    # 样本的个数
    m = shape(data)[0]
    init = zeros((m,2))
    cluster_assment = mat(init)

    # 初始化聚类中心矩阵
    centroids = creat_centroid(data,k)

    for epoch in range(1):
        # 对数据集合中每个样本点进行计算
        for i in range(m):
            min_dist = inf
            min_index = -1
            # 对每个样本点到每个中心的距离进行计算
            for j in range(k):
                dist_ij = calc_distance(centroids[j, :],data[i, :])
                # 找到距离最近的中心的距离和索引
                if dist_ij < min_dist:
                    min_dist =  dist_ij
                    min_index = j
                    cluster_assment[i,:] = min_index,min_dist
        # 对所有节点聚类之后,重新更新中心
        for i in range(k):
            # .A把矩阵转成数组
            pts_in_cluster = data[nonzero(cluster_assment[:,0].A == i)[0]]
            centroids[i,:] = mean(pts_in_cluster,axis=0)
    return centroids,cluster_assment


if __name__ == '__main__':
    # 创建数据集
    data = array([[2,10],[2,5],[8,4],[5,8],
                  [7,5] ,[6,4],[1,2],[4,9]])
    k = 3 # k为聚类个数
    n = 2 # n为特征个数
    centroids,cluster_assment = kMeans(data,k,dist = calc_distance,creat_center=creat_centroid)
    predict_label = cluster_assment[:,0]
    data_and_pred = column_stack((data,predict_label))

    # df是原样数据样本和预测出来的类别
    df = pd.DataFrame(data_and_pred,columns=['data1','data2','pred'])
    df0 = df[df.pred == 0].values
    df1 = df[df.pred == 1].values
    df2 = df[df.pred == 2].values

    #画图
    plt.scatter(df0[:,0],df0[:,1],c ='turquoise',marker = 'o',label = 'label0')
    plt.scatter(df1[:, 0], df1[:, 1], c='green', marker='*', label='label1')
    plt.scatter(df2[:, 0], df2[:, 1], c='blue', marker='+', label='label2')
    plt.scatter(centroids[:,0].tolist(),centroids[:,1].tolist(),c='red')
    plt.legend(loc = 2)
    plt.show()

具体实现效果:

小伙伴们,可以根据需求添加数据集,本文只是简单添加了几组数据集做一下演示。🌟🌟🌟


  • 6
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小哥谈

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

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

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

打赏作者

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

抵扣说明:

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

余额充值