【机器学习】K均值聚类(K-Means)_吴恩达ML

2023-05-16

声明:本文基于在校课程及吴恩达ML教程,代码参考自多份博客(已在参考链接中表明),如需转载请标明出处。

源代码、实验数据、实验指导书: https://pan.baidu.com/s/1w7y03FAsk1Y6bVNmaYMj6w 提取码: jykt

目录

    • 一、算法描述
    • 二、算法流程
    • 三、K-Means 算法 python 实现
    • 四、吴恩达-机器学习 K-Means 作业实践
      • assignment_1
      • assignment_2
    • 五、参考链接

一、算法描述

K-均值是最普及的聚类算法。

在非监督学习中,数据没有附带任何标签。也就是说,在非监督学习中,将一系列无标签的训练数据,输入到一个算法中,然后让这个算法根据给定的数据 找出这个数据的内在结构。下图上的数据看起来可以分成两个分开的点集(称为簇,cluster),一个能够找到这些点集的算法,就被称为聚类算法(clustering algorithm)。
在这里插入图片描述
聚类就是对大量未知标注的数据集,按数据的内在相似性将数据集划分为多个类别,使类别内的数据相似度较大而类别间的数据相似度较小。

K-均值是一个聚类算法,算法接受一个未标记的数据集 以及 想要获得的组数K,然后算法将数据聚类成 K 个不同的组。

二、算法流程

K-均值是一个迭代算法,假设我们想要将数据聚类成 K 个组,其方法为:

  1. 取得 K 个初始中心点。

选择 K 个初始中心点(可以是指定的,也可以是随机的点),它们被称为聚类中心(cluster centroids

  1. 把每个点划分进相应的簇。

对于数据集中的每一个数据,计算它到 K 个中心点的距离,将其划分进与它距离最近的中心点的簇

  1. 重新计算中心点。

计算每一个组的平均值,将平均值作为该组新的中心点

  1. 迭代至收敛。

重复步骤 2-3 直至中心点不再变化 或 达到最大迭代次数。

三、K-Means 算法 python 实现

import numpy as np


class KMeans():

    def __init__(self, X, K, centroids = None):
        self.X = X
        self.K = K
        self.n_samples, self.dim = X.shape
        self.centers = []
        # 步骤1:取得k个初始中心点
        if centroids != None:
            self.centroids = np.array(centroids, float)
        else :
            seeds = np.random.permutation(self.n_samples)[:K]
            self.centroids = X[seeds]

    def euclDistance(self, vector1, vector2):
        return np.sqrt(sum(np.power(vector2 - vector1, 2)))

    def cluster(self, max_iter):
        clusterRes = np.zeros(self.n_samples)
        self.centers.append(self.centroids.copy())
        for i in range(max_iter):
            clusterChanged = False
            # 步骤2:把每个点划分进相应的簇
            for i in range(self.n_samples):
                minDist = float('inf')
                minIndex = 0
                for j in range(self.K):
                    dist = self.euclDistance(self.centroids[j, :], self.X[i, :])
                    if dist < minDist:
                        minDist = dist
                        minIndex = j
                if clusterRes[i] != minIndex:
                    clusterChanged = True
                    clusterRes[i] = minIndex
            # 步骤4:收敛,中心点不再变化
            if not clusterChanged:
                break;
            # 步骤3:重新计算中心点
            for j in range(self.K):
                pointsInCluster = self.X[np.nonzero(clusterRes == j)[0]]
                self.centroids[j, :] = np.mean(pointsInCluster, axis=0) # 对各列求均值,返回 1*n 矩阵
            self.centers.append(self.centroids.copy())

        return clusterRes

四、吴恩达-机器学习 K-Means 作业实践

  1. ex7data2.m 中的数据进行聚类(K=3)
  2. Kmeans 来进行图片压缩。(在一个简单的24位颜色表示图像。每个像素被表示为三个 8 8 8 位无符号整数(从 0 0 0 255 255 255),指定了红、绿和蓝色的强度值。这种编码通常被称为RGB编码。)给定的图像包含数千种颜色,把颜色的数量减少到 16 16 16 种颜色。把原始图片的每个像素看作一个数据样本,然后利用 K-means 算法去找分组最好的16种颜色。

assignment_1

import scipy.io as scio
import numpy as np
import matplotlib.pyplot as plt
from KMeans import KMeans

# 读取图片数据
data = scio.loadmat('ex7data2.mat')
X = data['X']
STEP = 10

if __name__ == '__main__':
    plt.figure(0)
    plt.title("raw data")
    plt.scatter(X[:, 0], X[:, 1], c='r', marker='o')


    cls = KMeans(X, 3, [[3, 3], [6, 2], [8, 5]])
    clusterRes = cls.cluster(STEP)
    ActualIterNum = np.shape(cls.centers)[0]-1
    plt.figure(1)
    color = ['r', 'g', 'b']
    col = [color[int(i)] for i in clusterRes]
    plt.scatter(X[:, 0], X[:, 1], c='', marker='o', facecolors='none', edgecolors = col)
    for i in range(3):
        plt.plot(np.array(cls.centers)[:, i, 0], np.array(cls.centers)[:, i, 1], 'k', linewidth=1)
        plt.scatter(np.array(cls.centers)[:,i,0], np.array(cls.centers)[:,i,1], color='k', marker='x', s = 50)
    plt.title("initial point: [[3, 3], [6, 2], [8, 5]] | Iteration number %d" %(ActualIterNum))


    cls = KMeans(X, 3)
    clusterRes = cls.cluster(STEP)
    ActualIterNum = np.shape(cls.centers)[0]-1
    plt.figure(2)
    color = ['r', 'g', 'b']
    col = [color[int(i)] for i in clusterRes]
    plt.scatter(X[:, 0], X[:, 1], c='', marker='o', facecolors='none', edgecolors=col)
    for i in range(3):
        plt.plot(np.array(cls.centers)[:, i, 0], np.array(cls.centers)[:, i, 1], 'k', linewidth=1)
        plt.scatter(np.array(cls.centers)[:, i, 0], np.array(cls.centers)[:, i, 1], color='k', marker='x', s=50)
    plt.title("Random initial point | Iteration number %d" %(ActualIterNum))


    plt.show()
  • 参数设置
    聚类组数:K = 3
    给定初始点的情况:[[3, 3], [6, 2], [8, 5]]
    最大迭代次数:STEP = 10

  • 原始数据图
    在这里插入图片描述

  • 给定初始点 [[3, 3], [6, 2], [8, 5]] 最大迭代 10 次的聚类结果图
    在这里插入图片描述
    迭代 6 6 6 次后,第 7 7 7 次聚类结果与第 6 6 6 次结果完全相同,中心点不会再变化,故停止迭代,所以上图仅有 7 7 7 个 x 点(包含 1 1 1 个初始点,和 6 6 6 次迭代得到的中心点)。

  • 随机取初始聚类中心点,收敛时的结果图
    在这里插入图片描述

assignment_2

import scipy.io as scio
import skimage
from skimage import io
import numpy as np
import matplotlib.pyplot as plt
from KMeans import KMeans

# 读取图片数据
data = scio.loadmat('bird_small.mat')
A = data['A'] # A.shape (128, 128, 3)
# A = skimage.io.imread('bird_small.png')
STEP = 1000

if __name__ == '__main__':
    plt.figure(0)
    plt.title("Original Image")
    plt.imshow(A)
    plt.axis('off')


    X = A.reshape(-1, 3)
    X = X/255 # 防止最后得到的中心点是小数,压缩后的像素值都是小数,无法展示
    K = 16
    cls = KMeans(X, K)
    clusterRes = cls.cluster(STEP)
    ActualIterNum = np.shape(cls.centers)[0]-1 # 实际迭代次数
    centroids = cls.centroids # 聚类中心
    compressedImage = np.zeros(X.shape)
    for i in range(len(centroids)):
        compressedImage[i == clusterRes] = centroids[i]
    compressedImage = compressedImage.reshape(A.shape)
    plt.figure(1)
    plt.title("Compressed with %d colors | Iteration number %d" %(K, ActualIterNum))
    plt.imshow(compressedImage)
    plt.axis('off')


    plt.show()
  • 参数设置
    聚类组数:K = 16
    给定初始点的情况:随机初始点
    最大迭代次数:STEP = 1000

  • 原始图像
    在这里插入图片描述

  • 使用 KMeans 压缩并重构的图像
    在这里插入图片描述

  • 原始图像与使用 KMeans 压缩成 16 16 16 种颜色的重构图像并排对比
    在这里插入图片描述

五、参考链接

  1. 吴恩达机器学习作业Python实现(七):K-means和PCA主成分分析
  2. 机器学习算法与Python实践之(五)k均值聚类(k-means)
  3. scikit-learn/sklearn/cluster/k_means_.py
  4. 【数字的可视化:python画图之散点图sactter函数详解】
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【机器学习】K均值聚类(K-Means)_吴恩达ML 的相关文章

  • Aarch64安装Anaconda Pytorch Torchvision

    1 Anaconda wget https github com Archiconda build tools releases download 0 2 3 Archiconda3 0 2 3 Linux aarch64 sh sudo
  • 扩大VMWARE里面虚拟硬盘大小(*.vmdk)

    http blog csdn net bshawk archive 2008 01 28 2070587 aspx 最近编译2 6 22的内核时 xff0c 发现虚拟机器FC6硬盘空间不够了 xff0c 于是乎 xff0c 想扩展下硬盘的大
  • c#加载xml文件

    C 加载xml文件 XmlDocument xmlDoc 61 new XmlDocument xmlDoc Load Application StartupPath 43 34 34 43 34 xml xml 34 加载xml文件 Xm
  • zram

    wiki zram是Linux内核的一个模块 xff0c 之前被称为 compcache zram通过在RAM内的压缩块设备上分页 xff0c 直到必须使用硬盘上的交换空间 xff0c 以避免在磁盘上进行分页 xff0c 从而提高性能 由于
  • 英飞凌 AURIX 系列单片机的HSM详解(2)——与HSM相关的UCB和寄存器

    本系列的其它几篇文章 xff1a 英飞凌 AURIX 系列单片机的HSM详解 xff08 1 xff09 何为HSM 英飞凌 AURIX 系列单片机的HSM详解 xff08 2 xff09 与HSM相关的UCB和寄存器 英飞凌 AURIX
  • MySQL数据库知识点总结

    1 什么是 MySQL MySQL 是 种关系型数据库 xff0c 在 Java 企业级开发中 常常 xff0c 因为 MySQL 是开源免费的 xff0c 并 且 便扩展 阿 巴巴数据库系统也 量 到了 MySQL xff0c 因此它的稳
  • 论文笔记-Towards Scene Understanding-Unsupervised Monocular Depth Estimation

    论文信息 标题 xff1a Towards Scene Understanding Unsupervised Monocular Depth Estimation with Semantic aware Representation作者 x
  • 结合 Casbin 对 http 请求做 RBAC 鉴权以及添加请求路由参数支持

    目录 总结 背景 实操 安装 Casbin 创建一个 Casbin 模型 创建一个 Casbin 策略 加载 Casbin 模型和策略并创建一个路由 总结 在本文中 xff0c 我们将介绍如何结合 Casbin 对 HTTP 请求进行基于角
  • Git—— master|RELEASE1/1

    当提交代码时 xff0c 多人合作避免不了要冲突 公司就我一个前端 xff0c 所以我一般情况下几乎不习惯pull代码 记录一下今天的执行过程 1 在vscode工具中操作更新的代码 2 在Git Bash中push 代码 span cla
  • 【FPGA】Mint20.3系统安装VCS2018环境

    mint系统是目前新手入手linux系统最为容易的系统版本 xff0c 其界面与Windows系统高度重合 vcs是IC开发常用的系统仿真工具 xff0c 但vcs工具的安装是一个很头疼的事情 xff0c 本篇展现在mint20 3系统安装
  • kubernetes使用flannel网络插件服务状态显示CrashLoopBackOff

    使用Kubeadm安装K8s集群 xff0c 在安装flannel网络插件后 xff0c 发现pod kube flannel ds 一直是CrashLoopBackOff 报错内容如下 xff1a log is DEPRECATED an
  • 用Python写了个金融数据爬虫,半小时干了全组一周的工作量

    最近 xff0c 越来越多的研究员 基金经理甚至财务会计领域的朋友 xff0c 向小编咨询 xff1a 金融人需要学Python么 xff1f 事实上在2019年 xff0c 这已经不是一个问题了 Python已成为国内很多顶级投行 基金
  • SSIS_数据流转换(Union All&合并联接&合并)

    Union All xff1a 与sql语言 Union All 一样 xff0c 不用排序 xff0c 上下合并多个表 Union All转换替代合并转换 xff1a 输入输出无需排序 xff0c 合并超过两个表 合并联接 xff1a 有
  • LACP协议:链路聚合/华为交换机LACP

    链路聚合的3种模式 61 61 61 61 61 gt 手工聚合 静态聚合 动态聚合 手工聚合 xff1a 手工汇聚概述 xff1a 手工负载分担模式是一种最基本的链路聚合方式 xff0c Eth Trunk 接口的建立 xff0c 成员接
  • Pytorch中Tensor和numpy数组的互相转化

    Pytorch中Tensor和Numpy数组的相互转化分为两种 xff0c 第一种转化前后的对象共享相同的内存区域 xff08 即修改其中另外一个也会改变 xff09 xff1b 第二种是二者并不共享内存区域 共享内存区域的转化 这种涉及到
  • #51单片机# 用中断实现蜂鸣器

    蜂鸣器常作为提示音 xff0c 用于计算机 打印机 万用表等设备中 提示音一般很简单 xff0c 能响就行 某单片机的蜂鸣器原理图 xff1a 该单片机的CPU原理图 xff1a 下面这段程序用到了中断的算法 xff0c 实现了蜂鸣器在4k
  • VM跨主机通信ovs配置

    如果位于不同物理主机上的两个VM需要通信 xff0c 那么底层的虚拟交换机ovs需要配置tunnel端口 OVS中支持添加隧道 Tunnel 端口 xff0c 常见隧道技术有两种gre或vxlan 隧道技术是在现有的物理网络之上构建一层虚拟
  • 免受 DDoS 攻击的五种技术

    尽管 DDoS 攻击很可怕 xff0c 但好消息是它们很容易预防 本节将讨论保护您的业务免受 DDoS 攻击的五种技术 一 高质量的网络硬件 高质量的网络基础设施可以帮助您检测甚至阻止网站流量的恶意增加 网络硬件包括路由器 用于连接设备的电
  • Failed to connect to /XXXfor block, add to deadNodes and continue. java.net.NoRouteToHostException:

    15 10 09 00 18 18 INFO DFSClient Could not obtain BP 1056880277 192 168 1 101 1444127746416 blk 1073741825 1001 from any
  • 手动编写 Makefile文件

    说明 xff1a 在我的学习过程中看过很多makefile 文件的编写的文章 xff0c 很多的文章对于初学者来说还有点不是很明白 xff0c 我看到陈皓的这篇文章写的还是很好的 xff0c 我把它放在我的blog里 xff0c 以便能够在

随机推荐