做者:凱魯嘎吉 - 博客園 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後面添加本身的方法。ide