xiaoxue 2019-11-08
作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/
function label=init_methods(data, K, choose) % 输入:无标签数据,聚类数,选择方法 % 输出:聚类标签 if choose==1 %随机初始化,随机选K行作为聚类中心,并用欧氏距离计算其他点到其聚类,将数据集分为K类,输出每个样例的类标签 [X_num, ~]=size(data); rand_array=randperm(X_num); %产生1~X_num之间整数的随机排列 para_miu=data(rand_array(1:K), :); %随机排列取前K个数,在X矩阵中取这K行作为初始聚类中心 %欧氏距离,计算(X-para_miu)^2=X^2+para_miu^2-2*X*para_miu‘,矩阵大小为X_num*K distant=repmat(sum(data.*data,2),1,K)+repmat(sum(para_miu.*para_miu,2)‘,X_num,1)-2*data*para_miu‘; %返回distant每行最小值所在的下标 [~,label]=min(distant,[],2); elseif choose==2 %用kmeans进行初始化聚类,将数据集聚为K类,输出每个样例的类标签 label=kmeans(data, K); elseif choose==3 %用FCM算法进行初始化 options=[NaN, NaN, NaN, 0]; [~, responsivity]=fcm(data, K, options); %用FCM算法求出隶属度矩阵 [~, label]=max(responsivity‘, [], 2); end
function data = normlization(data, choose) % 数据归一化 if choose==0 % 不归一化 data = data; elseif choose==1 % Z-score归一化 data = bsxfun(@minus, data, mean(data)); data = bsxfun(@rdivide, data, std(data)); elseif choose==2 % 最大-最小归一化处理 [data_num,~]=size(data); data=(data-ones(data_num,1)*min(data))./(ones(data_num,1)*(max(data)-min(data))); end
注意:可以在elseif后面添加自己的方法。