使用肘部法确定k-means均值的k值

import numpy as np
from sklearn.cluster import KMeans
from scipy.spatial.distance import cdist
import matplotlib.pyplot as plt

c1x = np.random.uniform(0.5, 1.5, (1, 10))
c1y = np.random.uniform(0.5, 1.5, (1, 10))
c2x = np.random.uniform(3.5, 4.5, (1, 10))
c2y = np.random.uniform(3.5, 4.5, (1, 10))
x = np.hstack((c1x, c2x))
y = np.hstack((c1y, c2y))
X = np.vstack((x, y)).T

K = range(1, 10)
meanDispersions = []
for k in K:
    kmeans = KMeans(n_clusters=k)
    kmeans.fit(X)
    #理解为计算某个与其所属类聚中心的欧式距离
    #最终是计算所有点与对应中心的距离的平方和的均值
    meanDispersions.append(sum(np.min(cdist(X, kmeans.cluster_centers_, ‘euclidean‘), axis=1)) / X.shape[0])

plt.plot(K, meanDispersions, ‘bx-‘)
plt.xlabel(‘k‘)
plt.ylabel(‘Average Dispersion‘)
plt.title(‘Selecting k with the Elbow Method‘)
plt.show()

X为:

[[0.84223858 1.18059879]
 [0.84834276 0.84499409]
 [1.13263229 1.34316399]
 [0.95487981 0.59743761]
 [0.81646041 1.32361288]
 [0.90405171 0.54047701]
 [1.2723004  1.3461647 ]
 [0.52939142 1.03325549]
 [0.84592514 0.74344317]
 [1.07882783 1.4286598 ]
 [3.71702311 3.97510452]
 [3.95476036 3.83842502]
 [4.4297804  3.91854623]
 [4.08686159 4.15798624]
 [3.90406684 3.84413461]
 [4.32395689 4.06825926]
 [4.23112269 3.78578326]
 [3.70602931 4.08608482]
 [3.58690191 4.37072349]
 [4.38564657 4.02168693]]

随着K的增加,纵轴呈下降趋势且最终趋于稳定,那么拐点肘部处的位置所对应的k 值,不妨认为是相对最佳的类聚数量值。

原文地址:https://www.cnblogs.com/starcrm/p/11725138.html

时间: 2024-11-09 03:01:16

使用肘部法确定k-means均值的k值的相关文章

模式识别:非参数估计法之Parzen窗估计和k最近邻估计

本实验的目的是学习Parzen窗估计和k最近邻估计方法.在之前的模式识别研究中,我们假设概率密度函数的参数形式已知,即判别函数J(.)的参数是已知的.本节使用非参数化的方法来处理任意形式的概率分布而不必事先考虑概率密度的参数形式.在模式识别中有躲在令人感兴趣的非参数化方法,Parzen窗估计和k最近邻估计就是两种经典的估计法. 参考书籍:<模式分类> 作者:RichardO.Duda,PeterE.Hart,DavidG.Stork 一.基本原理 1.非参数化概率密度的估计 对于未知概率密度函

机器学习 —— 基础整理(三):非参数方法——Parzen窗估计、k近邻估计;k近邻分类器

本文简述了以下内容: (一)非参数方法 (二)Parzen窗估计 (三)k近邻估计 (四)k近邻算法(k-nearest neighbor,kNN) (一)非参数方法(Non-parametric method) 对于生成模型来说,重要的地方在于类条件概率密度 $p(\textbf x|\omega_i)$ 的估计.上一篇介绍的参数方法,假定其是一个固定的分布密度形式,然后估计这个显式表达的函数中未知的参数.但这里存在两个问题:首先,假定的形式可能是不准确的,实际数据并不符合这个假设:其次,经典

[Leetcode] Merge k sorted lists 合并k个已排序的链表

Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 思路:这题最容易想到的是,(假设有k个链表)链表1.2合并,然后其结果12和3合并,以此类推,最后是123--k-1和k合并.至于两链表合并的过程见merge two sorted lists的分析.复杂度的分析见JustDoIT的博客.算法复杂度:假设每个链表的平均长度是n,则1.2合并,遍历2n个

Leetcode23---&gt;Merge K sorted Lists(合并k个排序的单链表)

题目: 合并k个排序将k个已排序的链表合并为一个排好序的链表,并分析其时间复杂度 . 解题思路: 类似于归并排序的思想,lists中存放的是多个单链表,将lists的头和尾两个链表合并,放在头,头向后移动,尾向前移动,继续合并,直到头和尾相等,此时已经归并了一半, 然后以同样的方法又重新开始归并剩下的一半.时间复杂度是O(logn),合并两个链表的时间复杂度是O(n),则总的时间复杂度大概是O(nlogn):合并两个单链表算法可以参考Leetcode21中的解法:http://www.cnblo

HDU 5412 CRB and Queries(区间第K大 树套数 按值建树)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5412 Problem Description There are N boys in CodeLand. Boy i has his coding skill Ai. CRB wants to know who has the suitable coding skill. So you should treat the following two types of queries. Query 1:

leetCode 23. Merge k Sorted Lists (合并k个排序链表) 解题思路和方法

Merge k Sorted Lists Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 思路:此题是由合并两个排序链表演化而来,刚开始,想法比较简单,像求最大公共前缀一样,逐一求解:但是最后超时,所以马上意识到出题方是为了使用归并和分治的方法,故重新写了代码. 代码一(超时未过): /** * Definition for singly-link

简单组合java.util.Map&lt;K,V&gt;实现Map&lt;K,P,V&gt;

java.util.Map<K,V>为单键对单值,有时需要双键对单值,因此基于Map<K,V>可以简单实现一个Map<K,P,V>. 接口定义:下载 Java代码 package cc.lixiaohui.demo.javassist.proxy.util; import java.util.Collection; import java.util.Set; /** * 两个键的复合map * <pre> * key------+ *          |-

9.9递归和动态规划(十一)——算出有几种括号的放法可使该表达式得出result值

/** * 攻略:给定一个布尔表达式,由0.1.&.|和^等符号组成,以及一个想要的布尔结果result,实现一个函数,算出有几种括号的放法可使该表达式 * 得出result值. */ 两种方法: 方法一: /** * 思路:迭代整个表达式,将每个运算符当作第一个要加括号的运算符. * @param exp * @param result * @param s:start * @param e:end * @return */ public static int f(String exp,boo

关于组合 C(N, K) = C(N - 1, K) + C(N - 1, K - 1) 的理解

组合的递推公式 C(N, K) = C(N - 1, K) + C(N - 1, K - 1) 等价于 C(N + 1, K + 1) = C(N, K + 1) + C(N, K) ,即K和N分别加1. 通过观察 C(N + 1, K + 1) = C(N, K + 1) + C(N, K) 右边第二项C(N, K)为"在N件中取K件的组合数",左边一项C(N + 1, K + 1)为"在N+1件中取K+1件的组合数",这两项的差C(N, K + 1)为"