机器学习基础篇:K-Means聚类分析

机器学习基础篇:K-Means聚类分析


常用的聚类分析算法

算法名称算法描述
K-MeansK-均值聚类也称为快速聚类法,在最小化误差函数的基础上将数据划分为预定的类数K。该算法原理简单并便于处理大量数据
K-中心点-
系统聚类-

K-Means聚类算法

基于距离的非层次聚类算法,在最小化误差函数的基础上将数据划分为预定的类数K,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。

1、算法过程

  1. 从N个样本数据中心随机选取K个对象作为初始的聚类中心
  2. 粉笔额计算每个样本到各个聚类中心的距离
  3. 所有对象分配完成后,重新计算K个剧烈的中心
  4. 与前一次计算得到的K个聚类中心比较,如果聚类中心发生变化,转过程2,否则转过程5
  5. 当质心不发生变化时停止并输出聚类结果

2、数据类型与相似性的度量

  1. 连续属性
    对于连续属性,要先对各属性值进行零-均值规范,再进行距离的计算。在K-Means聚类算法中,一般要度量样本之间的距离、样本与簇之间的距离以及簇之间的距离;
    度量样本之间的相似性最常用的是欧几里得距离、曼哈顿距离和闵可夫斯基距离;
  2. 文档数据
    对于文档数据使用余弦相似性度量,先将文档数据整理成文档-词矩阵格式
lostwinteamcoach
文档一142808
文档二234116

两个文档之间的相似度计算公式为:
d(i,j) = cos(i,j)=向量i*向量j/|向量i||向量j|

  1. 目标函数
    使用误差平方和SSE作为度量聚类质量的目标函数,对于两种不同的聚类结果,选择误差评分和较小的分类结果。
  2. 聚类代码

来源:【资源】Python机器学习算法的简单Python实现 - 上传者:weixin_39840914

导入库及初始化数据集

import numpy as np
import matplotlib.pyplot as plt
import random
from sklearn.datasets import make_blobs
np.random.seed(123)

%matplotlib inline
X, y = make_blobs(centers=4, n_samples=1000) #生成聚类算法的测试数据,1000个样本
print(f'Shape of dataset: {X.shape}')

fig = plt.figure(figsize=(8,6))
plt.scatter(X[:,0], X[:,1], c=y)
plt.title("Dataset with 4 clusters")
plt.xlabel("First feature")
plt.ylabel("Second feature")
plt.show()

在这里插入图片描述

K-Means类实现

class KMeans():
    def __init__(self, n_clusters=4):
        self.k = n_clusters

    def fit(self, data):
        """
        将k-means模型拟合到给定的数据集
        """
        n_samples, _ = data.shape
        # 初始化群集中心
        self.centers = np.array(random.sample(list(data), self.k)) #随机打乱
        self.initial_centers = np.copy(self.centers)

        #我们将跟踪数据点的分配是否正确
        #对群集的访问已更改。如果它停止改变,我们就是
        #完成模型拟合
        old_assigns = None
        n_iters = 0

        while True:
            new_assigns = [self.classify(datapoint) for datapoint in data]

            if new_assigns == old_assigns:
                print(f"训练结束后 {n_iters} 迭代!")
                return

            old_assigns = new_assigns
            n_iters += 1

            # 重新计算中心
            for id_ in range(self.k):
                points_idx = np.where(np.array(new_assigns) == id_)
                datapoints = data[points_idx]
                self.centers[id_] = datapoints.mean(axis=0)

    def l2_distance(self, datapoint):
        dists = np.sqrt(np.sum((self.centers - datapoint)**2, axis=1))
        return dists

    def classify(self, datapoint):
        """
        给定一个数据点,计算最靠近
        数据点。返回该群集的群集ID。
        """
        dists = self.l2_distance(datapoint)
        return np.argmin(dists)

    def plot_clusters(self, data):
        plt.figure(figsize=(12,10))
        plt.title("初始中心为黑色,最终中心为红色")
        plt.scatter(data[:, 0], data[:, 1], marker='.', c=y)
        plt.scatter(self.centers[:, 0], self.centers[:,1], c='r')
        plt.scatter(self.initial_centers[:, 0], self.initial_centers[:,1], c='k')
        plt.show()

初始化和拟合模型

kmeans = KMeans(n_clusters=4)
kmeans.fit(X)

绘制初始和最终聚类中心

kmeans.plot_clusters(X)

在这里插入图片描述

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值