資源簡介
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
- 上一篇:matlab制作哈哈鏡
- 下一篇:FWM 耦合方程 matlab代碼
評論
共有 條評論