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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

二十三、聚类算法

發布時間:2024/9/16 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 二十三、聚类算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 聚類算法

聚類:數據對象的集合

  • 在同一個聚類中的對象彼此相似

  • 不同聚類中的對象則差別較大
    聚類分析

  • 將物理或抽象對象的集合分組成為由類似的對象組成的多個類的過程

  • 聚類是一種無指導的學習:沒有預定義的類別,觀察式學習
    聚類分析的典型應用

  • 在GIS系統中,對相似區域進行聚類,產生主題地圖

  • 檢測空間聚類,并給出它們在空間數據挖掘中的解釋

  • 圖像處理

  • 商務應用中,幫市場分析人員發現不同的顧客群

  • 對WEB日志的數據進行聚類,以發現相同的用戶訪問模式

常見的聚類算法

  • 基于劃分的方法:K-means算法
  • 基于層次的方法:CURE算法
  • 基于密度的方法:DBSCAN算法

2. k-means聚類算法

簡介

  • K-means聚類算法就是基于距離的聚類算法(cluster algorithm)主要通過不斷地取離種子點最近均值的算法

    k-means聚類算的原理

  • 一、指定需要劃分的簇的個數k值;

  • 二、隨機地選擇k個初始數據對象點作為初始的聚類中心;

  • 三、計算其余的各個數據對象到這k個初始聚類中心的距離,把數據對

  • 劃歸到距離它最近的那個中心所處在的簇類中;

  • 四、調整新類并且重新計算出新類的中心。

  • 五、計算聚類準則函數E,若E不滿足收斂條件。重復二、三、四,

  • 六、結束

    距離的計算

  • 我們都是以歐拉距離來計算與種子點的距離。但是,還有幾種可以用于k-means的距離計算方法。閔可夫斯基距離——λ可以隨意取值,可以是負數,也可以是正數,或是無窮大。

  • 歐拉公式——也就是第一個公式λ=2的情況

  • 曼哈頓距離——也就是第一個公式λ=1的情況

k-means距離算法的特點及應用

  • 優點:
  • 算法簡單、快速
  • 對處理大數據集,該算法是相對可伸縮的和高效率的。
  • 算法嘗試找出使平方誤差函數值最小的k個劃分。
  • 缺點
  • K-means聚類算法只有在簇的平均值被定義的情況下才能使用。
  • 要求用戶必須事先給出要生成的簇的數目k。
  • 對初值敏感。
  • 不適合于發現非凸面形狀的簇,或者大小差別很大的簇。
  • 對于“噪聲”和孤立點數據敏感

k-means聚類算法的核心代碼

2.1 完整代碼

實戰代碼

import numpy as np import matplotlib.pyplot as plt# 加載數據 def loadDataSet(fileName):data = np.loadtxt(fileName, delimiter='\t')return data# 歐氏距離計算 def distEclud(x, y):return np.sqrt(np.sum((x - y) ** 2)) # 計算歐氏距離# 為給定數據集構建一個包含K個隨機質心的集合 def randCent(dataSet, k):m, n = dataSet.shapecentroids = np.zeros((k, n))for i in range(k):index = int(np.random.uniform(0, m)) #centroids[i, :] = dataSet[index, :]return centroids# k均值聚類 def KMeans(dataSet, k):m = np.shape(dataSet)[0] # 行的數目# 第一列存樣本屬于哪一簇# 第二列存樣本的到簇的中心點的誤差clusterAssment = np.mat(np.zeros((m, 2)))clusterChange = True# 第1步 初始化centroidscentroids = randCent(dataSet, k)while clusterChange:clusterChange = False# 遍歷所有的樣本(行數)for i in range(m):minDist = 100000.0minIndex = -1# 遍歷所有的質心# 第2步 找出最近的質心for j in range(k):# 計算該樣本到質心的歐式距離distance = distEclud(centroids[j, :], dataSet[i, :])if distance < minDist:minDist = distanceminIndex = j# 第 3 步:更新每一行樣本所屬的簇if clusterAssment[i, 0] != minIndex:clusterChange = TrueclusterAssment[i, :] = minIndex, minDist ** 2# 第 4 步:更新質心for j in range(k):pointsInCluster = dataSet[np.nonzero(clusterAssment[:, 0].A == j)[0]] # 獲取簇類所有的點centroids[j, :] = np.mean(pointsInCluster, axis=0) # 對矩陣的行求均值print("Congratulations,cluster complete!")return centroids, clusterAssmentdef showCluster(dataSet, k, centroids, clusterAssment):m, n = dataSet.shapeif n != 2:print("數據不是二維的")return 1mark = ['or', 'ob', 'og', 'ok', '^r', '+r', 'sr', 'dr', '<r', 'pr']if k > len(mark):print("k值太大了")return 1# 繪制所有的樣本for i in range(m):markIndex = int(clusterAssment[i, 0])plt.plot(dataSet[i, 0], dataSet[i, 1], mark[markIndex])mark = ['Dr', 'Db', 'Dg', 'Dk', '^b', '+b', 'sb', 'db', '<b', 'pb']# 繪制質心for i in range(k):plt.plot(centroids[i, 0], centroids[i, 1], mark[i])plt.show()dataSet = loadDataSet("test.txt") k = 4 centroids, clusterAssment = KMeans(dataSet, k) showCluster(dataSet, k, centroids, clusterAssment)plt.show()dataSet = loadDataSet("test.txt") k = 4 centroids, clusterAssment = KMeans(dataSet, k) showCluster(dataSet, k, centroids, clusterAssment)

總結

以上是生活随笔為你收集整理的二十三、聚类算法的全部內容,希望文章能夠幫你解決所遇到的問題。

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