博客
关于我
python机器学习之手写K-means算法
阅读量:228 次
发布时间:2019-03-01

本文共 2308 字,大约阅读时间需要 7 分钟。

K-means聚类算法实现

1. K-means算法原理

K-means是一种经典的无监督学习算法,广泛应用于数据聚类任务。其核心思想如下:

  • 初始化中心点:从数据集中随机选取K个点作为初始聚类中心。
  • 计算距离并归类:计算数据点到各个中心点的欧氏距离,将每个点归类到距离最近的中心点所在的类别中。
  • 更新中心点:计算每个类别的平均值,作为新的聚类中心。
  • 迭代优化:重复上述过程,直到中心点的变动很小或不再变化。
  • 2. 算法实现步骤

    2.1 函数定义

    import numpy as npimport pandas as pdfrom matplotlib import pyplot as pltdef distance(a, b):    """计算两点之间的欧式距离"""    return np.sqrt((a[0] - b[0])**2 + (a[1] - b[1])**2)def init_centers(k):    """初始化K个2维聚类中心点"""    return np.random.random(k*2).reshape(k, 2)def assign_cluster(point, centers):    """确定点所属的聚类"""    kclass = 0    min_distance = np.inf    for i, center in enumerate(centers):        d = distance(point, center)        if d < min_distance:            min_distance = d            kclass = i    return kclassdef update_centers(points, kclasses):    """更新聚类中心点"""    k = max(kclasses) + 1    new_centers = np.zeros((k, 2))    point_df = pd.DataFrame(points, columns=["x", "y"])    kclasses_df = pd.DataFrame(kclasses, columns=["kclass"])    points_with_class = point_df.join(kclasses_df)    for i in range(k):        mask = points_with_class["kclass"] == i        subset = points_with_class[mask]        new_centers[i] = subset[["x", "y"]].mean(axis=0)    return new_centersdef kmeans(points, k):    """执行K-means算法"""    centers = init_centers(k)    kclasses = np.zeros(len(points))        for _ in range(200):        new_centers = update_centers(points, kclasses)        if np.array_equal(kclasses, new_centers Classes):            break        centers = new_centers        kclasses = assign_cluster(points, centers)        return centers, kclasses

    2.2 算法流程

  • 初始化:调用init_centers(k)函数,随机生成K个初始中心点。
  • 归类:调用assign_cluster(point, centers)函数,计算每个点到各中心点的距离,确定其所属聚类。
  • 更新中心点:调用update_centers(points, kclasses)函数,计算每个聚类的平均值,作为新的聚类中心。
  • 迭代优化:在200次循环内,重复归类和更新中心点,直到聚类结果稳定。
  • 3. 测试结果

    # 示例数据c = np.array([    [1, 2],    [1, 1],    [2, 2],    [5, 5],    [-0.10, -2.10],    [-0.8, -1.8],    [-2.9, -0.9],    [-3.1, -2.2],    [2, 6],    [7, 10]])# 运行K-means算法a, b = kmeans(c, 2)# 绘制结果c_df = pd.DataFrame(c)plt.plot(c_df[0], c_df[1], 'or')plt.plot(a[0], a[1], 'xb')plt.show()

    4. 代码说明

    • distance函数:计算两个点之间的欧式距离。
    • init_centers函数:生成K个随机的初始中心点。
    • assign_cluster函数:确定数据点所属的聚类,基于最小欧氏距离。
    • update_centers函数:计算每个聚类的平均值,更新聚类中心。
    • kmeans函数:实现K-means算法的主函数,包含初始化、迭代优化等逻辑。

    通过上述实现,可以清晰地看到K-means算法的工作原理和实际应用,适用于各种二维数据的聚类任务。

    转载地址:http://hjpv.baihongyu.com/

    你可能感兴趣的文章
    npm安装crypto-js 如何安装crypto-js, python爬虫安装加解密插件 找不到模块crypto-js python报错解决丢失crypto-js模块
    查看>>
    npm安装教程
    查看>>
    npm报错Cannot find module ‘webpack‘ Require stack
    查看>>
    npm报错Failed at the node-sass@4.14.1 postinstall script
    查看>>
    npm报错fatal: Could not read from remote repository
    查看>>
    npm报错File to import not found or unreadable: @/assets/styles/global.scss.
    查看>>
    npm报错unable to access ‘https://github.com/sohee-lee7/Squire.git/‘
    查看>>
    npm淘宝镜像过期npm ERR! request to https://registry.npm.taobao.org/vuex failed, reason: certificate has ex
    查看>>
    npm版本过高问题
    查看>>
    npm的“--force“和“--legacy-peer-deps“参数
    查看>>
    npm的安装和更新---npm工作笔记002
    查看>>
    npm的常用配置项---npm工作笔记004
    查看>>
    npm的问题:config global `--global`, `--local` are deprecated. Use `--location=global` instead 的解决办法
    查看>>
    npm编译报错You may need an additional loader to handle the result of these loaders
    查看>>
    npm设置淘宝镜像、升级等
    查看>>
    npm设置源地址,npm官方地址
    查看>>
    npm设置镜像如淘宝:http://npm.taobao.org/
    查看>>
    npm配置安装最新淘宝镜像,旧镜像会errror
    查看>>
    NPM酷库052:sax,按流解析XML
    查看>>
    npm错误 gyp错误 vs版本不对 msvs_version不兼容
    查看>>