2021-03-15 数据挖掘算法—K-Means算法 Python版本
生活随笔
收集整理的這篇文章主要介紹了
2021-03-15 数据挖掘算法—K-Means算法 Python版本
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
數據挖掘算法—K-Means算法 Python版本
簡介
又叫K-均值算法,是非監督學習中的聚類算法。
?
基本思想
k-means算法比較簡單。在k-means算法中,用cluster來表示簇;容易證明k-means算法收斂等同于所有質心不再發生變化。基本的k-means算法流程如下:
選取k個初始質心(作為初始cluster,每個初始cluster只包含一個點);??
repeat:??
? ? 對每個樣本點,計算得到距其最近的質心,將其類別標為該質心所對應的cluster;??
? ? 重新計算k個cluster對應的質心(質心是cluster中樣本點的均值);??
until 質心不再發生變化??
?
repeat的次數決定了算法的迭代次數。實際上,k-means的本質是最小化目標函數,目標函數為每個點到其簇質心的距離的平方和:
N是元素個數,x表示元素,c(j)表示第j簇的質心
?
算法復雜度
時間復雜度是O(nkt) ,其中n代表元素個數,t代表算法迭代的次數,k代表簇的數目
?
優缺點
優點
簡單、快速;
對大數據集有較高的效率并且是可伸縮性的;
時間復雜度近于線性,適合挖掘大規模數據集。
缺點
k-means是局部最優,因而對初始質心的選取敏感;
選擇能達到目標函數最優的k值是非常困難的。
?
代碼
# coding:utf-8import numpy as np import matplotlib.pyplot as pltdef loadDataSet(fileName):'''加載測試數據集,返回一個列表,列表的元素是一個坐標'''dataList = []with open(fileName) as fr:for line in fr.readlines():curLine = line.strip().split('\t')fltLine = list(map(float, curLine))dataList.append(fltLine)return dataListdef randCent(dataSet, k):'''隨機生成k個初始的質心'''n = np.shape(dataSet)[1] # n表示數據集的維度centroids = np.mat(np.zeros((k, n)))for j in range(n):minJ = min(dataSet[:, j])rangeJ = float(max(dataSet[:, j]) - minJ)centroids[:, j] = np.mat(minJ + rangeJ * np.random.rand(k, 1))return centroidsdef kMeans(dataSet, k):'''KMeans算法,返回最終的質心坐標和每個點所在的簇'''m = np.shape(dataSet)[0] # m表示數據集的長度(個數)clusterAssment = np.mat(np.zeros((m, 2)))centroids = randCent(dataSet, k) # 保存k個初始質心的坐標clusterChanged = TrueiterIndex = 1 # 迭代次數while clusterChanged:clusterChanged = Falsefor i in range(m):minDist = np.infminIndex = -1for j in range(k):distJI = np.linalg.norm(np.array(centroids[j, :]) - np.array(dataSet[i, :]))if distJI < minDist:minDist = distJIminIndex = jif clusterAssment[i, 0] != minIndex: clusterChanged = TrueclusterAssment[i, :] = minIndex, minDist ** 2print("第%d次迭代后%d個質心的坐標:\n%s" % (iterIndex, k, centroids)) # 第一次迭代的質心坐標就是初始的質心坐標iterIndex += 1for cent in range(k):ptsInClust = dataSet[np.nonzero(clusterAssment[:, 0].A == cent)[0]] # get all the point in this clustercentroids[cent, :] = np.mean(ptsInClust, axis=0)return centroids, clusterAssmentdef showCluster(dataSet, k, centroids, clusterAssment):'''數據可視化,只能畫二維的圖(若是三維的坐標圖則直接返回1)'''numSamples, dim = dataSet.shapeif dim != 2:return 1mark = ['or', 'ob', 'og', 'ok', 'oy', 'om', 'oc', '^r', '+r', 'sr', 'dr', '<r', 'pr']# draw all samplesfor i in range(numSamples):markIndex = int(clusterAssment[i, 0])plt.plot(dataSet[i, 0], dataSet[i, 1], mark[markIndex])mark = ['Pr', 'Pb', 'Pg', 'Pk', 'Py', 'Pm', 'Pc', '^b', '+b', 'sb', 'db', '<b', 'pb']# draw the centroidsfor i in range(k):plt.plot(centroids[i, 0], centroids[i, 1], mark[i], markersize=12)plt.show()if __name__ == '__main__':dataMat = np.mat(loadDataSet('./data.txt')) # mat是numpy中的函數,將列表轉化成矩陣k = 5 # 選定k值,也就是簇的個數(可以指定為其他數)cent, clust = kMeans(dataMat, k)showCluster(dataMat, k, cent, clust)?
總結
以上是生活随笔為你收集整理的2021-03-15 数据挖掘算法—K-Means算法 Python版本的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021-03-12 Python基础核
- 下一篇: 2021-03-16 汽车二自由度操纵稳