2

私はクラスタのk =#で与えられた4次元データに対してk-平均アルゴリズムを実装しています。私は異なる初期点で約5回走っています。k平均クラスタリングのmatlabの二乗誤差の総和を計算するには?

  1. 各実行後に二乗誤差(SSE)の合計を計算するにはどうすればよいですか?

4 Dimention 1 to 4 and blow 
 
x1 \t 1 \t 2 \t 3 \t 4 
 
x2 \t 5 \t 6 \t 7 \t 8 
 
x3 \t 9 \t 10 \t 11 \t 12 
 
x4 \t 13 \t 14 \t 15 \t 16 
 
x5 \t 17 \t 18 \t 19 \t 20

誰もこれで私を助けることができる場合、私は幸せ以上になります。 ありがとう

+0

組み込みの 'kmeans'関数の使用に問題がありますか、ゼロからビルドしていますか? –

+0

@LeanderMoesingerコメントありがとうございます。実際に私は関数で構築されたkmeansを使用することができますが、matlabのヘルプの例では、クラスタの平均、中心、サイズ、および各クラスタに割り当てられたデータのリストをどのように計算するべきか理解できませんでした。 – Bilgin

答えて

1

kmeans()機能は、既に直接必要なものすべてを提供しています。 (ここでは3値1)

  • idx各観測のラベルである

    [idx,CentreCoordinates,SEE] = kmeans(yourData,3); 
    

  • CentreCoordinatesはクラスタ中心の座標である:これは、以下の3つのクラスタのための構文を有します(各行は1つの中心です)
  • SEEは、最も近いクラスタ中心であるすべての観測のクラスタ内の真理値の距離であるSEEです。

あなたが実際にインデックスを必要としないので、あなたは~(チルダ)で関数の最初の出力を無視することができますが:

[~,CentreCoordinates,SEE] = kmeans(yourData,3); 
+0

.xlsファイルの読み込みに問題がある場合は、 'yourData = xlsread( 'path/to/file/filename.xls'、 'B:E');を実行する必要があります。このように、カラム1は役に立たないので、カラム2:5だけを読み込みます。 –

1

このコードは、作り付けのMATLAB関数「K-手段であります' k-meansのために独自のアルゴリズムで修正する必要があります。これは、クラスタのcentoirdsの計算と二乗誤差の和(派閥とも呼ばれます)を示しています。

clc; close all; clear all; 
data = readtable('data.txt'); % Importing the data-set 
d1 = table2array(data(:, 2)); % Data in first dimension 
d2 = table2array(data(:, 3)); % Data in second dimension 
d3 = table2array(data(:, 4)); % Data in third dimension 
d4 = table2array(data(:, 5)); % Data in fourth dimension 
X = [d1, d2, d3, d4]; % Combining the data into a matrix 
k = 3; % Number of clusters 
idx = kmeans(X, 3); % Alpplying the k-means using inbuilt funciton 
%% Separating the data in different dimension 
d1_1 = d1(idx == 1); % d1 for the data in cluster 1 
d2_1 = d2(idx == 1); % d2 for the data in cluster 1 
d3_1 = d3(idx == 1); % d3 for the data in cluster 1 
d4_1 = d4(idx == 1); % d4 for the data in cluster 1 
%============================== 
d1_2 = d1(idx == 2); % d1 for the data in cluster 2 
d2_2 = d2(idx == 2); % d2 for the data in cluster 2 
d3_2 = d3(idx == 2); % d3 for the data in cluster 2 
d4_2 = d4(idx == 2); % d4 for the data in cluster 2 
%============================== 
d1_3 = d1(idx == 3); % d1 for the data in cluster 3 
d2_3 = d2(idx == 3); % d2 for the data in cluster 3 
d3_3 = d3(idx == 3); % d3 for the data in cluster 3 
d4_3 = d4(idx == 3); % d4 for the data in cluster 3 
%% Finding the co-ordinates of the cluster centroids 
c1_d1 = mean(d1_1); % d1 value of the centroid for cluster 1 
c1_d2 = mean(d2_1); % d2 value of the centroid for cluster 1 
c1_d3 = mean(d3_1); % d2 value of the centroid for cluster 1 
c1_d4 = mean(d4_1); % d2 value of the centroid for cluster 1 
%==================================== 
c2_d1 = mean(d1_2); % d1 value of the centroid for cluster 2 
c2_d2 = mean(d2_2); % d2 value of the centroid for cluster 2 
c2_d3 = mean(d3_2); % d2 value of the centroid for cluster 2 
c2_d4 = mean(d4_2); % d2 value of the centroid for cluster 2 
%==================================== 
c3_d1 = mean(d1_3); % d1 value of the centroid for cluster 3 
c3_d2 = mean(d2_3); % d2 value of the centroid for cluster 3 
c3_d3 = mean(d3_3); % d2 value of the centroid for cluster 3 
c3_d4 = mean(d4_3); % d2 value of the centroid for cluster 3 
%% Calculating the distortion 
distortion = 0; % Initialization 
for n1 = 1 : length(d1_1)  
    distortion = distortion + (((c1_d1 - d1_1(n1)).^2) + ((c1_d2 - d2_1(n1)).^2) + ... 
                ((c1_d3 - d3_1(n1)).^2) + ((c1_d4 - d4_1(n1)).^2));             
end 
for n2 = 1 : length(d1_2)  
    distortion = distortion + (((c2_d1 - d1_2(n2)).^2) + ((c2_d2 - d2_2(n2)).^2) + ... 
                ((c2_d3 - d3_2(n2)).^2) + ((c2_d4 - d4_2(n2)).^2));             
end 
for n3 = 1 : length(d1_3)  
    distortion = distortion + (((c3_d1 - d1_3(n3)).^2) + ((c3_d2 - d2_3(n3)).^2) + ... 
                ((c3_d3 - d3_3(n3)).^2) + ((c3_d4 - d4_3(n3)).^2));             
end 
fprintf('The unnormalized sum of square error is %f\n', distortion); 
fprintf('The co-ordinate of the cluster 1 is \t d1 = %f, d2 = %f, d3 = %f, d4 = %f\n', c1_d1, c1_d2, c1_d3, c1_d4); 
fprintf('The co-ordinate of the cluster 2 is \t d1 = %f, d2 = %f, d3 = %f, d4 = %f\n', c2_d1, c2_d2, c2_d3, c2_d4); 
fprintf('The co-ordinate of the cluster 3 is \t d1 = %f, d2 = %f, d3 = %f, d4 = %f\n', c3_d1, c3_d2, c3_d3, c3_d4); 
+0

'[idx、CentreCoordinates、SEE] = kmeans(X、3);コマンドを使用して回答を確認できます。 –

+0

コメントとコードをありがとう。私はあなたのコードを私の側で何が起こっているか見るために実行しようとしましたが、私はエラーが発生しています: '可変インデックスはテーブルの大きさを超えています'。行6のために: 'd4 = table2array(data(:, 5)); 4次元目のデータ% '。どうしてこのエラーが出ているのか教えてください。ありがとう – Bilgin

+0

**私のバージョン**で、データを保存し、 'data = readtable(' data.txt ');を使用してインポートしたとき、最初の列はデータ番号を含み、2番目の列はd1値を含み、3番目の列はd2値を参照し、4番目の列はd3値を含み、5番目の列はd4値**を含む。それは 'd4 = table2array(data(:、5));'で起こっていることです。あなたのバージョンでは、**データ番号を保存していない可能性があります。そのため、おそらくエラーが発生しています。 –

関連する問題