`

Ruby简单实现K-means聚类算法

阅读更多
K-means是一个简单容易实现的聚类算法,我们以对一个图片的颜色的RGB值进行聚类为例,
实现这个算法。
K-means算法是一个EM的迭代过程:
1.随机选择k个作为聚类中心
2.E step:
对每一个点,计算它到每一个聚类中心的距离,把这个点分配到最近的聚类中心代表的
聚类中。
3.M step:
重新计算每个聚类的中心:每个聚类中心为该聚类所有点的均值。

重复2~3直到达到最大的迭代次数或者聚类不再发生变化。

#!/usr/bin/ruby
# autor: fuliang http://fuliang.iteye.com/

class RGB
    attr_accessor :r,:g,:b

    def initialize(r=0,g=0,b=0)
        @r,@g,@b = r,g,b
    end

    def +(rgb)
        @r += rgb.r
        @g += rgb.g
        @b += rgb.b
        self
    end

    def /(n)
        @r /= n
        @g /= n
        @b /= n
        self
    end
end

def random_k_centers(instances,k)
    rand_indxes = (0...instances.size).sort_by{rand}[0...k]
    instances.values_at(*rand_indxes)
end

def distance(ins1,ins2)#采用余弦值,因为255,255,255和200,200,200颜色基本类似
    dot_product = ins1.r * ins2.r + ins1.g * ins2.g + ins1.b * ins2.b
    mod1 = Math.sqrt(ins1.r * ins1.r + ins1.g * ins1.g + ins1.b * ins1.b)
    mod2 = Math.sqrt(ins2.r * ins2.r + ins2.g * ins2.g + ins2.b * ins2.b)
    return 1 - dot_product / (mod1 * mod2)
end

def k_means_cluster(instances,k,max_iter=100)
    random_centers = random_k_centers(instances,k)
    p random_centers
    instance_cluster_map = {}
    change_count = 0
    clusters = []
    0.upto(max_iter) do |iter_num|
        clusters = []
        puts "iterate #{iter_num} ..."
        change_count = 0
        # E-step
        instances.each do |instance|
            min_distance = 1.0/0
            min_indx = 0
            random_centers.each_with_index do |center,index|
                current_distance = distance(center,instance)
                if min_distance > current_distance then
                    min_indx = index
                    min_distance = current_distance
                end
            end
            if instance_cluster_map[instance] != min_indx then#trace the change
                change_count += 1
                instance_cluster_map[instance] = min_indx
            end
            clusters[min_indx] ||= []
            clusters[min_indx] << instance
        end
        puts "change_count=#{change_count}"
        break if change_count.zero?
        #M-step
        clusters.each_with_index do |cluster,index|
            center = RGB.new
            cluster.each do |instance|
                center += instance
            end
            center /= cluster.size
            random_centers[index] = center # update center
        end
    end
    return clusters
end

instances = []
File.open("rgbs.txt").each_line do |line|
    line.split(/\t/).each do | rgb |
        r,g,b = rgb.split(/,/).collect{|e| e.to_i}
        instances << RGB.new(r,g,b)
    end
end

clusters = k_means_cluster(instances,5,100)
k_candidates = []
clusters.each do |cluster|
    sum = cluster.inject(RGB.new) {|sum,ins| sum + ins}
    candidate = sum / cluster.size
    k_candidates << candidate
end

p k_candidates

可以使用聚类算法对这个图片进行有损压缩。
0
0
分享到:
评论

相关推荐

    详解Java实现的k-means聚类算法

    Java实现的k-means聚类算法详解 k-means聚类算法是一种常用的无监督学习算法,用于对数据进行聚类分析。该算法的主要思想是将相似的数据点聚类到一起,形成不同的簇。Java语言是实现k-means聚类算法的不二之选。 ...

    基于K-means聚类算法的图像分割及其MATLAB实现

    基于K-means聚类算法的图像分割 算法的基本原理:  基于K-means聚类算法的图像分割以图像中的像素为数据点,按照指定的簇数进行聚类,然后将每个像素点以其对应的聚类中心替代,重构该图像。 算法步骤: ①随机选取...

    K-MEANS聚类算法的实现

    K-MEANS聚类算法的实现 K-MEANS聚类算法是一种常用的无监督机器学习算法,主要用于对数据进行聚类分析。该算法的主要思想是将相似的数据对象划分到同一个簇中,使得簇内的数据对象尽量相似,而簇间的数据对象尽量...

    基于 K-means 聚类算法的图像区域分割.zip

    基于 K-means 聚类算法的图像区域分割,首先从数据样本种选取K个点作为初始聚类中心,其次计算各个样本到聚类的距离,把样本归到离它最近的那个聚类中心所在的累,计算新形成的每个聚类的数据对象的平均值来得到新的...

    基于K-means聚类算法的图像分割(MATLAB实现).rar_ASV聚类_K-Means图像分割_k means_rest

    《基于K-means聚类算法的图像分割在MATLAB中的实现》 图像分割是计算机视觉领域中的基础任务,它旨在将图像划分为多个区域或对象,每个区域具有相似的特征。K-means聚类算法是一种广泛应用的数据分析方法,它通过...

    实验五 K-Means聚类算法.ipynb

    实验五 K-Means聚类算法.ipynb

    K-means聚类算法.pptx

    尽管K-means简单且易于实现,但它有一些固有的局限性,例如对初始质心敏感、无法处理非凸形状的簇以及对异常值敏感。因此,出现了许多改进版本,如: - **K-means++**:通过概率方式选择初始质心,减少对初始值的...

    基于python的K-Means聚类算法设计与实现

    总结来说,基于Python的K-Means聚类算法设计与实现涉及到数据预处理、K值选择、模型训练和结果评估等多个步骤。`scikit-learn`库提供了便捷的接口,使得这一过程变得更加简单。在实际应用中,需要根据数据特性调整...

    论文研究-基于k-means聚类算法的研究 .pdf

    k-means算法作为一种划分方法,其优点包括算法简单、快速且易于实现;缺点则是需要提前指定簇的数目,且对噪声和离群点敏感,易受初始聚类中心选择的影响导致收敛到局部最优解。针对这些问题,研究者提出通过多次...

    k-means聚类学习算法matlab源码

    K-means聚类算法,作为一种简单而有效的无监督机器学习方法,被广泛应用于数据挖掘和图像处理领域,尤其是在计算机视觉中,它能够对图像进行自动分类,识别特征,帮助理解复杂的数据结构。MATLAB作为强大的科学计算...

    基于 K-means 聚类算法的图像区域分割

    标题“基于 K-means 聚类算法的图像区域分割”揭示了这是一个关于利用K-means算法处理图像处理问题的项目。K-means聚类是一种常见的无监督学习方法,用于将数据集划分为K个互不重叠的类别,每个类别由其内部数据点的...

    实验 Spark ML Bisecting k-means聚类算法使用

    在 Spark ML 中,Bisecting k-means 聚类算法的实现类为 BisectingKMeans,具有以下参数: def __init__(self, featuresCol="features", predictionCol="prediction", maxIter=20, seed=None, k=4, ...

    K-Means聚类算法C#实现

    以下是关于K-Means聚类算法及其C#实现的关键知识点: 1. **K-Means算法原理**:K-Means的目标是将n个数据点划分为k个不同的簇(类别),每个数据点被分配到与其最近的质心(中心点)所属的簇。算法包括两个主要步骤...

    基于流形距离的K-means聚类算法(matlab实现)

    将流形距离引入K-means聚类算法中,对于具有流形结构的数据集有很好的聚类效果,流形距离计算参数的设定充分考虑了全局和局部一致性。

    一种分布式的K-means聚类算法.pdf

    分布式K-means聚类算法是大数据分析中处理大规模数据集的一个重要工具。随着数据量的日益增长,传统的集中式K-means算法在面对海量数据时,由于计算资源和内存限制,常常效率低下,甚至无法有效执行。为了解决这一...

    K-means聚类算法的C++实现

    总的来说,K-means聚类算法的C++实现结合了分词器和TF-IDF,为文本数据的分类提供了有效的工具。在理解和实现过程中,需要关注数据预处理、算法优化以及评估方法,以确保聚类效果的准确性和效率。

    (带注释)基于K-means聚类算法的图像区域分割.zip

    (带注释)基于K-means聚类算法的图像区域分割.zip,MATLAB实现,详情可以参考:https://blog.csdn.net/didi_ya/article/details/115376184

Global site tag (gtag.js) - Google Analytics