如何选择K-Means中K的值

  K-Means需要设定一个簇心个数的参数,现实中,最常用于确定K数的方法,

其实还是人手工设定。例如,当我们决定将衣服做成几个码的时候,其实就是在以

人的衣服的长和宽为为特征进行聚类。所以,弄清楚我们更在意的是什么,能够

引导选择更合适的K值。

  有种方法能自动决定K值,也就是所谓的Elbow Method(DIVFRP层次聚类etc.)。

它的idea是将不同K值及其相对应的cost function值画出来,将转折明显的地方K值设置

为最合适的K。如图:

但实际上,它并不是总是好用的。有时整个变换曲线并没有明显的转折点。

关于如何实现Elbow Method未来我会专门写一篇随笔来介绍,并给出相应的python实现。

时间: 2024-11-05 20:37:59

如何选择K-Means中K的值的相关文章

Map<K, V> 中k,v如果为null就转换

Set<String> set = map.keySet(); if(set != null && !set.isEmpty()) { for(String key : set) { if(map.get(key) == null) { map.put(key, ""); } } } 原文地址:https://www.cnblogs.com/smileblogs/p/10332279.html

java自定义类型 作为HashMap中的Key值 (Pair&lt;V,K&gt;为例)

由于是自定义类型,所以HashMap中的equals()函数和hashCode()函数都需要自定义覆盖. 不然内容相同的对象对应的hashCode会不同,无法发挥算法的正常功能,覆盖equals函数,应该就相当于c++重载==运算符来保证能判断是否相等.只不过java没有自定义重载运算符这个功能的,需要进行函数覆盖. equals的函数原型是 boolean equals(Object o);注意括号内.hashCode的函数原型就是int hashCode(); 先看一段代码: import

选择问题——选出第K个最大的元素

最近在读<数据结构与算法分析(C语言描述)>,在优先队列(堆)一节中,作者总结了关于"选择问题--求第k个最大的元素"的几种思路,在此简单总结一下: 第一种 将这N个数读进一个数组中,再通过某种简单的算法,比如冒泡排序.选择排序等,以递减顺序将数组进行排序,然后返回位置k上的元素.假设使用最简单的排序算法,则运行时间为O(N2) 第二种 这是对第一种算法的简单优化.申请一个大小为k的数组,然后先把前k个元素读入数组并以递减顺序进行排序.接着,将剩下的元素再逐个读入.当新元素

为什么Hash函数 H(k) = k % m中 m 尽量不要为2的幂次 也不是要是2^i -1

为什么Hash函数 H(k) = k % m中 m 尽量不要为2的幂次 下面的截屏来自CLRS的11章 关于哈希函数的讨论 之前我就一直困惑,为什么 When using the division method, we usually avoid certain values of m. For example, m should not be a power of 2, since ifm = 2^p , then H(k) is just the p lowest-order bits of

springMVC 返回类型选择 以及 SpringMVC中model,modelMap.request,session取值顺序

springMVC 返回类型选择 以及 SpringMVC中model,modelMap.request,session取值顺序 http://www.360doc.com/content/14/0309/19/834950_359080244.shtml

【LeetCode-面试算法经典-Java实现】【025-Reverse Nodes in k-Group(单链表中k个结点一组进行反转)】

[025-Reverse Nodes in k-Group(单链表中k个结点一组进行反转)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. If the number of nodes is not a multiple of k then left-out nodes i

选择问题,自定义k=N/2为最大值!

方法: k之前的先排序,最大值给k. 之后的逐个比较,大于k直接覆盖,否则k不变. 代码:      package com.Edward.suanfa; import java.util.Random; class getmax{ int getmax_(int a[],int k){//数组a[],k为指定最大值 int max=a[0]; int temp; int len=a.length-1; for(int i=0;i<=k;i++){ if(max>a[i]){ temp=a[i

【Java必修课】通过Value获取Map中的键值Key的四种方法

1 简介 我们都知道Map是存放键值对<Key,Value>的容器,知道了Key值,使用方法Map.get(key)能快速获取Value值.然而,有的时候我们需要反过来获取,知道Value值,求Key值. 本文将用实例介绍四种方法,通过传入Value值,获取得到Key值. 2 四种方法 2.1 循环法 循环法就是通过遍历Map里的Entry,一个个比较,把符合条件的找出来.会有三种情况: (1)找到一个值 (2)找到多个值 (3)找不到 具体代码如下: @Test public void lo

C++ 11 中的右值引用

C++ 11 中的右值引用 右值引用的功能 首先,我并不介绍什么是右值引用,而是以一个例子里来介绍一下右值引用的功能: #include <iostream>    #include <vector>    using namespace std; class obj    {    public :        obj() { cout << ">> create obj " << endl; }        obj(c