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