机器学习——聚类算法k-means

2023-10-27

机器学习——聚类算法k-means

常见的聚类算法,k-means算法(k-均值算法)由簇中样本的平均值来代表整个簇。



聚类分析概述

简单地描述, 聚类(Clustering)是将数据集划分为若干相似对象组成的多个组(group)或簇(cluster)的过程,使得 同一组中对象间的相似 度最大化,不同组中对象间的相似度最小化。或者说一个簇(cluster)就是由彼此相似的一组对象所构成的集合,不同簇中的对象通常不相似或相似度很低。
在这里插入图片描述

  • 在聚类分析中,样本之间的 相似性通常采用样本之间的距离来表示。 样本之间的距离是在样本的描述属性(特征)上进行计算的。

  • 两个样本之间的距离越大,表示两个样本越不相似性,差异性越大;

  • 两个样本之间的距离越小,表示两个样本越相似性,差异性越小。

  • 特例:当两个样本之间的 距离为零时,表示两个样本 完全一样,无差异。


提示:以下是本篇文章正文内容,下面案例可供参考

一、k-means背景?

Ø1957年,斯图亚特·劳埃德最先提出这一标准算法,当初是作为一门应
用于脉码调制的技术
Ø 1965年, E.W.Forgy发表了一个本质上是相同的方法
Ø 1975年和1979年,Hartigan和Wong分别提出了一个更高效的版本
Ø 1982年,这一算法才在贝尔实验室被正式提出,命名为K-Means

二、k-means算法思想

初始随机给定K个簇中心,按照最邻近原则把待分类样本点分到各个簇。然后按平均法重新计算各个簇的质心,从而确定新的簇心。一直迭代,直到簇心的移动距离小于某个给定的值。
在这里插入图片描述

1.k-means聚类算法练习-1

在这里插入图片描述
解:下面步骤显示了对于给定的数据集k-means聚类算法的执行过程。
(1)根据题目,假设划分的两个簇分别为C1和C2,中心分别为(4,5)和(5,5),下面计算10个样本到这2个簇中心的距离,并将10个样本指派到与其最近的簇。
(2)第一轮迭代结果如下:
属于簇C1的样本有:{P7,P1,P2,P4,P5,P8}
属于簇C2的样本有:{P10,P3,P6,P9}
重新计算新的簇的中心,有:C1的中心为(3.5,5.167),C2的中心为(6.75,4.25)
(3)继续计算10个样本到新的簇的中心的距离,重新分配到新的簇中,第二轮迭代结果如下:
属于簇C1的样本有:{ P1,P2,P4,P5,P7,P10}
属于簇C2的样本有:{ P3,P6,P8,P9}
重新计算新的簇的中心,有:C1的中心为(3.67,5.83),C2的中心为(6.5,3.25)。
(4)继续计算10个样本到新的簇的中心的距离,重新分配到新的簇中,发现簇中心不再发生变化,算法终止。

2.算法练习-1代码实现

代码如下(示例):

"""
1.随机取k个中心点
2. 计算所有点到中心点的距离
    将所有点 分别放入 中心点所在的簇
        更新中心点
            如果中心点不变 结束迭代
    迭代
"""
import numpy as np
import matplotlib.pyplot as plt

#获取数据集
def loadDataSet(filename):
    return np.loadtxt(filename,delimiter=",",dtype=np.float)

#取出k个中心点
def initCenters(dataset,k):
    """
    返回的k个中心点
    :param dataset:数据集
    :param k:中心点的个数
    :return:
    """
    centersIndex =  np.random.choice(len(dataset),k,replace=False)
    return dataset[centersIndex]
#计算距离公式
def distance(x,y):
    return np.sqrt(np.sum((x-y)**2))

#kmeans的核心算法
def kmeans(dataset,k):
    """
    返回k个簇
    :param dataset:
    :param k:
    :return:
    """
    #初始化中心点
    centers = initCenters(dataset,k)
    n,m = dataset.shape
    #用于存储每个样本属于哪个簇
    clusters = np.full(n,np.nan)
    #迭代 标志
    flag = True
    while flag:
        flag = False
        #计算所有点到簇中心的距离
        for i in range(n):
            minDist,clustersIndex = 99999999,0
            for j in range(len(centers)):
                dist = distance(dataset[i],centers[j])
                if dist<minDist:
                    #为样本分簇
                    minDist = dist
                    clustersIndex = j
            if clusters[i]!=clustersIndex:
                clusters[i]=clustersIndex
                flag = True
        #更新簇中心
        for i in range(k):
            subdataset = dataset[np.where(clusters==i)]
            centers[i] = np.mean(subdataset,axis=0)
    return clusters,centers

#显示
def show(dataset,k,clusters,centers):
    n,m = dataset.shape
    if m>2:
        print("维度大于2")
        return 1
    #根据簇不同 marker不同
    colors = ["r","g","b","y"]
    for i in range(n):
        clusterIndex = clusters[i].astype(np.int)
        plt.plot(dataset[i][0],dataset[i][1],color=colors[clusterIndex],marker="o")
    for i in range(k):
        plt.scatter(centers[i][0],centers[i][1],marker="s")
    plt.show()
if __name__=="__main__":
    dataset = loadDataSet("testSet.txt")
    clusters,centers = kmeans(dataset,4)
    show(dataset,4,clusters,centers)

k-means算法的评价准则:误差平方和准则
在这里插入图片描述

  • k是簇的个数,P是簇Ci中的样本,mi是簇Ci的均值

–误差平方和达到最优(小)时,可以使各聚类的类内尽可能紧凑,而使各聚类之间尽可能分开。
– 对于同一个数据集,由于k-means算法对初始选取的聚类中心敏感,因此可用该准则评价聚类结果的优劣。
– 通常,对于任意一个数据集,k-means算法无法达到全局最优,只能达到局部最优。


k-means总结

• 优点:
– 可扩展性较好,算法复杂度为O(nkt)。
• 其中:n为样本个数,k是簇的个数,t是迭代次数。
• 缺点:
– 簇数目k需要事先给定,但非常难以选定;
– 初始聚类中心的选择对聚类结果有较大的影响;
– 不适合于发现非球状簇;
– 对噪声和离群点数据敏感。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

机器学习——聚类算法k-means 的相关文章

随机推荐

  • 520七夕表白,还不懂浪漫?4套代码教会你如何深情表白【建议收藏】❤️

    马上又到了脱单的黄金时刻 七夕啦 如果你有喜欢的女孩子 一定要趁着这个时候把喜欢说出口 但是该不会还有人表白在学校的操场上摆着爱心蜡烛抱一束花喊一堆人来围观吧 No 请你立刻马上放弃这个计划 毫无心意不说 对于女孩子来说是真的很社死啊 PS
  • linux 查看java安装目录

    这本阿里P8撰写的算法笔记 再次推荐给大家 身边不少朋友学完这本书最后加入大厂 Github 疯传 史上最强悍 阿里大佬 LeetCode刷题手册 开放下载了 获取java安装路径前要判断是否已经安装成功java 执行命令 java 1 U
  • 清晰图解,一图看懂图卷积GCN、时空图卷积ST-GCN

    目录 1 前言 2 普通卷积与图卷积 2 1 普通卷积 2 2 图卷积 3 ST GCN图卷积的代码解读 4 图卷积的缺陷 5 参考文献 6 联系方式 1 前言 本文为我阅读论文 Spatial Temporal Graph Convolu
  • 微信小程序API~GET

    框架提供丰富的微信原生API 可以方便的调起微信提供的能力 如获取用户信息 本地存储 支付功能等 1 wx on 开头的 API 是监听某个事件发生的API接口 接受一个 CALLBACK 函数作为参数 当该事件触发时 会调用 CALLBA
  • libmysqlclient.so.15: cannot open shared object file: No such file or directory

    libmysqlclient so 15 cannot open shared object file No such file or directory 分类 mysql服务器管理优化 2009 06 02 16 11 26769人阅读
  • DC系列漏洞靶场-渗透测试学习复现(DC-6)

    DC 6是一个易受攻击的实验环境 最终目的是让攻击者获得root权限 并读取flag DC 6使用的操作系统为Debian 64位 靶场下载链接 1 http www five86 com downloads DC 6 zip 2 http
  • P2141 [NOIP2014 普及组] 珠心算测验

    题目描述 珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术 珠心算训练 既能够开发智力 又能够为日常生活带来很多便利 因而在很多学校得到普及 某学校的珠心算老师采用一种快速考察珠心算加法能力的测验方法 他随机生成一个正整数集合
  • HTML之表格篇——表格的嵌套

    表格的嵌套一方面是为使页面 贴子 的外观更为漂亮 利用表格嵌套来编辑出复杂而精美的效果 另一方面是出于布局需要 用一些嵌套方式的表格来做精确的编排 或者二者兼而有之 熟练地掌握表格的嵌套技巧并不是很困难的 只要你思路清晰 对表格的整体嵌套构
  • Shiro源码分析之ShiroFilterFactoryBean

    创建核心Filter 同其他框架一样 都有个切入点 这个核心Filter就是拦截所有请求的 通过web xml中配置的Filer进入 执行init方法获取这个instance 调用下面的createInstance方法创建核心Filter
  • 学习《TensorFlow实战Google深度学习框架》(九)LeNet-5模型

    文章目录 6 4 经典卷积网络模型 6 4 4 LeNet 5模型 LeNet 5模型的架构 源代码 6 4 经典卷积网络模型 6 4 4 LeNet 5模型 LeNet 5模型是Yann LeCun教授于1998年在论文Gradient
  • hash函数(哈希表)

    一 什么叫做散列表 哈希表 散列表是存储key value映射的一种集合 散列表也叫做哈希表 散列表底层也是数组 只是通过一种hash函数来计算他的key值 二 hash函数 在Java中每一个对象都有属于自己的hashcode 这个has
  • interview5-多线程篇

    一 线程的基础知识 1 线程与进程 程序由指令和数据组成 但这些指令要运行 数据要读写 就必须将指令加载至 CPU 数据加载至内存 在指令运行过程中还需要用到磁盘 网络等设备 进程就是用来加载指令 管理内存 管理 IO 的 进程 当一个程序
  • docker中的Volume

    简介 Volume是计算机存储技术中的一个术语 用于表示一块独立的存储空间 在操作系统中 一个硬盘可以被分为多个分区 每个分区可以被格式化为一个独立的卷 这个卷就被称为Volume Volume通常是指一个逻辑存储单元 可以是硬盘 U盘 S
  • 操作系统名词解释

    名词表示 CF 溢出标志位 进位标志位 IF 中断屏蔽标志位 SF 符号标志位 PROW 可编程只读存储器 FCFS 先来先服务算法 SJF 最短进程优先算法 SRTN 最短剩余时间优先算法 HRRF 最高响应比优先算法 名词解释 1 特权
  • mysql5.5忘记密码——修改密码

    ERROR 1045 28000 Access denied for user root localhost using password YES 1 进入mysql的bin目录 2 net stop mysql关闭Mysql服务 记住这一
  • 线性回归实战:股价预测(未完)

    线性回归实战 股价预测 问题描述剖析 数据预处理 理解股价数据 数据清洗 构造训练数据 处理NA字段 数据归一化 构建模型 训练数据和测试数据 训练模型 可视化结果 本文内容是对贪心科技课程第二章的笔记 问题描述剖析 我们制定的任务是 根据
  • C语言中char数组和char指针有什么区别?

    让我们通过下面的例子 来了解 C语言中字符数组和字符指针之间的区别 void test arr is array of characters char arr 12 Aticleworld ptr is pointer to char ch
  • 给定一个数t,以及n个整数,在这n个数中找到加和为t的所有组合

    题目 给定一个数t 以及n个整数 在这n个数中找到加和为t的所有组合 例如t 4 n 6 这6个数为 4 3 2 2 1 1 这样输出就有4个不同的组合它们的加和为4 4 3 1 2 2 and 2 1 1 请设计一个高效算法实现这个需求
  • 数据结构 ->顺序表的输入 输出 查找 删除 销毁 快速排序

    目录 话不多说 上代码 定义 顺序表的 输入 顺序表的 输出 顺序表的 查找 顺序表的 删除 顺序表的 销毁 顺序表的 快速排序 顺序表 全名顺序储存结构 是线性表的一种 顺序表储存数据时 会提前申请一整块足够大小的物理空间 然后将数据依次
  • 机器学习——聚类算法k-means

    机器学习 聚类算法k means 常见的聚类算法 k means算法 k 均值算法 由簇中样本的平均值来代表整个簇 文章目录 机器学习 聚类算法k means 聚类分析概述 一 k means背景 二 k means算法思想 1 k mea