关于聚类问题的算法python代码实现-K-均值聚类方法

聚类含义

定义:聚类,也叫做聚类分析,依据对象的属性,将相似的对象归位一类。聚类,就是寻找发生数据之间内在联系的方法。
分类:从聚类的类型来讲,一般有结构性聚类、分散性聚类、密度聚类等。

  • 结构性聚类是指,可以从上至下或者从下至上双向进行计算。从下至上是以单个对象开始,不断与周围相近的对象进行融合,最终将全部数据分成多种类别。而从上至下算法则恰恰相反,它先将全部数据当作一个整体,然后逐渐分小。在结构性聚类中,我们的重要依据为距离。一般情况下,我们会使用欧式距离,或者曼哈顿距离来测量两个对象之间的相似程度。
  • 与结构性聚类不同,分散性聚类会一次性确定所有类别。
  • 度聚类的主要特点为将测算距离改为计算密度。

聚类vs分类:一般来讲,在一个机器学习任务或者数据分析实例中,我们会先采用聚类算法对数据进行处理。使用聚类算法对历史数据处理之后,就可以人为的给每一种类别打上标签。而这些存在标签的数据,就可以被应用到下一步的分类学习中。简而言之、在执行聚类之前,我们的数据没有任何类别可言。但在执行分类之前,我们应该已经有了类别,才能对新数据进行分类。
在这里插入图片描述

K-均值聚类

K-均值聚类(又叫 K-Means 聚类)是最常用的聚类方法之一。从它的名字来讲,K 代表最终将全部样本数据集和聚为 K 个类别。而「均值」代表在聚类的过程中,我们计算聚类中心点的特征向量时,需要采用求相邻样本点特征向量均值的方式进行。

例如,我们将 𝑋1=(𝑥1,𝑦1) , 𝑋2=(𝑥2,𝑦2) , 𝑋3=(𝑥3,𝑦3) 聚为一类时,中心点坐标 𝑂(𝑜1,𝑜1) 为: 𝑜1=(𝑥1+𝑥2+𝑥3)/3 , 𝑜2=(𝑦1+𝑦2+𝑦3)/3 。

聚类三步:
第一步:选择聚类数量,也就是 𝑘 值的大小。
第二步:实施聚类算法,k-均值等。
第三步:对聚类结果进行人工标注和分析。

K-均值聚类步骤
1.人为确定 𝑘 值的大小,也就是聚类的数量。然后,我们会使用一种叫 Forgy 的方法初始化聚类,Forgy 也就是随机地从数据集中选择 𝑘 个观测作为初始的均值点。例如,下图中,我们定 𝑘=3 ,然后随机选择 3 个数据点初始化聚类。
在这里插入图片描述
2.以这三个样本点(红色)为基准,将剩余的数据点按照与其距离最近的标准进行类别划分。
在这里插入图片描述
3.就得到了通过绿色线条划分的 A,B,C 三个区域。下面求解各区域中数据点集的中心点,这一步也就是更新。然后得到三个紫色中心点。重复上面的步骤,得到由黄色线条划分的 D, E, F 三个区域。
在这里插入图片描述
4.重复上面的步骤,直到三个区域的中心点变化非常小或没有变化时,终止迭代。最终,就将全部数据划分为 3 了类别。

K值选择
K值不能人为随便确定
K-Means 聚类中,我们一般通过计算轮廓系数,来确定 𝑘 值的大小。轮廓系数(Silhouette Coefficient),是聚类效果好坏的一种评价方式。轮廓系数结合内聚度(Cohesion)和分离度(Separation)两种因素,可以用来在相同原始数据的基础上用来评价不同算法、或者算法不同运行方式对聚类结果所产生的影响。

对于某一点 𝑖 ,我们用 𝑎(𝑖) 表示 𝑖 距离同类中其它点之间的距离的平均值,而 𝑏(𝑖) 表示 𝑖 到所有非同类点的平均距离,然后取最小值。于是, 𝑖 的轮廓系数计算如下:在这里插入图片描述

然后,我们计算数据集中所有点的轮廓系数,最终以平均值作为当前聚类的整体轮廓系数。整体轮廓系数介于 [−1,1] ,越趋近于 1 代表聚类的效果越好。

案例实现:数据用数据源里的three_class_data.csv

import pandas as pd
# 导入数据
data = pd.read_csv(
    "http://labfile.oss.aliyuncs.com/courses/764/three_class_data.csv", header=0)
data.head()

#计算k取2-12的轮廓系数
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
from matplotlib import pyplot as plt
%matplotlib inline

X = data[["x", "y"]]
score = []
for i in range(10):
    model = KMeans(n_clusters=i+2)
    model.fit(X)
    score.append(silhouette_score(X, model.labels_))  #计算轮廓系数
    
plt.figure(figsize=(11, 5))
plt.subplot(1, 2, 1)
p
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值