當前位置:首頁 » 操作系統 » 聚類演算法代碼

聚類演算法代碼

發布時間: 2022-08-27 17:22:52

㈠ matlab中聚類演算法

聚類分析的概念主要是來自多元統計分析,例如,考慮二維坐標繫上有散落的許多點,這時,需要對散點進行合理的分類,就需要聚類方面的知識。模糊聚類分析方法主要針對的是這樣的問題:對於樣本空間P中的元素含有多個屬性,要求對其中的元素進行合理的分類。最終可以以聚類圖的形式加以呈現,而聚類圖可以以手式和自動生成兩種方式進行,這里採用自動生成方式,亦是本文的程序實現過程中的一個關鍵環節。 這里所實現的基本的模糊聚類的主要過程是一些成文的方法,在此簡述如下: 對於待分類的一個樣本集U=,設其中的每個元素有m項指標,則可以用m維向量描述樣本,即:ui=(i=1,2,...,n)。則其相應的模糊聚類按下列步驟進行:1) 標准化處理,將數據壓縮至(0-1)區間上,這部分內容相對簡單,介紹略。(參[1])2) 建立模糊關系:這里比較重要的環節之一,首先是根據逗距離地或其它進行比較的觀點及方法建立模糊相似矩陣,主要的逗距離地有:Hamming 距離: d(i,j)=sum(abs(x(i,k)-x(j,k))) | k from 1 to m (| k from 1 to m表示求和式中的系數k由1增至m,下同)Euclid 距離: d(i,j)=sum((x(i,k)-x(j,k))^2) | k from 1 to m 非距離方法中,最經典的就是一個夾角餘弦法: 最終進行模糊聚類分析的是要求對一個模糊等價矩陣進行聚類分析,而由相似矩陣變換到等價矩陣,由於相似矩陣已滿足對稱性及自反性,並不一定滿足傳遞性,則變換過程主要進行對相似矩陣進行滿足傳遞性的操作。使關系滿足傳遞性的演算法中,最出名的,就是Washall演算法了,又稱傳遞閉包法(它的思想在最短路的Floyd演算法中亦被使用了)。 演算法相當簡潔明了,復雜度稍大:O(log2(n)*n^3),其實就是把一個方陣的自乘操作,只不過這里用集合操作的交和並取代了原先矩陣操作中的*和+操作,如下:(matlab代碼)%--washall enclosure algorithm--%unchanged=0;while unchanged==0 unchanged=1; %--sigma:i=1:n(combine(conj(cArr(i,k),cArr(k,j)))) for i=1:cArrSize for j=1:cArrSize mergeVal=0; for k=1:cArrSize if(cArr(i,k)<=cArr(k,j)&&cArr(i,k)>mergeVal) mergeVal=cArr(i,k); elseif(cArr(i,k)>cArr(k,j)&&cArr(k,j)>mergeVal) mergeVal=cArr(k,j); end end if(mergeVal>cArr(i,j)) CArr(i,j)=mergeVal; unchanged=0; else CArr(i,j)=cArr(i,j); end end end %-- back--% for i=1:cArrSize for j=1:cArrSize cArr(i,j)=CArr(i,j); end endend

㈡ 新手剛剛接觸,想用matlab做一個雙聚類演算法(cheng and church),如何著手

看工具箱啊,裡面常見演算法floc,cc之類的都有。

㈢ 用python2.7做kmeans聚類演算法怎麼導入數據

指定文件名
問題描述:一堆二維數據,用kmeans演算法對其進行聚類,下面例子以分k=3為例。
原數據:
1.5,3.1
2.2,2.9
3,4
2,1
15,25
43,13
32,42
0,0
8,9
12,5
9,12
11,8
22,33
24,25

實現代碼:

[python] view plain
#coding:utf-8
from numpy import *
import string
import math

def loadDataSet(filename):
dataMat = []
fr = open(filename)
for line in fr.readlines():
element = line.strip('\n').split(',')
number = []
for i in range(len(element)):
number.append(string.atof(element[i]))
dataMat.append(number)
return dataMat

def distEclud(vecA, vecB):
count = len(vecA)
s = 0.0
for i in range(0, count):
s = s + power(vecA[i]-vecB[i], 2)
return sqrt(s)

def clusterOfElement(means, element):
min_dist = distEclud(means[0], element)
lable = 0
for index in range(1, len(means)):
dist = distEclud(means[index], element)
if(dist < min_dist):
min_dist = dist
lable = index
return lable

def getMean(cluster): #cluster=[[[1,2],[1,2],[1,2]....],[[2,1],[2,1],[2,1],[2,1]...]]
num = len(cluster) #1個簇的num,如上為3個
res = []
temp = 0
dim = len(cluster[0])
for i in range(0, dim):
for j in range(0, num):
temp = temp + cluster[j][i]
temp = temp / num
res.append(temp)
return res

def kMeans():
k = 3
data = loadDataSet('data.txt')
print "data is ", data
inite_mean = [[1.1, 1], [1, 1],[1,2]]

count = 0
while(count < 1000):
count = count + 1
clusters = []
means = []
for i in range(k):
clusters.append([])
means.append([])

for index in range(len(data)):
lable = clusterOfElement(inite_mean, data[index])
clusters[lable].append(data[index])

for cluster_index in range(k):
mea = getMean(clusters[cluster_index])
for mean_dim in range(len(mea)):
means[cluster_index].append(mea[mean_dim])

for mm in range(len(means)):
for mmm in range(len(means[mm])):
inite_mean[mm][mmm] = means[mm][mmm]

print "result cluster is ", clusters
print "result means is ", inite_mean

kMeans()

㈣ 大數據分析之聚類演算法

大數據分析之聚類演算法
1. 什麼是聚類演算法
所謂聚類,就是比如給定一些元素或者對象,分散存儲資料庫中,然後根據我們感興趣的對象屬性,對其進行聚集,同類的對象之間相似度高,不同類之間差異較大。最大特點就是事先不確定類別。
這其中最經典的演算法就是KMeans演算法,這是最常用的聚類演算法,主要思想是:在給定K值和K個初始類簇中心點的情況下,把每個點(亦即數據記錄)分到離其最近的類簇中心點所代表的類簇中,所有點分配完畢之後,根據一個類簇內的所有點重新計算該類簇的中心點(取平均值),然後再迭代的進行分配點和更新類簇中心點的步驟,直至類簇中心點的變化很小,或者達到指定的迭代次數。
KMeans演算法本身思想比較簡單,但是合理的確定K值和K個初始類簇中心點對於聚類效果的好壞有很大的影響。
聚類演算法實現
假設對象集合為D,准備劃分為k個簇。
基本演算法步驟如下:
1、從D中隨機取k個元素,作為k個簇的各自的中心。
2、分別計算剩下的元素到k個簇中心的相異度,將這些元素分別劃歸到相異度最低的簇。
3、根據聚類結果,重新計算k個簇各自的中心,計算方法是取簇中所有元素各自維度的算術平均數。
4、將D中全部元素按照新的中心重新聚類。
5、重復第4步,直到聚類結果不再變化。
6、將結果輸出。

核心java代碼如下:
/**
* 迭代計算每個點到各個中心點的距離,選擇最小距離將該點劃入到合適的分組聚類中,反復進行,直到
* 分組不再變化或者各個中心點不再變化為止。
* @return
*/
public List[] comput() {
List[] results = new ArrayList[k];//為k個分組,分別定義一個聚簇集合,未來放入元素。

boolean centerchange = true;//該變數存儲中心點是否發生變化
while (centerchange) {
iterCount++;//存儲迭代次數
centerchange = false;
for (int i = 0; i < k; i++) {
results[i] = new ArrayList<T>();
}
for (int i = 0; i < players.size(); i++) {
T p = players.get(i);
double[] dists = new double[k];
for (int j = 0; j < initPlayers.size(); j++) {
T initP = initPlayers.get(j);
/* 計算距離 這里採用的公式是兩個對象相關屬性的平方和,最後求開方*/
double dist = distance(initP, p);
dists[j] = dist;
}

int dist_index = computOrder(dists);//計算該點到各個質心的距離的最小值,獲得下標
results[dist_index].add(p);//劃分到對應的分組。
}
/*
* 將點聚類之後,重新尋找每個簇的新的中心點,根據每個點的關注屬性的平均值確立新的質心。
*/
for (int i = 0; i < k; i++) {
T player_new = findNewCenter(results[i]);
System.out.println("第"+iterCount+"次迭代,中心點是:"+player_new.toString());
T player_old = initPlayers.get(i);
if (!IsPlayerEqual(player_new, player_old)) {
centerchange = true;
initPlayers.set(i, player_new);
}

}

}

return results;
}
上面代碼是其中核心代碼,我們根據對象集合List和提前設定的k個聚集,最終完成聚類。我們測試一下,假設要測試根據NBA球員的場均得分情況,進行得分高中低的聚集,很簡單,高得分在一組,中等一組,低得分一組。
我們定義一個Player類,裡面有屬性goal,並錄入數據。並設定分組數目為k=3。
測試代碼如下:
List listPlayers = new ArrayList();
Player p1 = new Player();
p1.setName(「mrchi1」);
p1.setGoal(1);
p1.setAssists(8);
listPlayers.add(p1);

Player p2 = new Player();
p2.setName("mrchi2");
p2.setGoal(2);
listPlayers.add(p2);

Player p3 = new Player();
p3.setName("mrchi3");
p3.setGoal(3);
listPlayers.add(p3);
//其他對象定義此處略。製造幾個球員的對象即可。
Kmeans<Player> kmeans = new Kmeans<Player>(listPlayers, 3);
List<Player>[] results = kmeans.comput();
for (int i = 0; i < results.length; i++) {
System.out.println("類別" + (i + 1) + "聚集了以下球員:");
List<Player> list = results[i];
for (Player p : list) {
System.out.println(p.getName() + "--->" + p.getGoal()

}
}
演算法運行結果:

可以看出中心點經歷了四次迭代變化,最終分類結果也確實是相近得分的分到了一組。當然這種演算法有缺點,首先就是初始的k個中心點的確定非常重要,結果也有差異。可以選擇彼此距離盡可能遠的K個點,也可以先對數據用層次聚類演算法進行聚類,得到K個簇之後,從每個類簇中選擇一個點,該點可以是該類簇的中心點,或者是距離類簇中心點最近的那個點。

㈤ k-means聚類演算法的java代碼實現文本聚類

K-MEANS演算法:
k-means 演算法接受輸入量 k ;然後將n個數據對象劃分為 k個聚類以便使得所獲得的聚類滿足:同一聚類中的對象相似度較高;而不同聚類中的對象相似度較小。聚類相似度是利用各聚類中對象的均值所獲得一個「中心對象」(引力中心)來進行計算的。

k-means 演算法的工作過程說明如下:首先從n個數據對象任意選擇 k 個對象作為初始聚類中心;而對於所剩下其它對象,則根據它們與這些聚類中心的相似度(距離),分別將它們分配給與其最相似的(聚類中心所代表的)聚類;然後再計算每個所獲新聚類的聚類中心(該聚類中所有對象的均值);不斷重復這一過程直到標准測度函數開始收斂為止。一般都採用均方差作為標准測度函數. k個聚類具有以下特點:各聚類本身盡可能的緊湊,而各聚類之間盡可能的分開。

具體如下:
輸入:k, data[n];
(1) 選擇k個初始中心點,例如c[0]=data[0],…c[k-1]=data[k-1];
(2) 對於data[0]….data[n], 分別與c[0]…c[n-1]比較,假定與c[i]差值最少,就標記為i;
(3) 對於所有標記為i點,重新計算c[i]=/標記為i的個數;
(4) 重復(2)(3),直到所有c[i]值的變化小於給定閾值。

演算法實現起來應該很容易,就不幫你編寫代碼了。

㈥ 用python K值聚類識別圖片主要顏色的程序,演算法python代碼已經有了

難得被人求助一次, 這個必須回答一下. 不過你的需求確實沒有寫得太清楚. 根據k值演算法出來的是主要顏色有三個, 所以我把三個顏色都打在記事本里了. 如果和你的需求有誤, 請自行解決吧.


另外這里需要用到numpy的庫, 希望你裝了, 如果沒裝, 這個直接安裝也比較麻煩, 可以看一下portablepython的綠色版。


代碼如下:


#-*-coding:utf-8-*-
importImage
importrandom
importnumpy
classCluster(object):
def__init__(self):
self.pixels=[]
self.centroid=None
defaddPoint(self,pixel):
self.pixels.append(pixel)
defsetNewCentroid(self):
R=[colour[0]forcolourinself.pixels]
G=[colour[1]forcolourinself.pixels]
B=[colour[2]forcolourinself.pixels]
R=sum(R)/len(R)
G=sum(G)/len(G)
B=sum(B)/len(B)
self.centroid=(R,G,B)
self.pixels=[]
returnself.centroid
classKmeans(object):
def__init__(self,k=3,max_iterations=5,min_distance=5.0,size=200):
self.k=k
self.max_iterations=max_iterations
self.min_distance=min_distance
self.size=(size,size)
defrun(self,image):
self.image=image
self.image.thumbnail(self.size)
self.pixels=numpy.array(image.getdata(),dtype=numpy.uint8)
self.clusters=[Noneforiinrange(self.k)]
self.oldClusters=None
randomPixels=random.sample(self.pixels,self.k)
foridxinrange(self.k):
self.clusters[idx]=Cluster()
self.clusters[idx].centroid=randomPixels[idx]
iterations=0
whileself.shouldExit(iterations)isFalse:
self.oldClusters=[cluster.centroidforclusterinself.clusters]
printiterations
forpixelinself.pixels:
self.assignClusters(pixel)
forclusterinself.clusters:
cluster.setNewCentroid()
iterations+=1
return[cluster.centroidforclusterinself.clusters]
defassignClusters(self,pixel):
shortest=float('Inf')
forclusterinself.clusters:
distance=self.calcDistance(cluster.centroid,pixel)
ifdistance<shortest:
shortest=distance
nearest=cluster
nearest.addPoint(pixel)
defcalcDistance(self,a,b):
result=numpy.sqrt(sum((a-b)**2))
returnresult
defshouldExit(self,iterations):
ifself.oldClustersisNone:
returnFalse
foridxinrange(self.k):
dist=self.calcDistance(
numpy.array(self.clusters[idx].centroid),
numpy.array(self.oldClusters[idx])
)
ifdist<self.min_distance:
returnTrue
ifiterations<=self.max_iterations:
returnFalse
returnTrue
#############################################
#
defshowImage(self):
self.image.show()
defshowCentroidColours(self):
forclusterinself.clusters:
image=Image.new("RGB",(200,200),cluster.centroid)
image.show()
defshowClustering(self):
localPixels=[None]*len(self.image.getdata())
foridx,pixelinenumerate(self.pixels):
shortest=float('Inf')
forclusterinself.clusters:
distance=self.calcDistance(
cluster.centroid,
pixel
)
ifdistance<shortest:
shortest=distance
nearest=cluster
localPixels[idx]=nearest.centroid
w,h=self.image.size
localPixels=numpy.asarray(localPixels)
.astype('uint8')
.reshape((h,w,3))
colourMap=Image.fromarray(localPixels)
colourMap.show()

if__name__=="__main__":
fromPILimportImage
importos

k_image=Kmeans()
path=r'.\pics\'
fp=open('file_color.txt','w')
forfilenameinos.listdir(path):
printpath+filename
try:
color=k_image.run(Image.open(path+filename))
fp.write('Thecolorof'+filename+'is'+str(color)+' ')
except:
print"Thisfileformatisnotsupport"
fp.close()

㈦ 求MATLAB實現canopy-kmeans聚類演算法的完整代碼

canopy聚類演算法的MATLAB程序

㈧ OPTICS聚類演算法的matlab實現

OPTICS聚類演算法代碼,從http://www.pudn.com/downloads238/sourcecode/math/detail1113278.html
該處下載。
% -------------------------------------------------------------------------
% Function:
% [RD,CD,order]=optics(x,k)
% -------------------------------------------------------------------------
% Aim:
% Ordering objects of a data set to obtain the clustering structure
% -------------------------------------------------------------------------
% Input:
% x - data set (m,n); m-objects, n-variables
% k - number of objects in a neighborhood of the selected object
% (minimal number of objects considered as a cluster)
% -------------------------------------------------------------------------
% Output:
% RD - vector with reachability distances (m,1)
% CD - vector with core distances (m,1)
% order - vector specifying the order of objects (1,m)
% -------------------------------------------------------------------------
% Example of use:
% x=[randn(30,2)*.4;randn(40,2)*.5+ones(40,1)*[4 4]];
% [RD,CD,order]=optics(x,4)
% -------------------------------------------------------------------------
%

function [RD,CD,order]=optics(x,k)

[m,n]=size(x);
CD=zeros(1,m);
RD=ones(1,m)*10^10;

% Calculate Core Distances
for i=1:m
D=sort(dist(x(i,:),x));
CD(i)=D(k+1);
end

order=[];
seeds=[1:m];

ind=1;

while ~isempty(seeds)
ob=seeds(ind);
seeds(ind)=[];
order=[order ob];
mm=max([ones(1,length(seeds))*CD(ob);dist(x(ob,:),x(seeds,:))]);
ii=(RD(seeds))>mm;
RD(seeds(ii))=mm(ii);
[i1 ind]=min(RD(seeds));
end

RD(1)=max(RD(2:m))+.1*max(RD(2:m));

function [D]=dist(i,x)

% function: [D]=dist(i,x)
%
% Aim:
% Calculates the Euclidean distances between the i-th object and all objects in x
% Input:
% i - an object (1,n)
% x - data matrix (m,n); m-objects, n-variables
%
% Output:
% D - Euclidean distance (m,1)

[m,n]=size(x);
D=(sum((((ones(m,1)*i)-x).^2)'));

if n==1
D=abs((ones(m,1)*i-x))';
end

熱點內容
c語言自考 發布:2025-05-15 07:52:42 瀏覽:499
壓縮的玉 發布:2025-05-15 07:51:22 瀏覽:788
android的控制項 發布:2025-05-15 07:50:36 瀏覽:551
南崗法院伺服器ip地址 發布:2025-05-15 07:46:02 瀏覽:286
實況如何退出賬號安卓 發布:2025-05-15 07:45:56 瀏覽:917
深入編譯器 發布:2025-05-15 07:41:35 瀏覽:878
電信手機號服務密碼怎麼查 發布:2025-05-15 07:40:10 瀏覽:613
python全局變數文件 發布:2025-05-15 07:35:06 瀏覽:954
位元組和存儲位元組 發布:2025-05-15 07:32:10 瀏覽:521
linux應用開發工程師 發布:2025-05-15 07:32:07 瀏覽:261