【数据挖掘笔记】K-均值算法及其拓展

 

基于划分的聚类方法主要包括K-均值和K-中心点方法,本文为大家总结了K-均值算法及其拓展,连同程序一并献上。

 

一、K-均值算法

 

算法如下:

 

 

例如:给定数据集合D,任取K = 2个对象作为初始聚类中心。计算各个对象到K个中心点的距离(如欧式距离),并将每个对象赋给最近的中心点。然后,更新簇的平均值, 即重新计算每个簇中对象的平均值作为簇的中心点。由于簇的中心点发生变化,继续计算每个对象赋给最近的中心点重新划分簇,直到簇趋于稳定为止

 

一般,采用平方误差准则作为收敛函数, 其定义如下:

 

 

其中,m_i为簇C_i的平均值。

 

二、K-均值算法例程

 

以下例程基于MATLAB,根据Github源码改编,已经调试通过,供大家参考。源码已经上传至Github,点击下方“阅读原文”获取相关资源。

 

例程链接:https://github.com/ZhouKanglei/K_means

 

main.m程序如下:

clear all;close all;
%=======================================%           Initialising Data%=======================================
file = '../Data/Aggregation.mat';k = 7;iterations = 20;
%=======================================%           Clustering%=======================================
[clustered_data, error] = k_means(file, k, iterations);
%=======================================%           Plot%=======================================plot_data(clustered_data, error, k);

k_means.m程序如下:

 

function [clustered_data, error] = k_means(file, k, iterations)    %=======================================    %           Initialising Data    %=======================================    load(file);    rows = size(data, 1);    cols = size(data, 2);    data = data(1:rows, 1:cols-1);    clusters = randi([1 k], rows, 1);    clustered_data = [data clusters];    mean_matrix = zeros(k, cols-1);
    error = [];
    %=======================================    %           Calculating Mean    %=======================================    for i = 1:k       index = clustered_data(:, end) == i;       indexed_data = clustered_data(index, 1:end-1);       mean_matrix(i, :) = mean(indexed_data);
    end
    %=======================================    %           Computing Error    %=======================================    error = get_error(clustered_data, mean_matrix);    fprintf('After initialization: error = %.4f \n', error);
    %=======================================    %           Starting Iterations    %=======================================    for p = 1:iterations       for q = 1:rows          %=======================================          % Deciding which Cluster data belongs          %=======================================          dist = get_euclidean(data(q, :), mean_matrix);          [minimum_row, minimum_col] = min(dist);          clusters(q) = minimum_col;       end       clustered_data = [data, clusters];
       %=======================================       %          Calculating Mean       %=======================================       for i = 1:k          index = clustered_data(:, end) == i;          indexed_data = clustered_data(index, 1:end-1);          mean_matrix(i, :) = mean(indexed_data);       end       %=======================================       %           Computing Error       %=======================================       error = [error get_error(clustered_data, mean_matrix)];       fprintf('After iteration %d: error = %.4f \n', p, error(end));    endend
function [error] = get_error(data, mean_matrix)    %=======================================    %           Computing Error    %=======================================    error = 0;    for j = 1: size(data, 1)       c = data(j, end);       dist = get_euclidean(data(j, 1:end-1), mean_matrix(c, 1:end));       error = error + dist;    endend
function [distance_matrix] = get_euclidean(data, mean_matrix)    %=======================================    %           Calculating Euclidean    %=======================================    dist = data - mean_matrix;    dist = dist.^2;    dist = sum(dist, 2);    distance_matrix = sqrt(dist);end

 

plot_data.m程序如下:

 

function [] = plot_data(clustered_data, error, k)
    %=======================================    %           Plot 2D data    %=======================================    figure(1);    dim = size(clustered_data, 2) - 1;    color = ['r', 'g', 'b', 'y', 'm', 'k', 'c'];    if dim == 2
        for i_for = 1 :  k            idx = find(clustered_data(:, end) == i_for);
            plot(clustered_data(idx, 1), clustered_data(idx, 2),...                ['w', 'o'], 'MarkerSize',  10, 'MarkerFacecolor', color(i_for), 'LineWidth', 1.5);
            title(['Plot']);            xlabel(['\it x']);            ylabel(['\it y']);            set(gca, 'FontSize', 16, 'FontName', 'Times', 'LineWidth', 1.5);
            hold on;        end        hold off;    end

    %=======================================    %           Plot 2D error    %=======================================    figure(2);
    plot(error,...        'b-s', 'MarkerSize',  10, 'MarkerFacecolor', 'b', 'LineWidth', 1.5);
    xlim([1 length(error)]);    title(['Error']);    xlabel(['Iteration No.']);    ylabel(['Error']);    set(gca, 'FontSize', 16, 'FontName', 'Times', 'LineWidth', 1.5);
end

 

三、例程执行结果

 

本文采用UCI数据集Aggregation作为实验数据,使用MATLAB R2016b 软件在配备为 Intel (R) Core (TM) i7-7500U 2.90 GHz CPU 和 8GB 内存的个人电脑上进行了所有的实验。

 

程序运行结果:

 

>> main

After initialization: error = 9489.2095 

After iteration 1: error = 3593.0203 

After iteration 2: error = 3365.6874 

After iteration 3: error = 3311.8756 

After iteration 4: error = 3308.9829 

After iteration 5: error = 3308.9829 

After iteration 6: error = 3308.9829 

After iteration 7: error = 3308.9829 

After iteration 8: error = 3308.9829 

After iteration 9: error = 3308.9829 

After iteration 10: error = 3308.9829 

After iteration 11: error = 3308.9829 

After iteration 12: error = 3308.9829 

After iteration 13: error = 3308.9829 

After iteration 14: error = 3308.9829 

After iteration 15: error = 3308.9829 

After iteration 16: error = 3308.9829 

After iteration 17: error = 3308.9829 

After iteration 18: error = 3308.9829 

After iteration 19: error = 3308.9829 

After iteration 20: error = 3308.9829 

 

二维数据绘制示意图:

 

 

误差结果图:

 

640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1uploading.4e448015.gif转存失败重新上传取消

 

四、K-均值算法复杂度分析

 

假设迭代次数为t,在一次迭代中需要分别计算n个对象与k个中心的距离。因此,K-均值算法的算法复杂度为O(nkt)

 

五、K-均值算法拓展

 

K-均值算法有很多变体,具体在以下方面有所不同:

 

  • 初始k个平均值的选择

  • 相异度的计算

  • 计算聚类平均值的策略

 

在实际应用中,往往先用层次凝聚算法决定簇的数目,并产生初始聚类, 然后用迭代重定位改进聚类结果。

 

K-众数(k-modes)方法是K-均值的一个变体,它扩展了K-均值范例,用簇众数取代簇均值来聚类标称数据。它采用新的相异性度量来处理标称对象,采用基于频率的方法来更新簇的众数。

 

K-原型(k-prototype)方法集成k-均值和k-众数方法,对混合了数值和标称值的数据进行聚类。

 

参考文献

 

  1. Jiawei Han, Micheline Kamber & Jian Pei. Data Miining Concepts and Techniques (Third Edition). 

     

  2. 范明,孟小峰译. 数据挖掘:概念和技术(第三版).

     

  3. 参考资源:https://github.com/jayshah19949596/Machine-Learning-Models/tree/master/K-Mean%20Clustering.

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【摘要】 目前,对于聚类问题的研究普遍存在于社会生活中的各个领域,如模式识别、图像处理、机器学习和统计学等。关于对生活中各种各样的数据的聚类分类问题已经成为众多学者的研究热题之一。聚类和分类的区别在于,聚类没有任何先验知识可循,要通过数据自身的特点,将数据自动的划分到不同的类别中。聚类的基本形式定义为“在已给的数据集合中寻找数据点集的同类集合。每一个集合叫做一个类,并确定了一个区域,在区域中对象的密度高于其他区域中的密度。”聚类方法有很多种,其中最简单的形式便是划分式聚类,划分式聚类试图将给定的数据集合分割成不相交的子集,使具体的聚类准则是最优的。实际中应用最广泛的准则是聚类误差平方和准则,即对于每一个点都计算它到相应的聚类中心点的平方距离,并对数据集合上的所有点的距离进行求和。一种最流行的基于最小聚类误差平法和的聚类方法是K-均值算法。然而,K-均值算法是一个局部搜索的算法,它存在一些严重的不足,比如K值需要预先确定、聚类结果的好坏依赖于初始点的选取。为了解决这些问题,这个领域的研究者开发了很多其他的一些技术,试图基于全局最优化的方法来解决聚类问题(比如模拟退火算法、遗传算法等)。然而这些技术并没有得到广泛的认可,在许多实际应用中应用最多的还是反复利用K-均值算法。K-均值算法是一种基于划分的聚类算法,它通过不断的迭代来进行聚类,当算法收敛到一个结束条件时就终止迭代过程,输出聚类结果。由于其算法思想简便,又容易实现对大规模数据的聚类,因此K-均值算法已成为一种最常用的聚类算法之一K-均值算法能找到关于聚类误差的局部的最优解,是一个能应用在许多聚类问题上的快速迭代算法。它是一种以点为基础的聚类算法,以随机选取的初始点为聚类中心,迭代地改变聚类中心来使聚类误差最小化。这种方法最主要的不足就是对于初始聚类中心点位置的选取敏感。因此,为了得到近似最优解,初始聚类中心的位置必须安排的有差异。本文就K-均值聚类算法聚类结果依赖于初始中心,而且经常收敛于局部最优解,而非全局最优解,以及聚类类别数K需要事先给定这两大缺憾展开研究。提出了分别解决这两个问题的算法各一个首先,本文将Hae-Sang等人的快速K-中心点算法确定初始中心点的思想应用于Aristidis Likas的全局K-均值聚类算法中下一个簇的初始中心选择上,提出一种改进的全局K-均值聚类算法,试图寻找一个周围样本点分布比较密集,且距离现有簇的中心都较远的样本点,将其作为下一个簇的最佳初始中心。通过对UCI机器学习数据库数据及人工随机模拟数据的测试,证明本文算法与Aristidis Likas的全局K-均值聚类算法和快速全局K-均值聚类算法比,在不影响聚类误差平方和的前提下,聚类时间更短,具有更好的性能。同时,本文介绍了自组织特征映射网络(Self-Organizing Feature Map, SOFM)的相关内容,SOFM网络是将多维数据映射到低维规则网格中,可以有效的进行大规模的数据挖掘,其特点是速度快,但是分类的精度不高。而K-均值聚类算法,是一种通过不断迭代调整聚类质心的算法,其特点是精度高,主要用于中小数据集的分类,但是聚类速度比较慢。因此,本文在分析了基于自组织特征映射网络聚类的学习过程,权系数自组织过程中邻域函数,以及学习步长的一般取值问题后,给出了基于自组织特征映射网络聚类实现的具体算法,将自组织特征网络与K-均值聚类算法相结合,提出了一种基于自组织映射网络的聚类方法,来实现对输入模式进行聚类,实现K-均值聚类算法聚类类别数的自动确定。同时通过实验进行仿真实现,证明该算法的有效性。 还原 【Abstract】 Clustering is a fundamental problem that frequently arises in a great variety of fields such as pattern recognition, image processing, machine learning and statistics. In general, clustering is defined as the problem of finding homogeneous groups of samples in a given data set. Each of these groups is called a cluster and can be defined as a region in which the density of exemplars is locally higher than in other regions.The simplest form of clustering is partition clustering w

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值