Python实现 K-Means聚类(jupyter notebook)

目录

聚类的概念

聚类的要求

应用领域

K-Means

算法步骤

聚类结果性能度量

优点

缺点

代码实现

手写代码

调用sklearn 进行k-means


聚类的概念

  • 聚类是把各不相同的个体分割为有更多相似性子集合的工作。

  • 聚类生成的子集合称为簇

聚类的要求

  • 生成的簇内部的任意两个对象之间具有较高的相似度

  • 属于不同簇的两个对象间具有较高的相异度

聚类与分类的区别在于聚类不依赖于预先定义的类,没有预定义的类和样 本 ——聚类是一种无监督的数据挖掘任务

应用领域

  • 客户价值分析

  • 文本分类

  • 基因识别

  • 空间数据处理

  • 卫星图片分析

  • 数据分析、统计学、机器学习、空间数据库技术、生物学和市场学也推动了聚类分析研究的进展

K-Means

算法步骤

  • 随机选取K个样本作为类中心;

  • 计算各样本与各类中心的距离;

  • 将各样本归于最近的类中心点;

  • 求各类的样本的均值,作为新的类中心;

  • 判定:若类中心不再发生变动或达到迭代次数,算法结束,否则回到第2步。

聚类结果性能度量

内部指标(internal index)

Compactness(紧密性)(CP):各样本到聚类中心的平均距离

  • 每一类样本到样本中心的聚离的均值

    CP_{i}= \frac{1}{|C_{i}|}\sum _{x_{x}\in C_{i}}distf(x_{i}, \mu _{i})

  • 然后求类距离均值的均值

    C P = \frac { 1 } { k } \sum _ { i } C P _ { i }

Separation(间隔性)(SP):各类中心间的平均距离

S P = \frac { 2 } { k ( k - 1 ) } \sum _ {1<i<j<k } d i st ( u _ { i } , u _ { j } )

cp越小越好,sp越大越好(k值越大,即分类越多,cp值越小,所以并不是cp越小越小,要结合实际情况)

优点

  • 算法简单,易于理解

  • 对球形簇样本聚类效果好

  • 分k均值等变种算法运行良好,不受初始化问题的影响。

缺点

  • 不能处理非球形簇、不同尺寸和不同密度的簇

  • 对离群点、噪声敏感

代码实现

手写代码

from sklearn.datasets import load_iris
import numpy as np


iris = load_iris()

data = iris.data
k = 2    #设置聚类中心
n = len(data) 
dist = np.zeros([n,k+1])  


#1.选中心
center = data[:k, :]
center_new = np.zeros([k, data.shape[1]])
while True:
    #2.求距离
    for i in range(n):
        for j in range(k):
            dist[i, j] = np.sqrt(sum((data[i, :] - center[j, :])**2))
        dist[i,k] = np.argmin(dist[i, :k])    #求最小值的位置,并归类

    # 4.求新类中心
    for i in range(k):
        index = dist[:,k] == i   #找到不同类类索引
        center_new[i, :] = data[index, :].mean(axis=0)  #求同类的新样本中心
        
    #5.判定结果    
    if np.all(center == center_new): 
        break
    center = center_new

print(dist)   #查看聚类结果

聚类结果如下:

Python实现 K-Means聚类(jupyter notebook)_第1张图片

 第一列为样本到第一个聚类中心的距离,第二列为样本到第二个聚类中心的距离,第三列为聚类的结果,即距离哪个聚类中心最近的,划分为该类。

调用sklearn 进行k-means

from sklearn.datasets import load_iris
from sklearn.cluster import KMeans


iris = load_iris()
model = KMeans(n_clusters=3).fit(iris.data)
model.labels_            #查看聚类结果

聚类结果如下:

Python实现 K-Means聚类(jupyter notebook)_第2张图片

你可能感兴趣的:(Python,聚类,python,kmeans)