`

机器学习初识之Kmeans浅尝

 
阅读更多

机器学习在图像识别方面具有很好的效果,今天在网易云课堂黑板可老师视频中学习了一下Kmeans算法,是一种非监督类学习算法,具体步骤如下

 

1,选取K个点作为初始中心

2,将每个点最近的中心,形成K个簇

3,重新计算每个簇的中心

4,如果簇中心发生明显的变化或者未达到最大迭代次数,则返回到第二部

 



 

如上图,有很多点,需要将这些点分成类簇,我们的方法是

 

1,先随机选择三个点Cluster

2,判断所有点距离这三个点的距离,并将点加入到该Cluster中

3,重新计算每个簇的中心

4,迭代2

 

下面讲一个实际的问题,对于一张图片,我们想找出图片的K个主要色彩,然后将图片换成包含主要色彩的图片

具体步骤如下:

1,将一个图片转化成像素集合

2,随机在这些像素集合中选取K个点,也就是三个簇

3,计算每个像素点距离这三个簇最近的簇,并把它放入该簇中

4,第三步形成了新的簇,然后计算新簇的中心,计算簇中心的方法是求每个簇的RGB三原色的平均颜色,根据平均颜色选取新的pixel,也就是簇的中心

5,重复步骤2至迭代次数

6,迭代完成后得到图片的中心pixel

7,遍历原图的每个pixel,求出距离该pixel最近的中心pixel,记为pixelCenter并将原图的pixel置换为pixelCenter

8,7步骤完成后得到新的图片

 

Python示例代码如下,(从github上down的)

# -*- coding: utf-8 -*-
# https://github.com/ZeevG/python-dominant-image-colour
# commented by heibanke

from PIL import Image
import random
import numpy

class Cluster(object):
    """
    pixels: 主要颜色所依据的像素点
    centroid: 主要颜色的RGB值
    """
    def __init__(self):
        self.pixels = []
        self.centroid = None

    def addPoint(self, pixel):
        self.pixels.append(pixel)

    def setNewCentroid(self):
        """
        通过pixels均值重新计算主要颜色
        """
        R = [colour[0] for colour in self.pixels]
        G = [colour[1] for colour in self.pixels]
        B = [colour[2] for colour in self.pixels]

        R = sum(R) / len(R)
        G = sum(G) / len(G)
        B = sum(B) / len(B)

        self.centroid = (R, G, B)
        self.pixels = []

        return self.centroid


class Kmeans(object):

    def __init__(self, k=3, max_iterations=5, min_distance=5.0, size=400):
        """
        k: 主要颜色的分类个数
        max_iterations: 最大迭代次数
        min_distance: 当新的颜色和老颜色的距离小于该最小距离时,提前终止迭代
        size: 用于计算的图像大小
        """
        self.k = k
        self.max_iterations = max_iterations
        self.min_distance = min_distance
        self.size = (size, size)

    def run(self, image):
        self.image = image
        #生成缩略图,节省运算量
        self.image.thumbnail(self.size)
        self.pixels = numpy.array(image.getdata(), dtype=numpy.uint8)
        self.clusters = [None]*self.k
        self.oldClusters = None
        #在图像中随机选择k个像素作为初始主要颜色
        randomPixels = random.sample(self.pixels, self.k)

        for idx in range(self.k):
            self.clusters[idx] = Cluster()
            self.clusters[idx].centroid = randomPixels[idx]

        iterations = 0

        #开始迭代
        while self.shouldExit(iterations) is False:
            self.oldClusters = [cluster.centroid for cluster in self.clusters]
            print iterations

            #对pixel和self.clusters中的主要颜色分别计算距离,将pixel加入到离它最近的主要颜色所在的cluster中
            for pixel in self.pixels:
                self.assignClusters(pixel)
            #对每个cluster中的pixels,重新计算新的主要颜色
            for cluster in self.clusters:
                cluster.setNewCentroid()

            iterations += 1

        return [cluster.centroid for cluster in self.clusters]

    def assignClusters(self, pixel):
        shortest = float('Inf')
        for cluster in self.clusters:
            distance = self.calcDistance(cluster.centroid, pixel)
            if distance < shortest:
                shortest = distance
                nearest = cluster
        nearest.addPoint(pixel)

    def calcDistance(self, a, b):
        result = numpy.sqrt(sum((a - b) ** 2))
        return result

    def shouldExit(self, iterations):

        if self.oldClusters is None:
            return False
        #计算新的中心和老的中心之间的距离
        for idx in range(self.k):
            dist = self.calcDistance(
                numpy.array(self.clusters[idx].centroid),
                numpy.array(self.oldClusters[idx])
            )
            if dist < self.min_distance:
                return True

        if iterations <= self.max_iterations:
            return False

        return True

    # The remaining methods are used for debugging
    def showImage(self):
        """
        显示原始图像
        """
        self.image.show()

    def showCentroidColours(self):
        """
        显示主要颜色
        """
        for cluster in self.clusters:
            image = Image.new("RGB", (200, 200), cluster.centroid)
            image.show()

    def showClustering(self):
        """
        将原始图像的像素完全替换为主要颜色后的效果
        """
        localPixels = [None] * len(self.image.getdata())

        for idx, pixel in enumerate(self.pixels):
                shortest = float('Inf')
                for cluster in self.clusters:
                    distance = self.calcDistance(
                        cluster.centroid,
                        pixel
                    )
                    if distance < shortest:
                        shortest = distance
                        nearest = cluster

                localPixels[idx] = nearest.centroid

        w, h = self.image.size
        localPixels = numpy.asarray(localPixels)\
            .astype('uint8')\
            .reshape((h, w, 3))

        colourMap = Image.fromarray(localPixels)
        return colourMap
    
if __name__=="__main__":
    from PIL import Image
    import os
    
    k_image=Kmeans(k=3) #默认参数
    path = './ml_kmean.pypics/'
    fp = open('file_color.txt','w')
    for filename in os.listdir(path):
        print path+filename
        try:
            color = k_image.run(Image.open(path+filename))
            w_image = k_image.showClustering()
            w_image.save(path+'mean_'+filename,'jpeg')
            fp.write('The color of '+filename+' is '+str(color)+'\n')
        except :
            print "This file format is not support"
    fp.close()

 

原图和处理之后的图对比如下:




 

 
 

  • 大小: 73 KB
  • 大小: 16.7 KB
  • 大小: 1.5 MB
分享到:
评论

相关推荐

    机器学习算法之KMeans聚类算法实现.zip

    KMeans聚类算法是机器学习领域中广泛应用的一种无监督学习方法,主要用于数据的分组或分类。它通过迭代过程将数据点分配到最近的聚类中心,从而形成不同的簇。KMeans算法简单、易于理解且在大数据集上也能高效运行,...

    numpy-使用numpy实现的机器学习算法之KMeans.zip

    本文将深入探讨如何使用NumPy来实现机器学习中的经典算法——KMeans聚类。KMeans是一种无监督学习方法,常用于数据挖掘和数据分析,能够将数据自动分为若干个类别,而无需预先知道类别信息。 首先,我们要了解...

    机器学习-聚类kmeans实现

    在机器学习领域,聚类是一种无监督学习方法,主要用于数据的分类和组织,不依赖于预先标记的数据。其中,K-Means是最为常见的聚类算法之一,它以简单、高效而著称。本篇文章将深入探讨K-Means算法的基本原理、改进...

    机器学习 kmeans应用案例

    ### 机器学习 KMeans 应用案例 #### KMeans 算法简介 KMeans 是一种常见的无监督学习算法,主要用于聚类分析。其主要思想是将数据集划分为K个簇(Cluster),使得每个数据点都属于最近的簇中心(质心)。KMeans ...

    机器学习Kmeans实验报告

    机器学习关于Kmeans的实验报告,内含代码,实验是关于鹦鹉图片颜色聚类

    ai-机器学习算法实现之KMeans聚类.zip

    KMeans聚类是机器学习领域中最基础且广泛应用的无监督学习算法之一,尤其在数据挖掘和模式识别中扮演着重要角色。KMeans算法的核心思想是将数据集分成K个不同的类别(或称为簇),使得每个类别内部的数据点尽可能...

    python机器学习 聚类算法Kmeans代码实现 包含所用数据集和代码

    在机器学习领域,聚类是一种无监督学习方法,它通过将数据点分为不同的组或“簇”,使得同一簇内的数据点彼此相似,而不同簇之间的数据点差异较大。本资源包含了一个关于Python实现聚类算法KMeans的完整实例,特别...

    机器学习kmeans评估

    在"机器学习kmeans评估"这个主题中,我们主要探讨以下几个知识点: 1. **K-Means算法原理**:K-Means的基本思想是通过迭代过程不断调整聚类中心和数据点的归属,直到聚类中心不再显著变化或者达到预设的最大迭代...

    Python数据分析与机器学习-使用Kmeans进行图像压缩

    Python在数据分析和机器学习领域扮演着重要角色,其丰富的库如NumPy、Pandas和Scikit-learn使得处理和分析数据变得极其便捷。本主题聚焦于一个特定的应用:使用K-means聚类算法进行图像压缩。K-means是一种非监督...

    机器学习常用各类算法详解

    01-机器学习_(python数据类型详解) ...04-机器学习_(kmeans聚类算法与应用) 05-机器学习_(协同过滤推荐算法与应用) 06-机器学习_(决策树分类算法与应用) 07-机器学习_(lineage回归分类算法与应用)

    机器学习-Kmeans聚类算法

    在机器学习领域,它被用来发现数据集中的自然群组,无需预先知道类别信息。该算法的基本思想是通过迭代将数据点分配到最近的聚类中心,从而形成多个聚类。 **算法步骤:** 1. **初始化**:选择K个初始聚类中心,...

    北邮+机器学习+自动化+yhh+机器学习实验+作业+Kmeans算法

    K均值算法是机器学习领域基础且实用的算法之一,尤其在大数据分析和模式识别中发挥着重要作用。北京邮电大学(北邮)在机器学习与自动化的课程中,通常会安排相关的实验和作业,让学生通过实践来深化对这一算法的...

    机器学习之kmeans算法代码

    k-means 算法接受输入量 k ;然后将n个数据对象划分为 k个聚类以便使得所获得的聚类满足:同一聚类中的对象相似度较高;而不同聚类中的对象相似度较小。聚类相似度是利用各聚类中对象的均值所获得一个“中心对象”...

    spark机器学习Kmeans聚类

    spark机器学习,Scala语言开发,能够实现Kmeans聚类。

    【机器学习项目实战】Python实现聚类(Kmeans)分析客户分组

    【机器学习项目实战】Python实现聚类(Kmeans)分析客户分组 资料说明:包括数据集+源代码+Word文档说明。 资料内容包括: 1)问题定义; 2)数据收集; 3)数预处理; 4)探索性数据分析; 5)聚类模型; 6)聚类可视化...

    C++结合OpenCV实现Kmeans聚类图像分割的案列

    在本文中,我们将深入探讨如何使用...这个过程不仅有助于理解机器学习和图像处理,也为实际应用提供了坚实的基础。在实际项目中,可能还需要考虑优化性能、处理大数据集或改进初始化策略等问题,以适应不同的应用场景。

    机器学习算法之使用Python实现KMeans算法.zip

    在机器学习领域,KMeans算法是一种广泛应用的无监督学习方法,用于数据聚类。它通过迭代寻找数据点的最优分组,使得同一组内的数据点彼此间的距离最小,而不同组之间的距离最大。本教程将深入探讨如何使用Python语言...

    Spark中机器学期之KMeans算法实战讲解

    在大数据分析领域,Apache Spark作为一个快速、通用且可扩展的大数据处理框架,广泛应用于机器学习任务。本篇文章将深入探讨Spark中的KMeans算法,这是一种无监督学习方法,常用于聚类分析,帮助我们发现数据集中的...

    python实现经典机器学习算法,包括kmeans,线性回归,逻辑回归

    在IT领域,特别是数据科学和机器学习中,Python是一种广泛使用的编程语言,因其简洁的语法和丰富的库支持而备受青睐。本项目聚焦于通过Python实现经典的机器学习算法,包括K-Means聚类、线性回归和逻辑回归。这些...

    机器学习kmeans聚类算法与应用 (2).pdf

    《机器学习kmeans聚类算法与应用》 KMeans聚类算法是机器学习领域中一种广泛应用的无监督学习方法,它主要用于数据的分类和分组。该算法基于一个简单的概念:将数据点按照它们与特定“质心”的接近程度进行划分,...

Global site tag (gtag.js) - Google Analytics