kmeans算法原理以及实践操作

2023-11-15

原文:http://www.cnblogs.com/dudumiaomiao/p/5839905.html

kmeans算法原理以及实践操作(多种k值确定以及如何选取初始点方法)

kmeans一般在数据分析前期使用,选取适当的k,将数据聚类后,然后研究不同聚类下数据的特点。

 

算法原理:

(1) 随机选取k个中心点;

(2) 在第j次迭代中,对于每个样本点,选取最近的中心点,归为该类;

(3) 更新中心点为每类的均值;

(4) j<-j+1 ,重复(2)(3)迭代更新,直至误差小到某个值或者到达一定的迭代步数,误差不变.

空间复杂度o(N)

时间复杂度o(I*K*N)

其中N为样本点个数,K为中心点个数,I为迭代次数

 

为什么迭代后误差逐渐减小:

SSE= 

对于 而言,求导后,当 时,SSE最小,对应第(3)步;

对于 而言,求导后,当 时,SSE最小,对应第(2)步。

因此kmeans迭代能使误差逐渐减少直到不变

 

轮廓系数:

轮廓系数(Silhouette Coefficient)结合了聚类的凝聚度(Cohesion)和分离度(Separation),用于评估聚类的效果。该值处于-1~1之间,值越大,表示聚类效果越好。具体计算方法如下:

  1. 对于每个样本点i,计算点i与其同一个簇内的所有其他元素距离的平均值,记作a(i),用于量化簇内的凝聚度。
  2. 选取i外的一个簇b,计算i与b中所有点的平均距离,遍历所有其他簇,找到最近的这个平均距离,记作b(i),即为i的邻居类,用于量化簇之间分离度。
  3. 对于样本点i,轮廓系数s(i) = (b(i) – a(i))/max{a(i),b(i)}
  4. 计算所有i的轮廓系数,求出平均值即为当前聚类的整体轮廓系数,度量数据聚类的紧密程度

从上面的公式,不难发现若s(i)小于0,说明i与其簇内元素的平均距离小于最近的其他簇,表示聚类效果不好。如果a(i)趋于0,或者b(i)足够大,即a(i)<<b(i),那么s(i)趋近与1,说明聚类效果比较好。

 

K值确定

法1:(轮廓系数)在实际应用中,由于Kmean一般作为数据预处理,或者用于辅助分聚类贴标签。所以k一般不会设置很大。可以通过枚举,令k从2到一个固定值如10,在每个k值上重复运行数次kmeans(避免局部最优解),并计算当前k的平均轮廓系数,最后选取轮廓系数最大的值对应的k作为最终的集群数目。

法2:(Calinski-Harabasz准则)

   

其中SSB是类间方差, ,m为所有点的中心点,mi为某类的中心点;

SSW是类内方差,

(N-k)/(k-1)是复杂度;

比率越大,数据分离度越大.

 

前提:

Duda-Hart test 看数据集是否适合分为超过1类

 

初始点选择方法:

思想,初始的聚类中心之间相互距离尽可能远.

法1(kmeans++):

1、从输入的数据点集合中随机选择一个点作为第一个聚类中心

2、对于数据集中的每一个点x,计算它与最近聚类中心(指已选择的聚类中心)的距离D(x)

3、选择一个新的数据点作为新的聚类中心,选择的原则是:D(x)较大的点,被选取作为聚类中心的概率较大

4、重复2和3直到k个聚类中心被选出来

5、利用这k个初始的聚类中心来运行标准的k-means算法

 从上面的算法描述上可以看到,算法的关键是第3步,如何将D(x)反映到点被选择的概率上,一种算法如下:

1、先从我们的数据库随机挑个随机点当“种子点”

2、对于每个点,我们都计算其和最近的一个“种子点”的距离D(x)并保存在一个数组里,然后把这些距离加起来得到Sum(D(x))。

3、然后,再取一个随机值,用权重的方式来取计算下一个“种子点”。这个算法的实现是,先取一个能落在Sum(D(x))中的随机值Random,然后用Random -= D(x),直到其<=0,此时的点就是下一个“种子点”。

4、重复2和3直到k个聚类中心被选出来

5、利用这k个初始的聚类中心来运行标准的k-means算法

 

法2:选用层次聚类或Canopy算法进行初始聚类,然后从k个类别中分别随机选取k个点

,来作为kmeans的初始聚类中心点

 

优点:

1、 算法快速、简单;

2、 容易解释

3、 聚类效果中上

4、 适用于高维

 

缺陷:

1、 对离群点敏感,对噪声点和孤立点很敏感(通过k-centers算法可以解决)

2、 K-means算法中聚类个数k的初始化

3、初始聚类中心的选择,不同的初始点选择可能导致完全不同的聚类结果。

实践操作:

R语言

1、####################判断是否应该分为超过1类##########################

dudahart2(x,clustering,alpha=0.001)

2、###################判断使用轮廓系数或Calinski-Harabasz准则选用k值,以及是否使用大规模样本点处理方式##########################################

pamk(data,krange=2:10,criterion="asw", usepam=TRUE,

scaling=FALSE, alpha=0.001, diss=inherits(data, "dist"),    critout=FALSE, ns=10, seed=NULL, ...)

3、############利用pamk求出来的k,用kmeans聚类####################

pamk.result <- pamk(data)

pamk.result$nc

kc <- kmeans(data, pamk.result$nc)

4、############画出k与轮廓系数关系,求出拐点值########################

# 0-1 正规化数据

min.max.norm <- function(x){

    (x-min(x))/(max(x)-min(x))

}

raw.data <- iris[,1:4]

norm.data <- data.frame(sl = min.max.norm(raw.data[,1]),

                                        sw = min.max.norm(raw.data[,2]),

                                        pl = min.max.norm(raw.data[,3]),

                                        pw = min.max.norm(raw.data[,4]))

## k取2到8,评估K

K <- 2:8

round <- 30 # 每次迭代30次,避免局部最优

rst <- sapply(K, function(i){

    print(paste("K=",i))

    mean(sapply(1:round,function(r){

        print(paste("Round",r))

        result <- kmeans(norm.data, i)

        stats <- cluster.stats(dist(norm.data), result$cluster)

        stats$avg.silwidth

    }))

})

plot(K,rst,type='l',main='轮廓系数与K的关系', ylab='轮廓系数')

5、层次聚类得出k-means初始点

iris.hc <- hclust( dist(iris[,1:4]))

# plot( iris.hc, hang = -1)

plclust( iris.hc, labels = FALSE, hang = -1)

re <- rect.hclust(iris.hc, k = 3)

iris.id <- cutree(iris.hc, 3)######得出类别##########

 

6、################采用kmeans++选用k个初始点##################################

n<-length(x)

seed<-round(runif(1,1,n))

for ( i in 1:k){

       if(i==1){ seed[i]<- round(runif(1,1,N)) }

       dd<-0

       tmp<-0

       for(s in 1:n)

       {

              m<-length(seed)

                     for (j in 1:m) {

                            if(j==1){ tmp<-dist(x[s],seed[j]) }

                            else

                                   {

                                          tmptwo<-tmp

                                          tmp<-dist(x[s],seed[j])

                                          if(tmp>tmptwo)tmp<-tmptwo

                                   }

                            }

              dd[s]<-tmp

       }

       sumd<-sum(dd)

       random<--round(runif(1,0, sumd))

       for(ii in 1:n)

       {

              if(random<=0){break};

              else{

              random<-random-dd[ii]

         }

}

seed[i+1]<-ii

}

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

kmeans算法原理以及实践操作 的相关文章

  • Open3D 点云快速欧式聚类(python详细过程版)

    目录 一 算法原理 1 论文概述 2 实现流程 3 参考文献 二 代码实现 三 结果展示 四 实验数据 一 算法原理 1 论文概述 从点云数据进行分割在许多应用中都是必不可少的 例如遥感 移动机器人或自动驾驶汽车 然而 三维距离传感器捕获的
  • 机器学习实验 - MeanShift聚类

    目录 一 报告摘要 1 1 实验要求 1 2 实验思路 1 3 实验结论 二 实验内容 2 1 方法介绍 2 2 实验细节 2 2 1 实验环境 2 2 2 实验过程 2 2 3 实验与理论内容的不同点 2 3 实验数据介绍 2 4 评价指
  • 【数学建模笔记 29】数学建模的多元分析

    29 多元分析 定义 多元分析是多变量的统计分析方法 是数理统计中应用广泛的一个重要分支 判别分析 判别分析是一种分类方法 假定有 r r r 类判别对象 A 1
  • 数据分析师的必备能力—样本数据异常值识别的4种经典方法

    对于从事数据分析岗位的小伙伴 日常工作中可能会接触到很多类型的维度数据 而在开展任务的具体实践过程中 需要我们只有具备较好的数据分析能力 才能根据实际业务需求得到有价值的分析结果 在包括业务熟悉 数据理解 逻辑思维等能力的范围内 掌握数据分
  • 机器学习——聚类——商场客户聚类

    聚类的介绍 案例 商场客户聚类 目录 聚类的介绍 案例 商场客户聚类 一 读取数据 二 聚类 KMeans函数的参数讲解 KMeans属性列表 KMeans接口列表 三 查看数据及可视化 sort values 方法 groupby 的常见
  • 数据挖掘概述

    目录 1 数据挖掘概述 2 数据挖掘常用库 3 模型介绍 3 1 分类 3 2 聚类 3 3 回归 3 4 关联 3 5 模型集成 4 模型评估 ROC 曲线 5 模型应用 1 数据挖掘概述 数据挖掘 寻找数据中隐含的知识并用于产生商业价值
  • 机器学习:聚类算法简介

    学习目标 知道聚类算法的概念 了解聚类算法和分类算法的最大区别 1 认识聚类算法 使用不同的聚类准则 产生的聚类结果不同 1 1 聚类算法在现实中的应用 用户画像 广告推荐 Data Segmentation 搜索引擎的流量推荐 恶意流量识
  • 机器学习--聚类(12)

    一 基本概念 聚类的概念 一种无监督的学习 事先不知道类别 自动将相似的对象归到同一个簇中 应用场景 文档分类器 客户分类 保险欺诈检测 乘车数据分析 二 距离计算 对于有序距离 其中P 1为曼哈顿距离 P 2为欧氏距离 对于无序距离 使用
  • 推荐系统 用户画像 标签聚类 个性化搜索

    最近在做短视频推荐 和别的部门配合着做 我们部门做用户画像这一部分 回头看看 我们部门以前做的用户画像只能称之为 所谓的用户画像 如果一个人不懂用户画像还好指挥来指挥去真的让人无言 不知道其他公司的有没有这样的人儿那 哈哈 扯远了 言归正传
  • 机器学习:均值漂移(Mean Shift)详细解释

    1 均值漂移的基本概念 Mean Shift算法和k means相似 都是一个迭代的过程 即先算出当前点的偏移均值 将该点移动到该偏移均值 以此为新的起始点 继续移动 直到满足最终的条件 1 设想在一个有N个样本点的特征空间 初始确定一个中
  • 手写算法-python代码实现DBSCAN

    手写算法 python代码实现DBSCAN 原理解析 代码实现 实例演示与sklearn对比 总结 原理解析 上篇文章我们优化了Kmeans聚类算法 最后留下一个问题 Kmeans只适合处理凸样本集 不适合处理非凸样本集 这个问题 怎么解决
  • 无监督分类的4种方法

    1 等宽法 类似于制作频数分布图 将属性分布值分为几个等分的分布区间 2 等频法 将相同数量的记录放入每个区间 3 基于聚类的分析方法 将属性按照K means算法进行聚类 然后根据聚类的分类 将同一聚类的记录合并到同一组内 4 模拟退火法
  • 客户个性分析 聚类 大数据

    客户个性分析 聚类 大数据 作者 桂Sir 联系方式 1052656099 qq com 不同的消费者 由于受年龄 性别 群体 职业 民族等自身类型的不同 以及生活习惯 兴趣 爱好 和个人性格因素的影响 在对同一产品的选购过程中往往会表现出
  • 智能优化算法改进-K-means聚类种群初始化附Matlab代码

    目录 0引言 一 K means聚类原理 二 K Means聚类算法步骤 三 K Means聚类原理图 编辑 四 K means聚类改进智能优化算法种群初始化效果图 4 1 初始种群数据图 4 2 K means聚类结果图 4 2 1 根据
  • 点云数据做简单的平面的分割 三维场景中有平面,杯子,和其他物体 实现欧式聚类提取 对三维点云组成的场景进行分割

    点云分割是根据空间 几何和纹理等特征对点云进行划分 使得同一划分内的点云拥有相似的特征 点云的有效分割往往是许多应用的前提 例如逆向工作 CAD领域对零件的不同扫描表面进行分割 然后才能更好的进行空洞修复曲面重建 特征描述和提取 进而进行基
  • 多视图聚类(multi-view clustering)简介

    多视图聚类 目前大概有以下几种 多视图k means聚类 多视图谱聚类 多视图图聚类 多视图子空间聚类 multi view subspace clustering 深度学习多视图聚类 deep multi view clustering
  • 根据眼动数据的模板作为KNN聚类的中心点并因此进行数据分类

    from scipy io import loadmat import numpy as np import matplotlib pyplot as plt 实验数据采集分为两个过程 第一个是眼动校准阶段 要求实验参与者依次观看界面上的数
  • 1.机器学习的基础概念

    机器学习的基础概念 文章目录 机器学习的基础概念 机器学习的分类 一 监督学习 1 监督学习概念 2 监督学习流程 3 监督学习算法 二 无监督学习 1 无监督学习概念 2 无监督学习流程 3 无监督学习算法 总结 机器学习的分类 机器学习
  • 机器学习(三)K-means聚类(手肘法、轮廓系数、可视化代码)

    K means聚类 聚类是无监督学习当中非常重要的一部分 能够在没有标签的情况下将数据分类 说到聚类 最常用也是最重要的一个算法就是K means算法 算法介绍 K means是一种非常简单快速高效的算法 只需要迭代几次即可 其原理用一句话
  • 机器学习算法——Kmeans

    1 k mean算法的原理 1 选取K个点做为初始聚集的簇心 2 分别计算每个样本点到K个簇核心的距离 这里的距离一般取欧氏距离或余弦距离 找到离该点最近的簇核心 将它归属到对应的簇 3 所有点都归属到簇之后 M个点就分为了K个簇 之后重新

随机推荐

  • 告别2021,迎接2022

    2021相对有点忙有点累 一直想记录一下 但是实在是在惰性趋势下 歇息了一个月 才正常提笔微记 最近思绪也比较忙 提笔规划也是有点凌乱 2021年在新单位的第二年 开始结交朋友 受朋友们的影响 开始准备考研 软考 幸运的是 也都坚持下来了
  • adb将Apk内置到系统中(system/priv-app)

    有时候我们在Android 系统内置自己的应用 在测试时 Android Studio 默认的安装方式是将我们开发的应用作为普通应用安装到系统中的 本文提供一种方式 在开发过程中 将apk内置到系统中 而不需要系统源代码 adb 将apk内
  • java新建一个窗口_Java实例:使用JFram创建一个简单的窗口

    一个图形用户界面以一个top level container开始 它为其他的界面组件提供了一个 家 指定应用程序的总体感觉 在本教程中 向你介绍JFrame类 它将用于给一个Java应用程序创建一个简单的top level窗口 打开你的编辑
  • UI操作 解决方案

    1 include
  • 中断、信号、系统调用

    1 中断的分类 中断程序的方法可以分为硬件中断和软件中断 硬件中断是硬件自动触发的 包括中断和异常 比如 中断 通过中断控制器给CPU的INTR引脚发送信号 如按下键盘 会给CPU一个0x21中断号 异常 CPU执行某条指令发生异常 会自己
  • tr td分合并单元格

    table border 1 width 200 tr td ss td tr tr td width 25 td td width 25 td tr table
  • Spark性能优化:数据倾斜调优

    前言 继 Spark性能优化 开发调优篇 和 Spark性能优化 资源调优篇 讲解了每个Spark开发人员都必须熟知的开发调优与资源调优之后 本文作为 Spark性能优化指南 的高级篇 将深入分析数据倾斜调优与shuffle调优 以解决更加
  • 设计补偿器网络以改善开关频率响应

    直流开关电压转换器 或 开关调节器 控制回路的特点是频率响应 频率响应影响开关调节器的反应时间对瞬态变化 精度和稳定性的影响 并在输入电压 负载和工作周期变化的情况下 如何保持设定的电压输出 工程师可以通过增加补偿器网络来改善开关调节器的频
  • Linux在云服务器上安装JDK

    官网地址下载 Java Downloads Oracle 将下载好的jdk通过Xftp传输到服务器上去 创建一个文件夹用于区分 在home文件夹下创建一个属于自己的文件夹 将需要的文件传输过去 也可以直接在 usr local 下配置 cd
  • win7电脑最新版微信卡死问题的解决

    最近一段时间无论单位还是家里事情都比较多 导致没有时间学习和写文 排名蹭蹭地往下掉 刚好遇到一个win7版微信卡死的问题 在网上查了下 找到了win10相关的可以参考的解决办法 确实有效 在此介绍一下 一 问题现象 当最小化win7托盘的微
  • linux环境安装php fileinfo扩展

    linux环境安装php fileinfo扩展 windows环境安装扩展比较简单 只需要把dll拷贝到扩展目录 修改php ini中相应的扩展就好了 下面来介绍一下linux环境下的php扩展安装 以centos6 5和php7 1为例
  • C++ OpenCV制作九宫格拼图游戏

    学更好的别人 做更好的自己 微卡智享 本文长度为2498字 预计阅读7分钟 前言 上一篇 C OpenCV生成九宫格图像 介绍了如何将图片分割城九宫格 然后重新打乱了顺序显示出来 本篇就来说一下怎么制作一个九宫格的拼图游戏 项目的重新创建了
  • JAVA是什么意思

    JAVA的意思是计算机的编程语言 Java通过面向对象的编程语言 它不仅吸收了C 语言的优点 而且摒弃了C 中难于理解的多继承和指针的概念 具有简单性 功能强大 分布式 健壮性 安全性 平台独立与可移植性 多线程及动态性的特点 Java语言
  • 第二十一课,几何着色器(基础篇)

    几何着色器的作用 输入 输入类型 从顶点着色器接收下列任何一个图元值 类型 数组大小 points 绘制GL POINTS图元时 1 lines 绘制GL LINES或GL LINE STRIP时 2 lines adjacency GL
  • seaborn学习笔记(二):散点图、线图

    html font family sans serif ms text size adjust 100 webkit text size adjust 100 body margin 0 article aside details figc
  • Spring Cloud Gateway替代zuul作为API网关(一)

    本文简要介绍如何使用Spring Cloud Gateway 作为API 网关 不是使用zuul作为网关 关于Spring Cloud Gateway和zuul的性能比较本文不再赘述 基本可以肯定Spring Cloud Finchley版
  • matlab 中.*和*有什么区别

    和 的区别 在进行数之间的运算时 和 是没有区别的 都是表示普通的乘法运算 例 m 2 n 3 m n 6 m n 6 在进行矩阵之间的运算时 和 的意义就有所不同了 假设a b表示两个矩阵 a b表示矩阵a与矩阵b进行矩阵相乘 a b表示
  • 微软服务器dda,实战DDA硬件直通:Hyper-V虚拟机直通NVMe固态硬盘

    虚拟机可以把一台电脑模拟成许多台完整的系统 并在他们当中安装运行各自的操作系统和软件应用 在使用虚拟机的时候我们既可以利用NVMe固态硬盘的性能 同时承载多个虚拟机的读写请求 也可以让其中某个需要重负载读写的虚拟机独享它的性能 这时就需要用
  • VsCode搭建Windows C++ (MSVC)开发环境

    由于最近的学习需求 折腾起了vscode 毕竟是跨平台 对以后项目的拓展也很方便 至于为什么不用mingw tdm gcc一类 主要因为毕竟是Windows平台 使用自家的MSVC开发环境一来可以放心 少出BUG 二来能够增强Windows
  • kmeans算法原理以及实践操作

    原文 http www cnblogs com dudumiaomiao p 5839905 html kmeans算法原理以及实践操作 多种k值确定以及如何选取初始点方法 kmeans一般在数据分析前期使用 选取适当的k 将数据聚类后 然