matlab编程实现k_means聚类(k均值聚类)
1. 聚類(lèi)的定義
以下內(nèi)容摘抄自周志華《機(jī)器學(xué)習(xí)》
根據(jù)訓(xùn)練數(shù)據(jù)是否擁有標(biāo)記信息,機(jī)器學(xué)習(xí)任務(wù)可以大致分為兩大類(lèi):“監(jiān)督學(xué)習(xí)”(supervised learning)和“無(wú)監(jiān)督學(xué)習(xí)”(unsupervised learning)。分類(lèi)和回歸是監(jiān)督學(xué)習(xí)的代表,而聚類(lèi)則是無(wú)監(jiān)督學(xué)習(xí)的代表。
聚類(lèi)試圖將數(shù)據(jù)集中的樣本劃分為若干個(gè)通常是不相交的子集,每個(gè)子集稱(chēng)為一個(gè)“簇”(cluster),通過(guò)這樣的劃分,每個(gè)簇可能對(duì)應(yīng)一些潛在的概念(類(lèi)別),而這些類(lèi)別概念相對(duì)于聚類(lèi)算法而言,事先是未知的,聚類(lèi)過(guò)程只能自動(dòng)形成簇結(jié)構(gòu),簇所對(duì)應(yīng)的概念語(yǔ)義需由使用者來(lái)把握和命名。
2. k_means聚類(lèi)原理
k_means聚類(lèi)流程圖如下
3. k_means聚類(lèi)函數(shù)代碼
function T = k_means(data, m, num, e)
% 本函數(shù)用于k_means聚類(lèi)
% 輸入data為聚類(lèi)數(shù)據(jù),每行一個(gè)數(shù)據(jù)點(diǎn)
% 輸入m為簇的數(shù)量
% 輸入num為最大迭代次數(shù)
% 輸入e為閾值,指標(biāo)為質(zhì)心距離矩陣的跡,即更新前后質(zhì)心距離之和
% 輸出T為數(shù)據(jù)對(duì)應(yīng)的類(lèi)別號(hào)組成的序列
% 輸出文件'.\centroid.txt',記錄迭代次數(shù)及每次迭代的各類(lèi)質(zhì)心變化情況% 數(shù)據(jù)維數(shù)
datadim = length(data(1, :));
% 總數(shù)據(jù)量
n = length(data(:, 1));
% 定義類(lèi)別標(biāo)記列表
T = zeros(n, 1);% 得到初始m個(gè)質(zhì)心
r = randperm(n, m);
C0 = rand(m, datadim);
for k = 1 : mC0(k, :) = data(r(k), :);
end
C1 = zeros(m, datadim);
Num = 0;% 打開(kāi)文件
file = fopen('.\centroid.txt', 'wt');
%將寫(xiě)入指針移動(dòng)至文章的開(kāi)頭
frewind(file);
% 如果兩組質(zhì)心之間的距離矩陣的跡仍大于閾值e,并且迭代次數(shù)沒(méi)超過(guò)num,則進(jìn)行循環(huán)
if file > 0while (trace(pdist2(C0, C1)) > e) && (Num <= num)for i = 1 : nmind = pdist2(data(i, :), C0(1, :));for j = 1 : mif pdist2(data(i, :), C0(j, :)) <= mindT(i) = j;mind = pdist2(data(i, :), C0(j, :));endendend% 更新質(zhì)心C1 = C0;fprintf(file, '%d\n', Num);for j = 1 : mfor k = 1 : datadimfprintf(file, '%f,\t', C0(j, k));C0(j, k) = mean(data(T==j, k));endfprintf(file, '\n');endNum = Num + 1;endfclose(file);
end
主函數(shù):
% model_class = 3;
% dim = 3;
% % 期望值
% m = [0, 0, 0;
% 2, 2, 2;
% -2, -2, -2];
% % 協(xié)方差陣
% s(:, :, 1) = [0.2, 0, 0;
% 0, 0.2, 0;
% 0, 0, 0.2];
% s(:, :, 2) = [0.5, 0, 0;
% 0, 0.5, 0;
% 0, 0, 0.5];
% s(:, :, 3) = [0.5, 0, 0;
% 0, 0.5, 0;
% 0, 0, 0.5];
%
% num = [5000, 5000, 5000];
% data = generate_data_GMM(dim, model_class, m, s, num);
iris = load('iris.txt');
data = iris(:, (1:4));
T = k_means(data, 3, 30, 0.05);
注:主函數(shù)給了兩個(gè)例子,一個(gè)是基于高斯分布數(shù)據(jù),一個(gè)是基于鳶尾花測(cè)試數(shù)據(jù)。這里高斯分布數(shù)據(jù)用到了筆者自編寫(xiě)的generate_data_GMM函數(shù),這個(gè)函數(shù)詳細(xì)說(shuō)明及代碼請(qǐng)查看:
matlab生成多組多維高斯分布數(shù)據(jù)
4. 其他說(shuō)明
- k_means聚類(lèi)算法簡(jiǎn)單,學(xué)聚類(lèi)第一個(gè)接觸的聚類(lèi)算法幾乎都是k_means聚類(lèi)。k_menas聚類(lèi)有兩大重要的缺點(diǎn):
其一:需要知道聚類(lèi)的類(lèi)別數(shù)量
其二:可能收斂到局部最優(yōu)解
但是類(lèi)別的數(shù)量有方法可以估計(jì)出來(lái),估計(jì)方法這里不在贅述,讀者可查閱其他資料。在不需要實(shí)時(shí)應(yīng)用時(shí),也可以多次嘗試選擇最佳聚類(lèi)數(shù)量。局部最優(yōu)的情況也可以通過(guò)多次聚類(lèi)來(lái)彌補(bǔ)。所以k_means聚類(lèi)的特點(diǎn)可以歸納為:簡(jiǎn)單,但是一般夠用。 - 本函數(shù)中使用了歐拉距離作為距離的度量,也可以選擇其他距離,更改函數(shù)代碼中的pdist2函數(shù)的距離參數(shù)即可。
總結(jié)
以上是生活随笔為你收集整理的matlab编程实现k_means聚类(k均值聚类)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 求一本小说,女主被绑架老公为了小三没去救
- 下一篇: matlab编程实现基于密度的聚类(DB