久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

K

167次閱讀
沒有評論

共計 2615 個字符,預計需要花費 7 分鐘才能閱讀完成。

這篇文章給大家介紹 K -means 算法如何實現二維數據聚類,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

所謂聚類分析,就是給定一個元素集合 D,其中每個元素具有 n 個觀測屬性,對這些屬性使用某種算法將 D 劃分成 K 個子集,要求每個子集內部的元素之間相似度盡可能高,而不同子集的元素相似度盡可能低。聚類分析是一種無監督的觀察式學習方法,在聚類前可以不知道類別甚至不用給定類別數量。目前聚類廣泛應用于統計學、生物學、數據庫技術和市場營銷等領域。

聚類算法有很多種,如 K -means(K 均值聚類)、K 中心聚類、密度聚類、譜系聚類、最大期望聚類等。這里我們重點介紹 K -means 聚類算法,該算法的基本思想是以空間中 K 個點為中心進行聚類,對最靠近它們的對象歸類。通過迭代的方法,逐次更新各聚類中心的值,直至得到最好的聚類結果。K-means 算法實現簡單、計算速度快、原理易于理解、具有理想的聚類效果,因此該算法是公認的經典數據挖掘方法之一。

例如對于常見的二維數據集,設計 K -means 聚類方法,對 80 個二維數據點進行聚類分析。K-means 算法的 Python 語言實現及處理過程如下:

如下圖所示的 80 個二維樣本數據集,存儲為 testSet 文本文檔。經過數據預處理和簡單分析,得知該數據集共有 4 個類別,因而能確定聚類數 K 為 4。

首先導入必要的模塊:

import kmeans

import numpy as np

import matplotlib.pyplot as plt

from math import sqrt

(1)從文件加載數據集

構建數據矩陣,從文本中逐行讀取數據,形成供后繼使用的數據矩陣。

dataSet=[]

fileIn=open(testSet.txt)

for line in fileIn.readlines():

  lineArr=line.strip().split( \t)

  dataSet.append([float(lineArr[0]),float(lineArr[1])])

(2)調用 kmeans 算法進行數據聚類

通過以下命令調用設計的 kmeans 模塊,進行數據聚類。

dataSet=np.mat(dataSet)

k=4

centroids,clusterAssment=kmeans.kmeanss(dataSet,k)

kmeans 模塊主要包含如下幾個函數。

距離度量函數。這里使用的是歐氏距離,計算過程如下:

def eucDistance(vec1,vec2):

  return sqrt(sum(pow(vec2-vec1,2)))

初始聚類中心選擇。從數據集中隨機選擇 K 個數據點,用作初始聚類中心。

def initCentroids(dataSet,k):

  numSamples,dim=dataSet.shape

  centroids=np.zeros((k,dim))

  for i in range(k):

  index=int(np.random.uniform(0,numSamples))

  centroids[i,:]=dataSet[index,:]

  return centroids

K-Means 聚類算法。該算法會創建 k 個質心,然后將每個點分配到最近的質心,再重新計算質心。這個過程重復數次,直到數據點的簇分配結果不再改變位置。

def kmeanss(dataSet,k):

numSamples=dataSet.shape[0]

  clusterAssement=np.mat(np.zeros((numSamples,2)))

  clusterChanged=True

  ##step1:init centroids

  centroids=initCentroids(dataSet,k)

 

  while clusterChanged:

  clusterChanged=False

  for i in range(numSamples):

  minDist = 100000.0

  minIndex=0

  ##step2 find the centroid who is closest

  for j in range(k):

  distance=eucDistance(centroids[j,:],dataSet[i,:])

  if distance minDist:

  minDist=distance

  minIndex=j

  ##step3: update its cluster

  clusterAssement[i,:]=minIndex,minDist**2

  if clusterAssement[i,0]!=minIndex:

  clusterChanged=True

  ##step4: update centroids

  for j in range(k):

  pointsInCluster=dataSet[np.nonzero(clusterAssement[:,0].A==j)[0]]

  centroids[j,:]=np.mean(pointsInCluster,axis=0)

  print (Congratulations,cluster complete!)

  return centroids,clusterAssement

聚類結果顯示。將聚類劃分在的不同簇的數據,用不同的顏色和符號進行顯示,同時畫出最終的聚類中心。

def showCluster(dataSet,k,centroids,clusterAssement):

numSamples,dim=dataSet.shape

mark=[or , ob , og , ok , ^r , +r , r , pr]

if k len(mark):

  print(Sorry!)

  return 1

for i in np.xrange(numSamples):

  markIndex=int(clusterAssement[i,0])

  plt.plot(centroids[i,0],centroids[i,1],mark[i],markersize=12)

plt.show()

(3)聚類結果顯示

對 80 個二維數據,使用 K -means 方法進行聚類,聚類結果如圖 13- 5 所示,迭代后的聚類中心用方形表示,其他數據用不同顏色的原點表示。

圖 二維數據的聚類結果

關于 K -means 算法如何實現二維數據聚類就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-08-25發表,共計2615字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 玉屏| 赣州市| 金昌市| 武定县| 兰州市| 太谷县| 平乡县| 泾川县| 乐都县| 文山县| 梓潼县| 石首市| 承德市| 隆子县| 仁化县| 巴林左旗| 合作市| 庆云县| 汪清县| 元朗区| 南昌市| 库伦旗| 通海县| 孙吴县| 邓州市| 青铜峡市| 兰西县| 友谊县| 赤城县| 读书| 油尖旺区| 虎林市| 乌审旗| 卓尼县| 台江县| 延寿县| 酒泉市| 缙云县| 包头市| 施甸县| 乌兰浩特市|