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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

聚类算法-最大最小距离算法(实例+代码)

發布時間:2024/4/15 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 聚类算法-最大最小距离算法(实例+代码) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

聚類算法-最大最小距離算法(實例+代碼)

? ? 【尊重原創,轉載請注明出處】http://blog.csdn.net/guyuealian/article/details/53708042

目錄

聚類算法-最大最小距離算法(實例+代碼)

一、最大最小距離算法基本思想

二、算法實現步驟

1.最大最小距離聚類算法(Matlab版本)

2.最大最小距離聚類算法(Python版本)

3.最大最小距離聚類算法(OpenCV C++版本)

4.最大最小距離聚類算法(C++版本)


一、最大最小距離算法基本思想

? ? ?最大最小距離法是模式識別中一種基于試探的類聚算法,它以歐式距離為基礎,取盡可能遠的對象作為聚類中心。因此可以避免K-means法初值選取時可能出現的聚類種子過于臨近的情況,它不僅能智能確定初試聚類種子的個數,而且提高了劃分初試數據集的效率。
? ? 該算法以歐氏距離為基礎,首先初始一個樣本對象作為第1個聚類中心,再選擇一個與第1個聚類中心最遠的樣本作為第2個聚類中心,然后確定其他的聚類中心,直到無新的聚類中心產生。最后將樣本按最小距離原則歸入最近的類。

二、算法實現步驟

? ? ?假設有10個模式樣本點:{x1(0 0), x2(3 8), x3(2 2), x4(1 1), x5(5 3), x6(4 8), x7(6 3), x8(5 4), x9(6 4), x10(7 5)},其樣本分布如圖所示:

? ? 最大最小距離聚類算法步驟如下:

? ? 該算法的聚類結果與參數和起始點的選取關系重大。若無先驗樣本分布知識,則只有用試探法通過多次試探優化,若有先驗知識用于指導和選取,則算法可很快收斂。

為了方便看解計算過程,下面以表格的方式列出:

? ? PS:上面的算法內容都是寫在Word文檔,然后截圖放出來的,需要原版Word文檔,留言發給你便是~

1.最大最小距離聚類算法(Matlab版本)

【源碼下載,可直接運行使用】http://download.csdn.net/detail/guyuealian/9714195?

測試代碼:test.m

clear all clc x=[0,0; 3,8; 2,2;1,1; 5,3; 4,8; 6,3; 5,4; 6,4; 7,5] Theta=0.5; [pattern,centerIndex]=MaxMinDisFun(x,0.5) %%%%%%%%%%%%%%%%% %函數名稱 MaxMinDisFun(x,Theta) %輸入參數: % x : x為n*m的特征樣本矩陣,每行為一個樣本,每列為樣本的特征 % Theta:即θ,可用試探法取一固定分數,如:1/2 %輸出參數: % pattern:輸出聚類分析后的樣本類別 % centerIndex:聚類中心點 %函數功能 :利用最大最小距離算法聚類樣本數據, %%%%%%%%%%%%%%%%%%%%% function [classes,centerIndex]=MaxMinDisFun(x,Theta) maxDistance=0; start=1; %初始選一個中心點 index=start;%相當于指針指示新中心點的位置 k=1; %中心點計數,也即是類別 dataNum=size(x,1); %輸入的樣本數 centerIndex=zeros(dataNum,1); %保存中心點 distance=zeros(dataNum,1); %表示所有樣本到當前聚類中心的距離 minDistance=zeros(dataNum,1); %取較小距離 classes=zeros(dataNum,1); %表示類別centerIndex(1)=index;%保存第一個聚類中心 classes(:)=k; %初始類別全為k %% for i=1:dataNumdistance(i)=sqrt((x(i,:)-x(centerIndex(1),:))*(x(i,:)-x(centerIndex(1),:))');%歐氏距離,與第1個聚類中心的距離classes(i)=k;%第1類if(maxDistance<distance(i))maxDistance=distance(i);%與第一個聚類中心的最大距離index=i;%與第一個聚類中心距離最大的樣本end end %% minDistance=distance; % minDistance(index,1)=0; maxVal=maxDistance; while(maxVal>(maxDistance*Theta))%判斷新的聚類中心是否滿足條件k=k+1;centerIndex(k)=index;%判斷新的聚類中心是否滿足條件,若滿足則新增聚類中心for i=1:dataNum distance(i)=sqrt((x(i,:)-x(centerIndex(k),:))*(x(i,:)-x(centerIndex(k),:))');%與第k個聚類中心的距離if(minDistance(i)>distance(i))minDistance(i)=distance(i);classes(i)=k;%按照當前最近臨方式分類,哪個近就分哪個類別endend%查找minDistance中最大值maxVal=0;for i=1:dataNumif((maxVal<minDistance(i))) maxVal=minDistance(i);index=i;endend % centerIndex(k+1)=index;%新的聚類中心aaa=0; end end

運行結果:

x =0 03 82 21 15 34 86 35 46 47 5 pattern =1211323333 centerIndex =1670000000

2.最大最小距離聚類算法(Python版本)

# -*-coding: utf-8 -*- """@Project: IntelligentManufacture@File : maxmin_distance.py@Author : panjq@E-mail : pan_jinquan@163.com@Date : 2019-02-14 18:41:30 """ import math import numpy as np def calcuDistance(data1, data2):'''計算兩個模式樣本之間的歐式距離:param data1::param data2::return:'''distance = 0for i in range(len(data1)):distance += pow((data1[i]-data2[i]), 2)return math.sqrt(distance)def maxmin_distance_cluster(data, Theta):''':param data: 輸入樣本數據,每行一個特征:param Theta:閾值,一般設置為0.5,閾值越小聚類中心越多:return:樣本分類,聚類中心'''maxDistance = 0start = 0#初始選一個中心點index = start#相當于指針指示新中心點的位置k = 0 #中心點計數,也即是類別dataNum=len(data)distance=np.zeros((dataNum,))minDistance=np.zeros((dataNum,))classes =np.zeros((dataNum,))centerIndex=[index]# 初始選擇第一個為聚類中心點ptrCen=data[0]# 尋找第二個聚類中心,即與第一個聚類中心最大距離的樣本點for i in range(dataNum):ptr1 =data[i]d=calcuDistance(ptr1,ptrCen)distance[i] = dclasses[i] = k + 1if (maxDistance < d):maxDistance = dindex = i #與第一個聚類中心距離最大的樣本minDistance=distance.copy()maxVal = maxDistancewhile maxVal > (maxDistance * Theta):k = k + 1centerIndex+=[index] #新的聚類中心for i in range(dataNum):ptr1 = data[i]ptrCen=data[centerIndex[k]]d = calcuDistance(ptr1, ptrCen)distance[i] = d#按照當前最近臨方式分類,哪個近就分哪個類別if minDistance[i] > distance[i]:minDistance[i] = distance[i]classes[i] = k + 1# 尋找minDistance中的最大距離,若maxVal > (maxDistance * Theta),則說明存在下一個聚類中心index=np.argmax(minDistance)maxVal=minDistance[index]return classes,centerIndexif __name__=='__main__':data = [[0, 0], [3, 8], [2, 2],[1, 1], [5, 3], [4, 8], [6, 3], [5, 4], [6, 4], [7, 5]]Theta = 0.6classes,centerIndex = maxmin_distance_cluster(data, Theta)print(classes)print(centerIndex)

3.最大最小距離聚類算法(OpenCV C++版本)

? ???強勢推薦鄙人的博客:《OpenCV實現最大最小距離聚類算法》https://blog.csdn.net/guyuealian/article/details/80255524

4.最大最小距離聚類算法(C++版本)

// MaxMinDisTest.cpp : #include "stdafx.h" #include <iostream> #include <math.h> using namespace std; const int N=10; void main(void) { int center[20];float s[2][N]={{0,3,2,1,5,4,6,5,6,7},{0,8,2,1,3,8,3,4,4,5}};float D[20][N];float min[N];int minindex[N];int clas[N];float theshold;float theta=0.5;float D12=0.0;float tmp=0;int index=0;center[0]=0;//first centerint i,k=0,j,l;for(j=0;j<N;j++){ tmp=(s[0][j]-s[0][0])*(s[0][j]-s[0][0])+(s[1][j]-s[1][0])*(s[1][j]-s[1][0]);D[0][j]=(float)sqrt(tmp);if(D[0][j]>D12) {D12=D[0][j];index=j;}}center[1]=index;//second centerk=1;index=0;theshold=D12;while(theshold>theta*D12){for(j=0;j<N;j++){tmp=(s[0][j]-s[0][center[k]])*(s[0][j]-s[0][center[k]])+(s[1][j]-s[1][center[k]])*(s[1][j]-s[1][center[k]]);D[k][j]=(float)sqrt(tmp);}for(j=0;j<N;j++){float tmp=D12;for(l=0;l<=k;l++)if (D[l][j]<tmp) {tmp=D[l][j];index=l;};min[j]=tmp;minindex[j]=index;}//min-operatefloat max=0;index=0;for(j=0;j<N;j++)if(min[j]>max) {max=min[j];index=j;}if (max>theta*D12){k++;center[k]=index;}// add a centertheshold=max;// prepare to loop next time} //求出所有中心,final array min[] is still usefulfor(j=0;j<N;j++) clas[j]=minindex[j];for(i=0;i<2;i++){for(j=0;j<N;j++)cout<<s[i][j]<<" ";cout<<"\n";}cout<<"k="<<k+1<<" ";cout<<"center(s):";for(l=0;l<k;l++) cout<<center[l]+1<<"--";cout<<center[k]+1;cout<<"\n";for(j=0;j<N;j++)cout<<clas[j]+1<<" ";cout<<"\n"; }


?

如果你覺得該帖子幫到你,還望貴人多多支持,鄙人會再接再厲,繼續努力的~

?

?

總結

以上是生活随笔為你收集整理的聚类算法-最大最小距离算法(实例+代码)的全部內容,希望文章能夠幫你解決所遇到的問題。

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