首页 > 编程语言 >【算法】K-means 算法学习

【算法】K-means 算法学习

时间:2023-12-20 15:33:09浏览次数:31  
标签:dist means centroids label 学习 cluster 算法 聚类 data

from numpy import *
import pandas as pd
import matplotlib.pyplot as plt

# 计算两点之间的欧式距离
def dist(a, b):
    return sqrt(sum((a - b) ** 2))

# 生成聚类中心
def create_center(data, k, defaultPts=[0,3,6]):
    # 固定的几个点作为聚类中心
    if defaultPts is not None:
        # 存在默认点
        pt = zeros((k, n), dtype=float64)
        # 使用默认点作为聚类中心
        for i in range(k):
            dpt = defaultPts[i]
            if dpt is None:
                # 如果没有默认点,则随机选取一个点作为聚类中心
                dpt = random.randint(0, len(data) - 1)
            pt[i] = data[dpt]
        return pt
    # 随机选取k个数据作为聚类中心
    return data[random.randint(0, len(data) - 1, k)]

# 聚类
def kMeans(data, k, dist, centroids):
    # 样本个数
    m = shape(data)[0]

    # 聚类结果
    init = zeros((m, 2), dtype=float64)
    # 存储中间结果的矩阵
    cluster_assment = mat(init)

    for epoch in range(1):
        for i in range(m):
            # 计算每个样本到最近的聚类中心的距离
            min_dist = inf
            for j in range(k):
                # 计算样本到聚类中心的距离
                dist_ij = dist(data[i], centroids[j])
                # 找到最近的聚类中心
                if dist_ij < min_dist:
                    min_dist = dist_ij
                    # 更新样本所属的聚类中心,第1列为聚类中心的序号,第2列为距离
                    cluster_assment[i] = j, min_dist

    # 对所有节点聚类之后,重新更新中心
    for j in range(k):
        pts_in_cluster = data[nonzero(cluster_assment[:, 0].A == j)[0]]
        centroids[j,:] = mean(pts_in_cluster, axis=0)

    # 返回聚类中心和聚类结果
    return centroids, cluster_assment


if __name__ == '__main__':
    # 数据集
    data = array([[2, 10], [2,5], [8, 4], [5, 8], [7, 5], [6, 4], [1, 2], [4, 9]])

    # 聚类个数
    k = 3
    # 特征个数
    n = 2

    # 聚类
    centroids, cluster_assment = kMeans(data, k, dist=dist, centroids=create_center(data, k))

    # 聚类结果
    predict_label = cluster_assment[:, 0]
    # 给样本增加一列,表示样本所属的聚类结果
    data_and_pred = column_stack((data, predict_label))

    # 原始的数据样本和预测出来的类别
    df = pd.DataFrame(data_and_pred, columns=['x1', 'x2', 'label'])
    df0 = df[df['label'] == 0].values
    df1 = df[df['label'] == 1].values
    df2 = df[df['label'] == 2].values

    # 画图
    plt.scatter(df0[:, 0], df0[:, 1], c='turquoise', marker='o', label='L0')
    plt.scatter(df1[:, 0], df1[:, 1], c='g', marker='*', label='L1')
    plt.scatter(df2[:, 0], df2[:, 1], c='b', marker='+', label='L2')
    plt.scatter(centroids[:, 0].tolist(), centroids[:, 1].tolist(), c='r', marker='x')
    # 图例位置
    plt.legend(loc=1)
    # 显示图
    plt.show()

标签:dist,means,centroids,label,学习,cluster,算法,聚类,data
From: https://www.cnblogs.com/yangyxd/p/17916617.html

相关文章

  • 羚通视频智能分析平台视频监控算法分析玩手机打电话检测
    在当今数字化时代,视频监控技术已经广泛应用于我们生活的各个领域。然而,传统的视频监控方式往往需要大量的人力进行监控和分析,这不仅效率低下,而且容易出错。为了解决这个问题,羚通公司推出了一款全新的视频智能分析平台,该平台利用先进的视频监控算法,可以实时检测并分析手机打电话的......
  • 《算法、C++、Linux、Android》
    ......
  • 羚通视频智能分析平台视频监控算法分析玩手机打电话检测
    在当今数字化时代,视频监控技术已经广泛应用于我们生活的各个领域。然而,传统的视频监控方式往往需要大量的人力进行监控和分析,这不仅效率低下,而且容易出错。为了解决这个问题,羚通公司推出了一款全新的视频智能分析平台,该平台利用先进的视频监控算法,可以实时检测并分析手机打电话的行......
  • python 数据结构与算法知识图
    1.算法思想:递归、分治(归并排序、二分查找、快速排序)、贪心(贪心策略排序+当前最优)、动态规划(最优子结构+递推式)、回溯(解空间:排列树+子集树、深度搜索+剪枝)、分支限界(解空间:排列树+子集树、广度搜索+剪枝))2.排序算法:(low:冒泡、插入、选择;mid:快排、归并、堆排(完全二叉树),其他:桶排序、基......
  • Java学习之apache poi操作Excel文件
    创建Java项目,然后加入Maven依赖如下:读取指定的Excel文件写入既存的Excel文件 创建新的Excel,添加文件内容......
  • 2023最新初级难度算法面试题,包含答案。刷题必备!记录一下。
    好记性不如烂笔头内容来自面试宝典-初级难度算法面试题合集问:什么是排序?说出常见的排序算法有哪几种?排序是计算机科学中的一种基本操作,它将一组数据按照某种顺序进行排列。排序算法是实现排序过程的具体方法。常见的排序算法有多种,它们可以根据不同的数据结构、时间复杂......
  • 【前端VUE】VUE通信组件学习(附源代码)
    propsprops可以实现父子组件通信,不管是在vue2或者vue3,props数据还是只读的!!!不能直接修改其值;在vue3中,我们可以通过defineProps获取父组件传递的数据,且在组建内部不需要引入defineProps方法可以直接使用,如下面例子Parent.vue//父组件<template><h3>props组件案例</h3......
  • 【转载】Redis 6.x 学习笔记
    参考http://www.redis.cn/https://www.runoob.com/redis/redis-data-types.htmlhttps://developer.aliyun.com/article/1095427https://zhuanlan.zhihu.com/p/445885116https://blog.csdn.net/liu_dongdong55/article/details/120881332https://blog.csdn.net/weixin_435......
  • 详解十大经典排序算法(五):归并排序(Merge Sort)
    算法原理归并排序的核心思想是将一个大的数组分割成多个小的子数组,然后分别对这些子数组进行排序,最后将排序后的子数组合并起来,得到一个有序的大数组。算法描述归并排序(MergeSort)是一种经典的排序算法,其原理基于分治(DivideandConquer)策略。它的核心思想是将一个大问题分割成多个......
  • 详解十大经典排序算法(四):希尔排序(Shell Sort)
    算法原理希尔排序是一种基于插入排序的排序算法,也被称为缩小增量排序。它通过将待排序的序列分割成若干个子序列,对每个子序列进行插入排序,然后逐步缩小增量,最终使整个序列有序。算法描述希尔排序(ShellSort)是一种基于插入排序的算法,由DonaldShell于1959年提出。它是插入排序的一种......