博客
关于我
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/

    你可能感兴趣的文章
    nginx 配置 单页面应用的解决方案
    查看>>
    nginx 配置https(一)—— 自签名证书
    查看>>
    nginx 配置~~~本身就是一个静态资源的服务器
    查看>>
    Nginx 配置清单(一篇够用)
    查看>>
    Nginx 配置解析:从基础到高级应用指南
    查看>>
    nginx+php的搭建
    查看>>
    nginx+tomcat+memcached
    查看>>
    nginx+Tomcat性能监控
    查看>>
    nginx+uwsgi+django
    查看>>
    Nginx-http-flv-module流媒体服务器搭建+模拟推流+flv.js在前端html和Vue中播放HTTP-FLV视频流
    查看>>
    Nginx下配置codeigniter框架方法
    查看>>
    Nginx之二:nginx.conf简单配置(参数详解)
    查看>>
    Nginx代理websocket配置(解决websocket异常断开连接tcp连接不断问题)
    查看>>
    Nginx代理初探
    查看>>
    Nginx代理外网映射
    查看>>
    Nginx代理模式下 log-format 获取客户端真实IP
    查看>>
    Nginx代理静态资源(gis瓦片图片)实现非固定ip的url适配网络环境映射ip下的资源请求解决方案
    查看>>
    Nginx反向代理与正向代理配置
    查看>>
    Nginx多域名,多证书,多服务配置,实用版
    查看>>
    nginx异常:the “ssl“ parameter requires ngx_http_ssl_module in /usr/local/nginx/conf
    查看>>