日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

matlab编程实现k_means聚类(k均值聚类)

發布時間:2023/11/27 生活经验 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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. 其他說明

  1. k_means聚類算法簡單,學聚類第一個接觸的聚類算法幾乎都是k_means聚類。k_menas聚類有兩大重要的缺點:
    其一:需要知道聚類的類別數量
    其二:可能收斂到局部最優解
    但是類別的數量有方法可以估計出來,估計方法這里不在贅述,讀者可查閱其他資料。在不需要實時應用時,也可以多次嘗試選擇最佳聚類數量。局部最優的情況也可以通過多次聚類來彌補。所以k_means聚類的特點可以歸納為:簡單,但是一般夠用。
  2. 本函數中使用了歐拉距離作為距離的度量,也可以選擇其他距離,更改函數代碼中的pdist2函數的距離參數即可。

總結

以上是生活随笔為你收集整理的matlab编程实现k_means聚类(k均值聚类)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。