k-means

k-medoids

一、clustering 中的 loss function

关于聚类的性能评价标准 参考博客

可以为外部指标和内部指标,其中外部指标是指 聚类结果与某个 “参考模型" 进行表示, 内部指标直接考察聚类结果不参考模型

  • 外部指标:

1、Jaccard系数

系属于相同类占总类数的比例, 越大说明效果越好。

  • 内部指标:

1、DB指数

DB计算 任意两类别的类内距离平均距离(CP)之和除以两聚类中心距离 求最大值

DB越小意味着类内距离越小 同时类间距离越大

  • k-means 所要优化的目标函数

设我们一共有 N 个数据点需要分为 K 个 cluster ,k-means 要做的就是最小化 这个函数,

其中  在数据点 n 被归类到 cluster k 的时候为 1 ,否则为 0 。

二、K值选取规则:

1、轮廓系数:

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

轮廓系数讲解

2、Elbow method
对于n个点的数据集,迭代计算k from 1 to n,每次聚类完成后计算每个点到其所属的簇中心的距离的平方和,可以想象到这个平方和是会逐渐变小的,直到k==n时平方和为0,因为每个点都是它所在的簇中心本身。但是在这个平方和变化过程中,会出现一个拐点也即“肘”点,盗了张图可以看到下降率突然变缓时即认为是最佳的k值。

三、k-means与kmedoids

  • k-means与k-medoids的不同之处

k-means在求聚类中心点时使用 均值 的方法来求的, k-medoids求聚类中心点时是用 中位数(质心) 的方法来求的,也就是说k-means的中心点是连续空间的值,而k-medoids是样本数据中的某一个。

  • 为什么k-medoids用中位数?(k-medoid比k-means好在哪里
  1. 对于数值特征来说是没问题的,但是对于类别特征呢,这里举了一个对狗进行分类的栗子,相减,求均值就没什么意义,所以聚类中心点就从该cluster中选取,然后自定义一个衡量dissimilarity的函数,最终k-medoids的损失函数:

最常见的方式是构造一个 dissimilarity matrix  来代表 ,其中的元素  表示第  只狗和第  只狗之间的差异程度,

2. k-medoids对噪声的鲁棒性更强,有一个噪声点,k-means很容易受影响,相反,k-medoids却没受多大影响

  • k-medoids时间复杂度比k-means

k-medoids确定中位数时,需要n^2的时间,或者nlogn

局限性

1、受初始聚类点的影响

  • 选择合适的初始点,可以加快算法的收敛速度和增强类之间的区分度
  • 针对具体的问题有一些启发式的选取方法,或者大多数情况下采用随机选取的办法
  • k-means 并不能保证全局最优,而是否能收敛到全局最优解其实和初值的选取有很大的关系,所以有时候我们会多次选取初值跑 k-means ,并取其中最好的一次结果。

参考博客:

http://blog.pluskid.org/?p=17

【clustering】之K-means && K-medoids的更多相关文章

  1. 判断字符串是否包含字母‘k’或者‘K’

    判断字符串是否包含字母‘k’或者‘K’ public bool IsIncludeK(string temp) { temp = temp.ToLower(); if (temp.Contains(' ...

  2. 给定整数a1、a2、a3、...、an,判断是否可以从中选出若干个数,使得它们的和等于k(k任意给定,且满足-10^8 <= k <= 10^8)。

    给定整数a1.a2.a3.....an,判断是否可以从中选出若干个数,使得它们的和等于k(k任意给定,且满足-10^8 <= k <= 10^8). 分析:此题相对于本节"寻找满 ...

  3. 【POJ】2449.Remmarguts' Date(K短路 n log n + k log k + m算法,非A*,论文算法)

    题解 (搬运一个原来博客的论文题) 抱着板题的心情去,结果有大坑 就是S == T的时候也一定要走,++K 我发现按照论文写得\(O(n \log n + m + k \ log k)\)算法没有玄学 ...

  4. LeetCode OJ:Reverse Nodes in k-Group(K个K个的分割节点)

    Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. If ...

  5. UVA 1363 Joseph's Problem 找规律+推导 给定n,k;求k%[1,n]的和。

    /** 题目:Joseph's Problem 链接:https://vjudge.net/problem/UVA-1363 题意:给定n,k;求k%[1,n]的和. 思路: 没想出来,看了lrj的想 ...

  6. js为Object对象动态添加属性和值 eval c.k c[k]

    const appendInfo = () => { const API_SECRET_KEY = 'https://github.com/dyq086/wepy-mall/tree/maste ...

  7. d[k]=eval(k)

    lk = ['oid', 'timestamp', 'signals', 'area', 'building', 'city', 'name', 'floor', 'industry', 'regio ...

  8. bzoj3028食物 关于(1+x+x2+x3+x4+...)^k的第i项系数就是c(i+k−1,k−1)的证明

    关于(1+x+x2+x3+x4+...)^k的第i项系数就是c(i+k−1,k−1)的证明对于第i项,假设为5x^5=x^0*x^5x^5=x^1*x^4x^5=x^2*x^3........也就是说 ...

  9. python代码{v: k for k, v in myArray.items()}是什么意思?

    最近在扒vnpy的源码总能看到{v: k for k, v in ORDERTYPE_VT2HUOBI.items()}这样的源码,就是不知道什么意思 然后万能的google找到了Quora的一个类似 ...

  10. 解析形如(k,v)(k,v)(k,v)字符串

    有时根据需要会将map数据格式化成(k,v)(k,v)(k,v)--字符串,之后需要还原,下面代码实现了还原过程 1 void SplitString(const string& s, vec ...

随机推荐

  1. name设置id的方式 解决多个单选域冲突现象 同时有利于从动态网页取值

  2. Kibana-4.6.6 marvel插件license过期重新注册

    1.注册新的license,https://register.elastic.co/marvel_register,注册完毕邮箱收取下载地址,将新的license下载到本地 2.到license所在目 ...

  3. [SCOI2005] 互不侵犯

    传送门:>Here< 解题思路 其实这道题一种很简单的解法是搜索+打表,但是这样很赖皮.这里给出一种状压DP的解法. 很显然利用普通的DP无法解决了,因为针对点来转移是很难的.但看到$N& ...

  4. topcoder SRM642 div1 hard WheelofFortune

    题目链接:vjudge 大意:有两个人参加一场游戏,这个游戏在一个编号为\(0\text~n-1\)的轮盘上进行,一开始轮盘上的数字均为0:一共有\(m\)轮,每一轮都有一个操作参数\(s_i\),主 ...

  5. C#中equal与==的区别

    C#中equal与==的区别 来源 https://www.cnblogs.com/dearbeans/p/5351695.html C#中,判断相等有两种方式,一种是传统的==操作,一种是objec ...

  6. 工作机制.py

    rpc_server.py# !/usr/bin/env python3.5# -*- coding:utf-8 -*-# __author__ == 'LuoTianShuai'"&quo ...

  7. Hyper-V

    docker与vm同时安装,会导致虚拟机无法启动及网络不通等问题,解决方法分为两步. 1.在网络连接中禁用vEthernet连接. 2.控制面板>程序>程序和功能中 >启用或关闭wi ...

  8. ST算法(倍增)(用于解决RMQ)

    ST算法 在RMQ(区间最值问题)问题中,我了解到一个叫ST的算法,实质是二进制的倍增. ST算法能在O(nlogn)的时间预处理后,用O(1)的时间在线回答区间最值. f[i][j]表示从i位起的2 ...

  9. LinkedList(JDK1.8)源码分析

    双向循环链表 双向循环链表和双向链表的不同在于,第一个节点的pre指向最后一个节点,最后一个节点的next指向第一个节点,也形成一个"环".而LinkedList就是基于双向循环链 ...

  10. java ee wildfly spring 在线程池的线程中注入

    public class RtmpSpyingTests extends AbstractTransactionalJUnit4SpringContextTests { @Autowired Thre ...