☀️机器学习入门☀️图解k-means聚类算法|附加小练习(代码片段)

小生凡一 小生凡一     2023-01-01     763

关键词:

物以类
经典的无监督学习算法 ——K-Means聚类算法

1. K-Means 定义

K-means聚类算法首先是随机选取K个对象作为初始的聚类中心,然后计算每个样本与各个聚类中心之间的距离,把每个样本分配给距离它最近的聚类中心。

聚类中心以及分配给它们的对象就代表一个聚类。每分配一次样本,聚类的聚类中心会根据聚类中现有的对象被重新计算。这个过程将不断重复直到满足某个终止条件。

终止条件可以是没有(或最小数目)样本被重新分配给不同的聚类,没有(或最小数目)聚类中心再发生变化,误差平方和局部最小。

2. K-Means 步骤

理论:
1 . 随机生成K个聚类中心。
2 .计算每个样本与每一个聚类中心的距离(欧式距离),离哪个聚类中心近,就划分到哪个聚类中心所属的集合当中。
3 .重新计算每个集合的聚类中心。
4 .重复2,3步直到收敛。
5 .返回所有的聚类标签。

图解K-Means:

数据集采用的是make_blobs

① 设置K=2,第一次随机划分了两个聚类,可以看出是非常不平衡的!还没有收敛~

② 计算每个样本与这两个聚类中心的距离(欧式距离),离哪个聚类中心近,就划分到哪个聚类中心所属的集合当中。

  • 如果这个样本点到两个聚类中的距离都是相等的话,就会随机分配到其中一类。
  • 那么当这次聚类结束后,两个聚类会重新进行聚类中心点的计算,聚类中心就会改变。
  • 那么下一次进行样本点聚类中心点聚类计算的时候,这个样本点该划分到哪一类就会是哪一类。
  • 也就是说这个随机是不影响最终聚类结果的。

可以换个参考系想想,这两个聚类中心点不断在找自己的样本,就算中间过程中找错了,也不会影响最终的结果,他该有哪些样本点还是哪些样本点

③ 当划分完这一次所有样本点到各个聚类中心之后(即哪个样本点离哪个聚类中心近,就分到哪个聚类中心的集合),重新计算聚类中心的位置,即是黑色点的位置。

下图,红色点是没有计算的,就是上一次的聚类中心点,所以紫色的样本点都是距离右边的红点近的,黄色的样本点都是距离左边的红点近的,黑色点是重新计算后的

然后就通过这个重新计算后的黑色点,继续计算各个样本点到这个黑色点的距离,离左边的聚类中心近的就是黄色区域,离右边聚类中心点近的就是属于右边的一类。

可以看一下这一次聚类的过程: 一共迭代了15次才收敛

3. K-Means 和 KNN 对比

名称K-MeansKNN
训练类型无监督学习监督学习
计算样本范围全局计算邻居之间的局部计算
K的含义K个聚类K个近邻
最终结果只能知道是哪一类,不知道这个类的标签明确知道了最后分类之后的标签类别
优点原理比较简单,实现也是很容易,收敛速度快简单好用,容易理解,精度高,理论成熟,既可以用来做分类也可以用来做回归
缺点对K的取值、样本分布非常敏感样本不平衡问题(即有些类别的样本数量很多,而其它样本的数量很少)

下面两张图来自B站Up五分钟机器学习

4. 小练习

4.1 第一题

Sklearn中的make_circles方法生成数据,用K-Means聚类并可视化。

"""
Sklearn中的make_circles方法生成数据,用K-Means聚类并可视化。
"""
from sklearn.cluster import KMeans
from sklearn.datasets import make_circles
import matplotlib.pyplot as plt
from ex1.clustering_performance import clusteringMetrics  # 导入的老师写的库

fig = plt.figure(1, figsize=(10, 5))
X1, y1 = make_circles(n_samples=400, factor=0.5, noise=0.1)
plt.subplot(121)
plt.title('original')
plt.scatter(X1[:, 0], X1[:, 1], c=y1)
plt.subplot(122)
plt.title('K-means')
kms = KMeans(n_clusters=2, max_iter=400)  # n_cluster聚类中心数 max_iter迭代次数
y1_sample = kms.fit_predict(X1, y1)  # 计算并预测样本类别
centroids = kms.cluster_centers_
plt.scatter(X1[:, 0], X1[:, 1], c=y1_sample)
plt.scatter(centroids[:, 0], centroids[:, 1], s=30, marker='*', c='b')

print(clusteringMetrics(y1, y1_sample))
plt.show()

4.2 第二题

Sklearn中的make_moons方法生成数据,用K-Means聚类并可视化。

"""
Sklearn中的make_moons方法生成数据,用K-Means聚类并可视化。
"""
import numpy as np
import matplotlib.pyplot as plt
import sklearn.datasets as datasets


def create_data():
    X, y = datasets.make_moons(n_samples=400, noise=0.1)
    return X, y

def init_centers(data, k):
    m, n = data.shape
    # m 样本个数,n特征个数
    center_ids = np.random.choice(m, k)
    centers = data[center_ids]
    return centers

def cal_dist(ptA, ptB):
    return np.linalg.norm(ptA - ptB)

def kmeans_process(data, k):
    centers = init_centers(data, k)
    m, n = data.shape
    keep_changing = True
    pred_y = np.zeros((m,))
    iteration = 0
    while keep_changing:
        keep_changing = False
        # 计算剩余样本所属类别
        for i in range(m):
            min_distance = np.inf
            for center in range(k):
                distance = cal_dist(data[i, :], centers[center, :])
                if distance < min_distance:  # 判断离哪个更近
                    min_distance = distance
                    idx = center  # 类别换下
            if pred_y[i] != idx:  # 判断是否发生了改变
                keep_changing = True
            pred_y[i] = idx
        # 更新类别中心点坐标
        for center in range(k):
            cluster_data = data[pred_y == center]
            centers[center, :] = np.mean(cluster_data, axis=0)  # 求相同类别数据点的质心点
        print(centers)
        plt.clf()
        plt.title(f'iteration: iteration')
        plt.scatter(X[:, 0], X[:, 1], s=30, c=pred_y)
        plt.scatter(centers[:, 0], centers[:, 1], s=100, c='k')
        plt.pause(1)
        iteration += 1
    return centers, pred_y

if __name__ == '__main__':
    X, y = create_data()
    plt.ion()
    centers, pred_y = kmeans_process(data=X, k=2)
    plt.ioff()
    plt.show()

4.3 第三题

给定的图像,对其像素进行聚类并可视化

from scipy.cluster.vq import *
from pylab import *
from PIL import Image


def clusterpixels(infile, k, steps):
    im = array(Image.open(infile))
    dx = im.shape[0] / steps
    dy = im.shape[1] / steps
    features = []

    for x in range(steps):  # RGB三色通道
        for y in range(steps):
            R = mean(im[int(x * dx):int((x + 1) * dx), int(y * dy):int((y + 1) * dy), 0])
            G = mean(im[int(x * dx):int((x + 1) * dx), int(y * dy):int((y + 1) * dy), 1])
            B = mean(im[int(x * dx):int((x + 1) * dx), int(y * dy):int((y + 1) * dy), 2])
            features.append([R, G, B])
    features = array(features, 'f')  # make into array
    # 聚类, k是聚类数目
    centroids, variance = kmeans(features, k)
    code, distance = vq(features, centroids)
    codeim = code.reshape(steps, steps)
    codeim = np.array(Image.fromarray(codeim).resize((im.shape[1], im.shape[0])))
    return codeim


# k = 5
infile_Stones = 'stones.jpg'
im_Stones = array(Image.open(infile_Stones))
steps = (50, 100)  # image is divided in steps*steps region

# 显示原图
figure()
subplot(231)
title('original')
axis('off')
imshow(im_Stones)

for k in range(2, 7):
    codeim = clusterpixels(infile_Stones, k, steps[-1])
    subplot(2, 3, k)
    title('K=' + str(k))
    axis('off')
    imshow(codeim)

show()

最后

小生凡一,期待你的关注。

通俗易懂的图解机器学习之机器学习概论

❤️通俗易懂的图解机器学习❤️之机器学习概论(这个是连载的哦…)文章目录❤️通俗易懂的图解机器学习❤️之机器学习概论一、什么是机器学习1、学习的种类1.1、监督学习1.2、无监督学习1.3、强化学习2、机器学... 查看详情

通俗易懂的图解机器学习之机器学习概论

❤️通俗易懂的图解机器学习❤️之机器学习概论(这个是连载的哦…)文章目录❤️通俗易懂的图解机器学习❤️之机器学习概论一、什么是机器学习1、学习的种类1.1、监督学习1.2、无监督学习1.3、强化学习2、机器学... 查看详情

以❤️简单易懂❤️的语言带你搞懂有监督学习算法附python代码详解机器学习系列之knn篇(代码片段)

必须要看的前言本文风格:以❤️简单易懂❤️的语言带你彻底搞懂KNN,了解什么是有监督学习算法。认真看完这篇文章,彻底了解KNN、了解监督学习算法绝对是一样很简单的事情。注:本篇文章非常详细,... 查看详情

机器学习机器学习入门08-聚类与聚类算法k-means(代码片段)

时间过得很快,这篇文章已经是机器学习入门系列的最后一篇了。短短八周的时间里,虽然对机器学习并没有太多应用和熟悉的机会,但对于机器学习一些基本概念已经差不多有了一个提纲挈领的了解,如分类和回归,损失函数... 查看详情

机器学习-聚类kmeans(代码片段)

图解K-Means算法本文中介绍的是一种常见的无监督学习算法,名字叫做K均值算法:K-Means算法。K-Means算法在无监督学习,尤其是聚类算法中是最为基础和重要的一个算法。它实现起来非常简单。聚类效果也很不错的ÿ... 查看详情

☀️机器学习入门☀️pca和lda降维算法|附加小练习(文末送书)(代码片段)

🎉粉丝福利送书:《人工智能数学基础》🎉点赞👍收藏⭐留言📝即可参与抽奖送书🎉下周三(9月22日)晚上20:00将会在【点赞区和评论区】抽一位粉丝送这本书~🙉🎉详情请看第三点的介绍嗷~... 查看详情

em算法(expectationmaximizationalgorithm)详解(附代码)---大道至简之机器学习系列---通俗理解em算法。

☕️本文来自专栏:大道至简之机器学习系列专栏🍃本专栏往期文章:逻辑回归(LogisticRegression)详解(附代码)---大道至简之机器学习算法系列——非常通俗易懂!_尚拙谨言的博客-CSDN博客_逻辑回归代码❤️各位小... 查看详情

机器学习强基计划7-2:图文详解k-均值聚类(k-means)算法(附python实现)(代码片段)

...2.2K-means算法流程3Python实现3.1算法复现3.2可视化0写在前面机器学习强基计划聚焦深度和广度,加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的数学原理;“广”在分析多个机器学习模型:决策树... 查看详情

❤️三万字详解《十大入门算法》突击刷掉这几个题,面试不慌!❤️(附源码,建议收藏)(代码片段)

...🌞LeetCode太难?先看简单题!🧡《C语言入门100例》🧡数据结构难?不存在的!🌳《数据 查看详情

机器学习k-means算法优化

K-Means算法优化学习目标1.Canopy算法配合初始聚类1.1Canopy算法配合初始聚类实现流程1.2Canopy算法的优缺点2.K-means++3.二分k-means4.k-medoids(k-中心聚类算法)5.Kernelk-means6.ISODATA7.MiniBatchK-Means8.小结学习目标知道K-means算法的... 查看详情

机器学习:k-means算法

3.K-means算法:    3.1Clustering中的经典算法,数据挖掘十大经典算法之一   3.2 算法接受参数k;然后将事先输入的n个数据对象划分为k个聚类以便使得所获得的聚类满足:同一      ... 查看详情

机器学习-k-means聚类及算法实现(基于r语言)

K-means聚类将n个观测点,按一定标准(数据点的相似度),划归到k个聚类(用户划分、产品类别划分等)中。重要概念:质心K-means聚类要求的变量是数值变量,方便计算距离。 算法实现 R语言实现 k-means算法是将数值... 查看详情

视觉机器学习------k-means算法

K-means(K均值)是基于数据划分的无监督聚类算法。一、基本原理   聚类算法可以理解为无监督的分类方法,即样本集预先不知所属类别或标签,需要根据样本之间的距离或相似程度自动进行分类。聚类算法可以分为基... 查看详情

机器学习---算法---k-means算法

转自:https://blog.csdn.net/zhihua_oba/article/details/73832614 k-means算法详解主要内容k-means算法简介k-means算法详解k-means算法优缺点分析k-means算法改进算法k-means++1、k-means算法简介??k-means算法是一种聚类算法,所谓聚类,即根据相似性... 查看详情

tensorflow快速入门1--实现k-means聚类算法

...1.环境搭建    的安装    1.2简单测试    学习文档    相关的库Seaborn、pandas安装    实现K-Means聚类算法    2.1最基本的K-Means聚类算法步骤    实现K-Means聚类算法    2 查看详情

[机器学习]二分k-means算法详解(代码片段)

二分k-means算法  二分k-means算法是分层聚类(Hierarchicalclustering)的一种,分层聚类是聚类分析中常用的方法。分层聚类的策略一般有两种:聚合。这是一种自底向上的方法,每一个观察者初始化本身为一类,然后两两结合分裂... 查看详情

机器学习:k-means算法

机器学习:K-Means算法任务描述数据处理Encoder:归一化:Kmeans前置内容聚类基础概念模型运作方式模型改进方式:任务描述以竞品分析为背景,通过数据的聚类,为汽车提供聚类分类。对于指定的车型,... 查看详情

机器学习笔记之谱聚类k-means聚类算法介绍(代码片段)

机器学习笔记之谱聚类——K-Means聚类算法介绍引言回顾:高斯混合模型聚类任务基本介绍距离计算k-Means\\textk-Meansk-Means算法介绍k-Means\\textk-Meansk-Means算法示例k-Means\\textk-Meansk-Means算法与高斯混合模型的关系k-Means\\textk-Meansk-Me... 查看详情