• 大小: 23KB
    文件类型: .m
    金币: 1
    下载: 0 次
    发布日期: 2021-05-12
  • 语言: Matlab
  • 标签: 聚类  

资源简介

function [idx, C, sumD, D] = kmeans(X, k, varargin) % varargin:实际输入参量 if nargin 1 % 大于1刚至少有一种距离 error(sprintf('Ambiguous ''distance'' parameter value: %s.', distance)); elseif isempty(i) % 如果是空的,则表明没有合适的距离 error(sprintf('Unknown ''distance'' parameter value: %s.', distance)); end % 针对不同的距离,处理不同 distance = distNames{i}; switch distance case 'cityblock' % sort 列元素按升序排列,Xord中存的是元素在原始矩阵中的列中对应的大小位置 [Xsort,Xord] = sort(X,1); case 'cosine' % 余弦 % 计算每一行的和的平方根 Xnorm = sqrt(sum(X.^2, 2)); if any(min(Xnorm) <= eps * max(Xnorm)) error(['Some points have small relative magnitudes, making them ', ... 'effectively zero.\nEither remove those points, or choose a ', ... 'distance other than ''cosine''.'], []); end % 标量化 Xnorm(:,ones(1,p))得到n*p的矩阵 X = X ./ Xnorm(:,ones(1,p)); case 'correlation' % 线性化 X = X - repmat(mean(X,2),1,p); % 计算每一行的和的平方根 Xnorm = sqrt(sum(X.^2, 2)); if any(min(Xnorm) <= eps * max(Xnorm)) error(['Some points have small relative standard deviations, ma

资源截图

代码片段和文件信息

function [idx C sumD D] = kmeans(X k varargin)
% varargin:实际输入参量

if nargin < 2
    error(‘At least two input arguments required.‘);
end

% n points in p dimensional space
[n p] = size(X);
Xsort = []; Xord = [];

% 变量名称
pnames = {   ‘distance‘  ‘start‘ ‘replicates‘ ‘maxiter‘ ‘emptyaction‘ ‘display‘};
% 变量对应的值
dflts =  {‘sqeuclidean‘ ‘sample‘          []       100        ‘error‘  ‘notify‘};
% 使参数名称与参数值对应
[errmsgdistancestartrepsmaxitemptyactdisplay] ...
                       = statgetargs(pnames dflts varargin{:});
error(errmsg);

% ------------------------------------------------------------------
% 判数距离名称是否为字符数组 对数组X中的元素进行进应的处理
if ischar(distance)
    distNames = {‘sqeuclidean‘‘cityblock‘‘cosine‘‘correlation‘‘hamming‘};
    % lower 把字符串变为小号字母 strmatch 为字符串找到一个合适的匹配,并返回对应的索引
    i = strmatch(lower(distance) distNames);
    if length(i) > 1
        % 大于1刚至少有一种距离
        error(sprintf(‘Ambiguous ‘‘distance‘‘ parameter value:  %s.‘ distance));
    elseif isempty(i)
        % 如果是空的,则表明没有合适的距离
        error(sprintf(‘Unknown ‘‘distance‘‘ parameter value:  %s.‘ distance));
    end
    % 针对不同的距离,处理不同
    distance = distNames{i};
    switch distance 
    case ‘cityblock‘
        % sort 列元素按升序排列,Xord中存的是元素在原始矩阵中的列中对应的大小位置
        [XsortXord] = sort(X1);
    case ‘cosine‘ 
        % 余弦
        % 计算每一行的和的平方根
        Xnorm = sqrt(sum(X.^2 2));
        if any(min(Xnorm) <= eps * max(Xnorm))
            error([‘Some points have small relative magnitudes making them ‘ ...
                   ‘effectively zero.\nEither remove those points or choose a ‘ ...
                   ‘distance other than ‘‘cosine‘‘.‘] []);
        end
        % 标量化 Xnorm(:ones(1p))得到n*p的矩阵
        X = X ./ Xnorm(:ones(1p));
    case ‘correlation‘
        % 线性化
        X = X - repmat(mean(X2)1p);
        % 计算每一行的和的平方根
        Xnorm = sqrt(sum(X.^2 2));
        if any(min(Xnorm) <= eps * max(Xnorm))
            error([‘Some points have small relative standard deviations making them ‘ ...
                   ‘effectively constant.\nEither remove those points or choose a ‘ ...
                   ‘distance other than ‘‘correlation‘‘.‘] []);
        end
        % 标量化
        X = X ./ Xnorm(:ones(1p));
    case ‘hamming‘
        % 加权平均 针对二元元素进行处理
        if ~all(ismember(X(:)[0 1]))
            error(‘Non-binary data cannot be clustered using Hamming distance.‘);
        end
    end
else
    error(‘The ‘‘distance‘‘ parameter value must be a string.‘);
end

% ------------------------------------------------------------------
%  不同的初始聚类中心的选择方法 
if ischar(start)
    startNames = {‘uniform‘‘sample‘‘cluster‘};
    i = strmatch(lower(start) startNames);
    if length(i) > 1
        error(sprintf(‘Ambiguous ‘‘start‘‘ parameter value:  %s.‘ start));
    elseif isempty(i)
        error(sprintf(‘Unknown ‘‘start‘‘ parameter value:  %s.‘ start));
    elseif isempty(k)
        er

评论

共有 条评论