K means演算法下

2021-07-15 05:57:57 字數 3219 閱讀 9810

聚類演算法,不是分類演算法。

分類演算法是給乙個資料,然後判斷這個資料屬於已分好的類中的具體哪一類。

聚類演算法是給一大堆原始資料,然後通過演算法將其中具有相似特徵的資料聚為一類。

這裡的k-means聚類,是事先給出原始資料所含的類數,然後將含有相似特徵的資料聚為乙個類中。

所有資料中還是andrew ng介紹的明白。

首先給出原始資料,這些資料沒有被標記的。

初始化k個隨機資料u1,u2,...,uk。這些xn和uk都是向量。

根據下面兩個公式迭代就能求出最終所有的u,這些u就是最終所有類的中心位置。

公式一:

意思就是求出所有資料和初始化的隨機資料的距離,然後找出距離每個初始資料最近的資料。

公式二:

意思就是求出所有和這個初始資料最近原始資料的距離的均值。

然後不斷迭代兩個公式,直到所有的u都不怎麼變化了,就算完成了。

先看看一些結果:

用三個二維高斯分布資料畫出的圖:

通過對沒有標記的原始資料進行kmeans聚類得到的分類,十字是最終迭代位置:

下面是matlab**,這裡我把測試資料改為了三維了,函式是可以處理各種維度的。

main.m

clear all;

close all;

clc;

%第一類資料

mu1=[0 0 0]; %均值

s1=[0.3 0 0;0 0.35 0;0 0 0.3]; %協方差

data1=mvnrnd(mu1,s1,100); %產生高斯分布資料

%%第二類資料

mu2=[1.25 1.25 1.25];

s2=[0.3 0 0;0 0.35 0;0 0 0.3];

data2=mvnrnd(mu2,s2,100);

%第三個類資料

mu3=[-1.25 1.25 -1.25];

s3=[0.3 0 0;0 0.35 0;0 0 0.3];

data3=mvnrnd(mu3,s3,100);

%顯示資料

plot3(data1(:,1),data1(:,2),data1(:,3),'+');

hold on;

plot3(data2(:,1),data2(:,2),data2(:,3),'r+');

plot3(data3(:,1),data3(:,2),data3(:,3),'g+');

grid on;

%三類資料合成乙個不帶標號的資料類

data=[data1;data2;data3]; %這裡的data是不帶標號的

%k-means聚類

[u re]=kmeans(data,3); %最後產生帶標號的資料,標號在所有資料的最後,意思就是資料再加一維度

[m n]=size(re);

%最後顯示聚類後的資料

figure;

hold on;

for i=1:m

if re(i,4)==1

plot3(re(i,1),re(i,2),re(i,3),'ro');

elseif re(i,4)==2

plot3(re(i,1),re(i,2),re(i,3),'go');

else

plot3(re(i,1),re(i,2),re(i,3),'bo');

endendgrid on;

kmeans.m

%n是資料一共分多少類

%data是輸入的不帶分類標號的資料

%u是每一類的中心

%re是返回的帶分類標號的資料

function [u re]=kmeans(data,n)

[m n]=size(data); %m是資料個數,n是資料維數

ma=zeros(n); %每一維最大的數

mi=zeros(n); %每一維最小的數

u=zeros(n,n); %隨機初始化,最終迭代到每一類的中心位置

for i=1:n

ma(i)=max(data(:,i)); %每一維最大的數

mi(i)=min(data(:,i)); %每一維最小的數

for j=1:n

u(j,i)=ma(i)+(mi(i)-ma(i))*rand(); %隨機初始化,不過還是在每一維[min max]中初始化好些

end

endwhile 1

pre_u=u; %上一次求得的中心位置

for i=1:n

tmp=; % 公式一中的x(i)-uj,為公式一實現做準備

for j=1:m

tmp=[tmp;data(j,:)-u(i,:)];

endend

quan=zeros(m,n);

for i=1:m %公式一的實現

c=;for j=1:n

c=[c norm(tmp(i,:))];

end[junk index]=min(c);

quan(i,index)=norm(tmp(i,:));

endfor i=1:n %公式二的實現

for j=1:n

u(i,j)=sum(quan(:,i).*data(:,j))/sum(quan(:,i));

end

endif norm(pre_u-u)<0.1 %不斷迭代直到位置不再變化

break;

endend

re=;

for i=1:m

tmp=;

for j=1:n

tmp=[tmp norm(data(i,:)-u(j,:))];

end[junk index]=min(tmp);

re=[re;data(i,:) index];

endend

k means演算法不足

a.k 不確定 對於初始條件和聚類的個數 k 並沒有乙個標準的方法來給定。初始條件不同會對結果產生比較大的影響,因為有時演算法會跳入區域性最優。所以解決方法之一,就是多次執行演算法,隨機分割,比較結果之間的差異。b.區域性最優 如果要達到全域性最優,需要用到其他一些技術,比如模擬退火或者遺傳演算法等...

Kmeans演算法實現

include opencv2 highgui highgui.hpp include opencv2 core core.hpp include using namespace cv using namespace std static void help int main int argc ch...

K means演算法上

在資料探勘中,k means演算法是一種cluster analysis的演算法,其主要是來計算資料聚集的演算法,主要通過不斷地取離種子點最近均值的演算法。問題k means演算法主要解決的問題如下圖所示。我們可以看到,在圖的左邊有一些點,我們用肉眼可以看出來有四個點群,但是我們怎麼通過電腦程式找出...