一、k-means:在大数据的条件下,会耗费大量的时间和内存。
优化k-means的建议:
1、减少聚类的数目K。因为,每个样本都要跟类中心计算距离。
2、减少样本的特征维度。比如说,通过PCA等进行降维。
3、考察其他的聚类算法,通过选取toy数据,去测试不同聚类算法的性能。
4、hadoop集群,K-means算法是很容易进行并行计算的。
二、K-means距离的定义:
目前各种机器学习开源库,对于k-means的实现,都是基于欧式距离。如果想自定义距离,比如说用余弦相似度,那么k-means就必须要重新推导,也即需要重新实现k-means。
下面,从k-means的推导中,可以发现,在k-means当中,计算类的中心,跟距离的定义是紧密相关的。
如上所示:在k-means当中,重新计算类中心,仅在距离定义为欧式距离的前提下,才是加和取平均。如果想用cos相似度,那么就必须要重新推导,计算类中心的方式。所以说,一般开源库实现的k-means,都没有提供让你自定义聚类的接口。或者说,让你传进去一个距离矩阵。
就我们这个问题而言:LDA提取出来的隐特征向量,是概率分布。本来我使用的聚类算法是计算cos相似度来衡量距离。使用
k-medoid算法去聚类。传进去的是,我计算好的个体之间的相似度矩阵。但是,这种聚类算法局限性很大,需要占用非常多的内存。
1、比如说,我有50w和用户,那么需要一个N*N的相似度矩阵。那么要存储这个大矩阵,需要的内存。50w*50w*24/(1024*1024*1024)=5587GB。注:浮点数在python中占用了24个字节。很明显,当用户数达到50w时,这种传相似度矩阵的办法已经不可行。
2、不过,传相似度矩阵的办法,虽然很占用内存,并且时间效率也不高。
3、所以,当用户数量达到50w时,使用k-means,k-means只需要,把所以数据载入内存,即可。即使,载入50w条记录,也不会耗费多少内存。
4、并且,k-means的话,其时间复杂度是O(K*N)。但是,k-medoid的时间复杂度O(N*N),主要集中在计算相似度矩阵。一般情况下,N>>K。故k-means的时间复杂度,和空间复杂度都会优于k-medoid。但,只是k-means的局限性是无法自定义距离,只能使用欧式距离。
三、欧式距离和余弦距离的联系
1、首先,余弦距离和欧式距离一般是不等价的。比如说,夹角一样的两条边,边的距离是不一样的。
2、当,两个向量的模长=1时,其欧式距离和余弦距离是等价的。
3、所以说,在这个问题中,如果我们将LDA提取到的隐特征,进行模长归一化为1。那么将该训练数据丢到k-means里面去,即使使用欧式距离,那么也等价于使用了余弦距离。前提是,对于特征向量归一化到模长为1。余弦距离和欧式距离才会等价。
4、当然,也可以不归一化到模长为1,直接使用用k-means聚类,相当于直接是使用了欧式距离。
四、k-medoids简介
k-medoids 算法,其实从名字上就可以看出来,和 k-means 肯定是非常相似的。事实也确实如此,k-medoids 可以算是 k-means 的一个变种。
k-medoids 和 k-means 不一样的地方在于中心点的选取,在 k-means 中,我们将中心点取为当前 cluster 中所有数据点的平均值。
并且我们已经证明在固定了各个数据点的 assignment 的情况下,这样选取的中心点能够把目标函数 最小化。然而在 k-medoids 中,我们将中心点的选取限制在当前 cluster 所包含的数据点的集合中。换句话说,在k-medoids 算法中,我们将从当前 cluster 中选取这样一个点——它到其他所有(当前 cluster 中的)点的距离之和最小——作为中心点。k-means 和 k-medoids 之间的差异就类似于一个数据样本的均值 (mean) 和中位数 之间的差异:前者的取值范围可以是连续空间中的任意值,而后者只能在给样本给定的那些点里面选。那么,这样做的好处是什么呢?
一个最直接的理由就是k-means 对数据的要求太高了,它使用欧氏距离描述数据点之间的差异 (dissimilarity),从而可以直接通过求均值来计算中心点。这要求数据点处在一个欧氏空间之中。
然而并不是所有的数据都能满足这样的要求,对于数值类型的特征,比如身高,可以很自然地用这样的方式来处理,但是类别 (categorical) 类型的特征就不行了。 因为k-medoids,类中心点的选择,是选取该类中的一个样本,所以说k-medoids可以传进去一个个体间的相似度矩阵。

k-means优化 k-means距离的选择 k-medoids对比相关推荐

  1. [转载]「交叉验证」到底如何选择K值?

    「交叉验证」到底如何选择K值? 原文链接:https://cloud.tencent.com/developer/article/1410946 交叉验证(cross validation)一般被用于 ...

  2. knn 邻居数量k的选取_选择K个最近的邻居

    knn 邻居数量k的选取 Classification is more-or-less just a matter of figuring out to what available group so ...

  3. 【机器学习】——K_means如何选择k值?

      K_means聚类是我们在无监督学习中常用的一种算法,但有一个很让人头疼的问题就是如何选择k值.在实际业务中,如果根据业务场景明确知道要得到的类数,那就好办了,但很多时候不知道K怎么办呢?下面有三 ...

  4. 【算法30】从数组中选择k组长度为m的子数组,要求其和最小

    原题链接:codeforce 267 Div2 C 问题描述: 给定长度为n的数组a[],从中选择k个长度为m的子数组,要求和最大. 形式描述为:选择$k$个子数组[$l_1$, $r_1$], [$ ...

  5. leetcode的Hot100系列--347. 前 K 个高频元素--hash表+直接选择排序

    这个看着应该是使用堆排序,但我图了一个简单,所以就简单hash表加选择排序来做了. 使用结构体: typedef struct node {struct node *pNext;int value; ...

  6. cpu选择K还是f?哪个更靠谱?

    CPU选择带k还是F?哪个更靠谱? 关于这个问题估计很多刚接触大脑的小伙伴是懵圈的,他们根本就不知道这个k和F到底是干什么的,这个CPU为什么后面会有字母,他们又分别代表什么意思?我们在回答这道题之前 ...

  7. 365天挑战LeetCode1000题——Day 079 力扣周赛专题 米哈游 检查相同字母间的距离 恰好移动 k 步到达某一位置的方法数目 最长优雅子数组

    6167. 检查相同字母间的距离 简单的遍历,注意每个字母只能遍历一遍,第二次遍历时要跳过,所以需要用一个哈希表来记录 代码实现(自解) class Solution {public:bool che ...

  8. LeetCode 719. 找出第 K 小的数对距离

    719. 找出第 K 小的数对距离 [二分+二分] 首先对数组排序,然后算出最大值和最小值之间的差值,这个差值就是解空间的最大值,然后对解空间进行二分,每次对解空间的mid统计数对距离小于他的个数,通 ...

  9. k折交叉验证优缺点_R语言中K邻近算法的初学者指南:从菜鸟到大神(附代码&链接)...

    作者:Leihua Ye, UC Santa Barbara 翻译:陈超 校对:冯羽 本文约2300字,建议阅读10分钟 本文介绍了一种针对初学者的K临近算法在R语言中的实现方法. 本文呈现了一种在R ...

  10. 论文研读-多目标优化中的多源选择迁移框架

    论文研读-多目标优化中的多源选择迁移框架 Multisource Selective Transfer Framework in Multiobjective Optimization Problem ...

最新文章

  1. halconC++类:HDevWindowStack
  2. 【热点】WPA2协议遭破解,全世界wifi不安全了
  3. 常用类 (四) ----- Random随机数类
  4. hdu6110:路径交
  5. 【libjpeg-turbo】安装指南[mac版]
  6. 中国各省所处的经纬度范围
  7. 两数相加(有序/无序) 时间复杂度小于 O(n2)做题心得
  8. 网易云音乐mp3外链、真实地址下载方法
  9. 实测 CSDN开发助手-Chrome插件
  10. Set接口介绍、HashSet源码简要分析
  11. 奈奎斯特定理和香农定理
  12. 【DOSBox调整窗口大小】
  13. ESP8266串口WiFi扩展板详解
  14. 易能变频器说明书故障代码_易能变频器故障判断与处理
  15. ELv2是一种什么样的存在?StarRocks为何惹众怒?
  16. DNS知识点及服务搭建案例和解析状态异常
  17. 2021-2022学年广州市第二中学九年级第一学期12月考英语试题
  18. 凿 壁 偷 光 是白话文的,不要文言文的
  19. vue.js项目实战运用篇之抖音视频APP-第二节:项目基础架构搭建
  20. 机器学习第二章之数据分析的基本武器

热门文章

  1. 正交频分复用(OFDM)初步(原理)
  2. 国家航天局:中国空间站预计到2022年前后建成
  3. java包名命名规范[【转】
  4. 从博客园博问站点迁移ASP.NET Core展望.NET Core
  5. NOI2015 题解
  6. 用栈来表示队列,用队列来表示栈
  7. Java连接Oracle数据库开发银行管理系统【一、需求篇】
  8. ScaleIO 1.32现在可以免费下载安装使用了(除生产环境之外)
  9. ADT,Eclipse启动时在Android SDK Content Loader0%无法编译
  10. 示波器触发模式及其使用