kmedoids演算法
① k-medoids演算法對大規模數據性能更好,但伸縮性較差是什麼含義
這個問題其實是無解的,數據不同,演算法的分類效果、實際運行時間也是不同。若單從運算速度而言,k-means比層次更快。原因是K-means是找中心,然後計算距離;層次是逐個樣本逐層合並,層次的演算法復雜度更高。更重要的是,在大數量下,K-means演算法和層次聚類演算法的分類效果真的只能用見仁見智來形容了。
② 聚類演算法有哪些
聚類演算法有:劃分法、層次法、密度演算法、圖論聚類法、網格演算法、模型演算法。
1、劃分法
劃分法(partitioning methods),給定一個有N個元組或者紀錄的數據集,分裂法將構造K個分組,每一個分組就代表一個聚類,K<N。使用這個基本思想的演算法有:K-MEANS演算法、K-MEDOIDS演算法、CLARANS演算法。
2、層次法
層次法(hierarchical methods),這種方法對給定的數據集進行層次似的分解,直到某種條件滿足為止。具體又可分為「自底向上」和「自頂向下」兩種方案。代表演算法有:BIRCH演算法、CURE演算法、CHAMELEON演算法等。
3、密度演算法
基於密度的方法(density-based methods),基於密度的方法與其它方法的一個根本區別是:它不是基於各種各樣的距離的,而是基於密度的。這樣就能克服基於距離的演算法只能發現「類圓形」的聚類的缺點。代表演算法有:DBSCAN演算法、OPTICS演算法、DENCLUE演算法等。
4、圖論聚類法
圖論聚類方法解決的第一步是建立與問題相適應的圖,圖的節點對應於被分析數據的最小單元,圖的邊(或弧)對應於最小處理單元數據之間的相似性度量。因此,每一個最小處理單元數據之間都會有一個度量表達,這就確保了數據的局部特性比較易於處理。圖論聚類法是以樣本數據的局域連接特徵作為聚類的主要信息源,因而其主要優點是易於處理局部數據的特性。
5、網格演算法
基於網格的方法(grid-based methods),這種方法首先將數據空間劃分成為有限個單元(cell)的網格結構,所有的處理都是以單個的單元為對象的。代表演算法有:STING演算法、CLIQUE演算法、WAVE-CLUSTER演算法。
6、模型演算法
基於模型的方法(model-based methods),基於模型的方法給每一個聚類假定一個模型,然後去尋找能夠很好的滿足這個模型的數據集。通常有兩種嘗試方向:統計的方案和神經網路的方案。
(2)kmedoids演算法擴展閱讀:
聚類分析起源於分類學,在古老的分類學中,人們主要依靠經驗和專業知識來實現分類,很少利用數學工具進行定量的分類。隨著人類科學技術的發展,對分類的要求越來越高,以致有時僅憑經驗和專業知識難以確切地進行分類,於是人們逐漸地把數學工具引用到了分類學中,形成了數值分類學,之後又將多元分析的技術引入到數值分類學形成了聚類分析。聚類分析內容非常豐富,有系統聚類法、有序樣品聚類法、動態聚類法、模糊聚類法、圖論聚類法、聚類預報法等。
在商業上,聚類可以幫助市場分析人員從消費者資料庫中區分出不同的消費群體來,並且概括出每一類消費者的消費模式或者說習慣。它作為數據挖掘中的一個模塊,可以作為一個單獨的工具以發現資料庫中分布的一些深層的信息,並且概括出每一類的特點,或者把注意力放在某一個特定的類上以作進一步的分析;並且,聚類分析也可以作為數據挖掘演算法中其他分析演算法的一個預處理步驟。
③ kmedoids函數在哪個matlab里
我把K-mediods的matlab代碼貼出來,你好好學習一下functionlabel=kmedoids(data,k,start_data)%kmedoidsk中心點演算法函數%data待聚類的數據集,每一行是一個樣本數據點%k聚類個數%start_data聚類初始中心值,每一行為一個中心點
④ k-means和gmm在求解聚類問題中的異同
Clustering Algorithms分類
1. Partitioning approach:
建立數據的不同分割,然後用相同標准評價聚類結果。(比如最小化平方誤差和)
典型演算法:K-Means, K-Medoids
2. Model-based:
對於每個類假定一個分布模型,試圖找到每個類最好的模型
典型演算法:GMM(混合高斯)
3. Dimensionality Rection Approach:
先降維,再聚類
典型演算法:Spectral clustering,Ncut
⑤ 聚類演算法的具體方法
k-means 演算法接受輸入量 k ;然後將n個數據對象劃分為 k個聚類以便使得所獲得的聚類滿足:同一聚類中的對象相似度較高;而不同聚類中的對象相似度較小。聚類相似度是利用各聚類中對象的均值所獲得一個「中心對象」(引力中心)來進行計算的。
k-means 演算法的工作過程說明如下:
首先從n個數據對象任意選擇 k 個對象作為初始聚類中心;而對於所剩下其它對象,則根據它們與這些聚類中心的相似度(距離),分別將它們分配給與其最相似的(聚類中心所代表的)聚類;
然後再計算每個所獲新聚類的聚類中心(該聚類中所有對象的均值);不斷重復這一過程直到標准測度函數開始收斂為止。
一般都採用均方差作為標准測度函數. k個聚類具有以下特點:各聚類本身盡可能的緊湊,而各聚類之間盡可能的分開。 K-MEANS有其缺點:產生類的大小相差不會很大,對於臟數據很敏感。
改進的演算法:k—medoids 方法。這兒選取一個對象叫做mediod來代替上面的中心的作用,這樣的一個medoid就標識了這個類。K-medoids和K-means不一樣的地方在於中心點的選取,在K-means中,我們將中心點取為當前cluster中所有數據點的平均值,在 K-medoids演算法中,我們將從當前cluster 中選取這樣一個點——它到其他所有(當前cluster中的)點的距離之和最小——作為中心點。
步驟:
1,任意選取K個對象作為medoids(O1,O2,…Oi…Ok)。
以下是循環的:
2,將餘下的對象分到各個類中去(根據與medoid最相近的原則);
3,對於每個類(Oi)中,順序選取一個Or,計算用Or代替Oi後的消耗—E(Or)。選擇E最小的那個Or來代替Oi。這樣K個medoids就改變了,下面就再轉到2。
4,這樣循環直到K個medoids固定下來。
這種演算法對於臟數據和異常數據不敏感,但計算量顯然要比K均值要大,一般只適合小數據量。 上面提到K-medoids演算法不適合於大數據量的計算。Clara演算法,這是一種基於采樣的方法,它能夠處理大量的數據。
Clara演算法的思想就是用實際數據的抽樣來代替整個數據,然後再在這些抽樣的數據上利用K-medoids演算法得到最佳的medoids。Clara演算法從實際數據中抽取多個采樣,在每個采樣上都用K-medoids演算法得到相應的(O1, O2 … Oi … Ok),然後在這當中選取E最小的一個作為最終的結果。 Clara演算法的效率取決於采樣的大小,一般不太可能得到最佳的結果。
在Clara演算法的基礎上,又提出了Clarans的演算法,與Clara演算法不同的是:在Clara演算法尋找最佳的medoids的過程中,采樣都是不變的。而Clarans演算法在每一次循環的過程中所採用的采樣都是不一樣的。
與上面所講的尋找最佳medoids的過程不同的是,必須人為地來限定循環的次數。
⑥ 我用C++編了一個K-MEDOIDS演算法,有些問題,求大神幫忙看看~
#include <iostream>
#include <stdio.h>
#include <time.h>
using namespace std;
int a[100]={0};
int n=10;
int i=0,k=0;
int flag=0;
int juli(int a,int b)
{
return (a-b)*(a-b);
}
int paixu(int *a)
{
int i1=0;
int jh=0;
int m=0;
for(i1=0;i1<10;i1++)
{ if(a[i1]<a[i1+1] )
{ jh=a[i1];
a[i1]=a[i1+1];
a[i1+1]=jh;
}
else
m=i1+1;
}
return m;//返回數組a中後項小於等於前項的個數
}
int paixu2(int *a)
{
int i1=0;
int jh=0;
int m=0;
for(i1=0;i1<100;i1++)
{ if(a[i1]<a[i1+1] )
{ jh=a[i1];
a[i1]=a[i1+1];
a[i1+1]=jh;
}
else
m=i1+1;
}
return m;
//返回後項小於等於前項的個數
}
void ql(int a[10][100])
{
int i,j;
for(i=0;i<10;i++)
for(j=0;a[i][j]!='\0';j++)
a[i][j]=0;
//為數組a整體賦值為0
}
void zxjuli( int a[10][100],int *b)
{
int i2=0,j2=0,k2=0,l2;
int e[100];
for(i2=0;i2<10;i2++)
{
for(l2=0;e[l2]!='\0';l2++)
e[l2]=0;//為數組e整體賦值為0
for(j2=0;a[i2][j2]!='\0';j2++)
{}//無意義的語句或者說是空語句
for(k2=0;a[i2][k2]!='\0';k2++ )
{
if(k2!=j2)//j2在上個for循環中的值有效作用域僅限於上個for循環的一對{}中
e[j2]+=juli(a[i2][j2],a[i2][k2]);
else
continue;
}
flag=paixu2(e);
b[i2]=a[i2][flag];
}
}
int b[10]={0};
int c[10][100]={0};
int j=0;
int d[10]={0};
int ax[100];
int main()
{
srand((unsigned)time(NULL));
int ix[10]={0};
for(i=0;i<10;i++)
ix[i]=1;
for( i=0;i<100;i++)
{ a[i]= 1+rand()%99;
ax[i]=a[i];
}
for(i=0;i<100;i++)
cout<<a[i]<<" ";
cout<<endl;
int t=0;
for(i=0;i<10;i++)
{
t=1+rand()%99; //隨機選出10個中心
b[i]=a[t];
a[t]=-1;
}
for(i=0;i<10;i++)
c[i][0]=b[i];
for(i=0;i<100;i++)
if(a[i]!=-1)
{ for(k=0;k<10;k++)
{
d[i]=juli(a[i],b[k]);
flag=paixu(d);
}
c[flag][ix[flag]++]=a[i];
}
int ay[90];
for(j=0;j<100;j++)
{
for(i=0;i<10;i++)
ix[i]=1;
zxjuli(c,b);
int t=0;
for(i=0;i<100;i++)
{ for(k=0;k<10;k++)
{ if(ax[i]!=b[k])
flag=1;
else
{flag=0;
break;
}
}
if(flag==1)
ay[t++]=ax[i];
}
ql(c);
c[i][0]=b[i];
for(i=0;i<90;i++)
for(k=0;k<10;k++)
{ d[i]=juli(ay[i],b[k]);
flag=paixu(d);
c[flag][ix[flag]++]=a[i];
}
}
for(i=0;i<10;i++)
for(j=0;c[i][j]!='\0';j++)
cout<<i<<":"<<" "<<c[i][j]<<" ";
cout<<endl;
return 0;
}編寫程序應該見名知意,力求同樣功能的代碼最簡潔。你看看自己寫的程序 for循環就不停的在嵌套 寫的那麼亂 編譯雖然沒問題仍然有幾個bug,非正常中止。再好好改改吧 分數你愛給便給
⑦ 有哪些常用的聚類演算法
聚類分析計算方法主要有如下幾種:
1. 劃分法(partitioning methods)
給定一個有N個元組或者紀錄的數據集,分裂法將構造K個分組,每一個分組就代表一個聚類,K<N。而且這K個分組滿足下列條件:(1) 每一個分組至少包含一個數據紀錄;(2)每一個數據紀錄屬於且僅屬於一個分組(注意:這個要求在某些模糊聚類演算法中可以放寬);對於給定的K,演算法首先給出一個初始的分組方法,以後通過反復迭代的方法改變分組,使得每一次改進之後的分組方案都較前一次好,而所謂好的標准就是:同一分組中的記錄越近越好,而不同分組中的紀錄越遠越好。使用這個基本思想的演算法有:K-MEANS演算法、K-MEDOIDS演算法、CLARANS演算法;
2. 層次法(hierarchical methods)
這種方法對給定的數據集進行層次似的分解,直到某種條件滿足為止。具體又可分為「自底向上」和「自頂向下」兩種方案。例如在「自底向上」方案中,初始時每一個數據紀錄都組成一個單獨的組,在接下來的迭代中,它把那些相互鄰近的組合並成一個組,直到所有的記錄組成一個分組或者某個條件滿足為止。代表演算法有:BIRCH演算法、CURE演算法、CHAMELEON演算法等;
3. 基於密度的方法(density-based methods)
基於密度的方法與其它方法的一個根本區別是:它不是基於各種各樣的距離的,而是基於密度的。這樣就能克服基於距離的演算法只能發現「類圓形」的聚類的缺點。這個方法的指導思想就是,只要一個區域中的點的密度大過某個閥值,就把它加到與之相近的聚類中去。代表演算法有:DBSCAN演算法、OPTICS演算法、DENCLUE演算法等;
4. 基於網格的方法(grid-based methods)
這種方法首先將數據空間劃分成為有限個單元(cell)的網格結構,所有的處理都是以單個的單元為對象的。這么處理的一個突出的優點就是處理速度很快,通常這是與目標資料庫中記錄的個數無關的,它只與把數據空間分為多少個單元有關。代表演算法有:STING演算法、CLIQUE演算法、WAVE-CLUSTER演算法;
5. 基於模型的方法(model-based methods)
基於模型的方法給每一個聚類假定一個模型,然後去尋找能個很好的滿足這個模型的數據集。這樣一個模型可能是數據點在空間中的密度分布函數或者其它。它的一個潛在的假定就是:目標數據集是由一系列的概率分布所決定的。通常有兩種嘗試方向:統計的方案和神經網路的方案。
⑧ 怎麼用Matlab計算聚類演算法的正確率問題
我把K-mediods的matlab代碼貼出來,你好好學習一下
function label = kmedoids( data,k,start_data )
% kmedoids k中心點演算法函數
% data 待聚類的數據集,每一行是一個樣本數據點
% k 聚類個數
% start_data 聚類初始中心值,每一行為一個中心點,有cluster_n行
% class_idx 聚類結果,每個樣本點標記的類別
% 初始化變數
n = length(data);
dist_temp1 = zeros(n,k);
dist_temp2 = zeros(n,k);
last = zeros(n,1);
a = 0;
b = 0;
if nargin==3
centroid = start_data;
else
centroid = data(randsample(n,k),:);
end
for a = 1:k
temp1 = ones(n,1)*centroid(a,:);
dist_temp1(:,a) = sum((data-temp1).^2,2);
end
[~,label] = min(dist_temp1,[],2);
while any(label~=last)
for a = 1:k
temp2 = ones(numel(data(label==a)),1);
temp3 = data(label==a);
for b = 1:n
temp4 = temp2*data(b,:);
temp5 = sum((temp3-temp4).^2,2);
dist_temp2(b,a) = sum(temp5,1);
end
end
[~,centry_indx] = min(dist_temp2,[],1);
last = label;
centroid = data(centry_indx,:);
for a = 1:k
temp1 = ones(n,1)*centroid(a,:);
dist_temp1(:,a) = sum((data-temp1).^2,2);
end
[~,label] = min(dist_temp1,[],2);
end
end
⑨ sparkr做kmeans 聚類能指定迭代次數嗎怎麼指定
我把K-mediods的matlab代碼貼出來,你好好學習一下
function label = kmedoids( data,k,start_data )
% kmedoids k中心點演算法函數
% data 待聚類的數據集,每一行是一個樣本數據點
% k 聚類個數
% start_data 聚類初始中心值,每一行為一個中心點,有cluster_n行
% class_idx 聚類結果,每個樣本點標記的類別
% 初始化變數
n = length(data);
dist_temp1 = zeros(n,k);
dist_temp2 = zeros(n,k);
last = zeros(n,1);
a = 0;
b = 0;
if nargin==3
centroid = start_data;
else
centroid = data(randsample(n,k),:);
end
for a = 1:k
temp1 = ones(n,1)*centroid(a,:);
dist_temp1(:,a) = sum((data-temp1).^2,2);
end
[~,label] = min(dist_temp1,[],2);
while any(label~=last)
for a = 1:k
temp2 = ones(numel(data(label==a)),1);
temp3 = data(label==a);
for b = 1:n
temp4 = temp2*data(b,:);
temp5 = sum((temp3-temp4).^2,2);
dist_temp2(b,a) = sum(temp5,1);
end
end
[~,centry_indx] = min(dist_temp2,[],1);
last = label;
centroid = data(centry_indx,:);
for a = 1:k
temp1 = ones(n,1)*centroid(a,:);
dist_temp1(:,a) = sum((data-temp1).^2,2);
end
[~,label] = min(dist_temp1,[],2);
end
end
⑩ 請高手幫忙編寫關於K—mediods演算法的MATLAB程序用於處理Iris數據集的聚類處理,得到迭代次數圖形和准確率
我把K-mediods的matlab代碼貼出來,你好好學習一下
function label = kmedoids( data,k,start_data )
% kmedoids k中心點演算法函數
% data 待聚類的數據集,每一行是一個樣本數據點
% k 聚類個數
% start_data 聚類初始中心值,每一行為一個中心點,有cluster_n行
% class_idx 聚類結果,每個樣本點標記的類別
% 初始化變數
n = length(data);
dist_temp1 = zeros(n,k);
dist_temp2 = zeros(n,k);
last = zeros(n,1);
a = 0;
b = 0;
if nargin==3
centroid = start_data;
else
centroid = data(randsample(n,k),:);
end
for a = 1:k
temp1 = ones(n,1)*centroid(a,:);
dist_temp1(:,a) = sum((data-temp1).^2,2);
end
[~,label] = min(dist_temp1,[],2);
while any(label~=last)
for a = 1:k
temp2 = ones(numel(data(label==a)),1);
temp3 = data(label==a);
for b = 1:n
temp4 = temp2*data(b,:);
temp5 = sum((temp3-temp4).^2,2);
dist_temp2(b,a) = sum(temp5,1);
end
end
[~,centry_indx] = min(dist_temp2,[],1);
last = label;
centroid = data(centry_indx,:);
for a = 1:k
temp1 = ones(n,1)*centroid(a,:);
dist_temp1(:,a) = sum((data-temp1).^2,2);
end
[~,label] = min(dist_temp1,[],2);
end
end