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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

kmean python实现

發布時間:2024/9/30 python 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 kmean python实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

機器學習實戰一書 kMeans 代碼
偽代碼:

創建k個點作為起始聚類中心 當任意一個點的簇分配結果發生改變時對數據集中的每個數據點對每個聚類中心計算當前聚類中心與數據點之間的距離將數據點分配到最近距離的中心點簇對每一個簇,計算簇中所有點的均值作為中心點

數據

import matplotlib.pyplot as plt import numpy as np datMat = np.random.random((100, 2))

距離函數

def distEclud(vecA, vecB):return np.sqrt(np.sum(np.power(vecA - vecB, 2)))

#初始聚類中心
聚類中心坐標范圍應為數據樣本的最小值到最大值之間

def randCent(dataSet, k):# 得到數據樣本的維度,即列數n = np.shape(dataSet)[1]# 初始化為一個(k,n)的全零矩陣centroids = np.mat(np.zeros((k, n)))# 遍歷數據集的每一個維度for j in range(n):# 得到該列數據的最小值,最大值minJ = np.min(dataSet[:, j])maxJ = np.max(dataSet[:, j])# 得到該列數據的范圍(最大值-最小值)rangeJ = float(maxJ - minJ)# k個質心向量的第j維數據值隨機為位于(最小值,最大值)內的某一值# Create an array of the given shape and populate it with random samples from a uniform distribution over [0, 1).centroids[:, j] = minJ + rangeJ * np.random.rand(k, 1)# 返回初始化得到的k個質心向量return centroids

聚類算法實現

def kMeans(dataSet, k, distMeas=distEclud, createCent=randCent):# 獲取數據集樣本數m = np.shape(dataSet)[0]# 初始化一個(m,2)全零矩陣clusterAssment = np.mat(np.zeros((m, 2)))#用于存儲每個樣本的類別,和到聚類中心的最小距離# 創建初始的k個質心向量初始聚類中心centroids = createCent(dataSet, k)# 聚類結果是否發生變化的布爾類型clusterChanged = True# 只要聚類結果一直發生變化,就一直執行聚類算法,直至所有數據點聚類結果不發生變化while clusterChanged:# 聚類結果變化布爾類型置為FalseclusterChanged = False# 遍歷數據集每一個樣本向量for i in range(m):# 初始化最小距離為正無窮,最小距離對應的索引為-1minDist = float('inf')minIndex = -1# 循環k個類的質心for j in range(k):# 計算數據點到質心的歐氏距離distJI = distMeas(centroids[j, :], dataSet[i, :])# 如果距離小于當前最小距離if distJI < minDist:# 當前距離為最小距離,最小距離對應索引應為j(第j個類)minDist = distJIminIndex = j# 當前聚類結果中第i個樣本的聚類結果發生變化:布爾值置為True,繼續聚類算法clusterAssment存儲的是類別和距離,如果后來的類別和先一輪得到的類別不一樣,則執行if clusterAssment[i, 0] != minIndex:clusterChanged = True# 更新當前變化樣本的聚類結果和平方誤差clusterAssment[i, :] = minIndex, minDist ** 2# 遍歷每一個質心for cent in range(k):# 將數據集中所有屬于當前質心類的樣本通過條件過濾篩選出來ptsInClust = dataSet[np.nonzero(clusterAssment[:, 0].A == cent)[0]]# 計算這些數據的均值(axis=0:求列均值),作為該類質心向量centroids[cent, :] = np.mean(ptsInClust, axis=0)# 返回k個聚類,聚類結果及誤差return centroids, clusterAssment

#結果繪圖

def plotData():# 導入數據datMat = np.random.random((100, 2))# 進行k-means算法其中k為3myCentroids, clustAssing = kMeans(datMat, 3)clustAssing = clustAssing.tolist()myCentroids = myCentroids.tolist()xcord = [[], [], [], []]ycord = [[], [], [], []]datMat = datMat.tolist()m = len(clustAssing)for i in range(m):if int(clustAssing[i][0]) == 0:xcord[0].append(datMat[i][0])ycord[0].append(datMat[i][1])elif int(clustAssing[i][0]) == 1:xcord[1].append(datMat[i][0])ycord[1].append(datMat[i][1])elif int(clustAssing[i][0]) == 2:xcord[2].append(datMat[i][0])ycord[2].append(datMat[i][1])fig = plt.figure()ax = fig.add_subplot(111)# 繪制樣本點ax.scatter(xcord[0], ycord[0], s=30, c='b', marker='*', alpha=.5)ax.scatter(xcord[1], ycord[1], s=30, c='r', marker='D', alpha=.5)ax.scatter(xcord[2], ycord[2], s=30, c='c', marker='>', alpha=.5)# 繪制質心ax.scatter(myCentroids[0][0], myCentroids[0][1], s=100, c='k', marker='+', alpha=.5)ax.scatter(myCentroids[1][0], myCentroids[1][1], s=100, c='k', marker='+', alpha=.5)ax.scatter(myCentroids[2][0], myCentroids[2][1], s=100, c='k', marker='+', alpha=.5)plt.title('shuju kmeans')plt.xlabel('X')plt.show()if __name__ == '__main__':plotData()

總結

以上是生活随笔為你收集整理的kmean python实现的全部內容,希望文章能夠幫你解決所遇到的問題。

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