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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

6.8 程序示例--二分 K-Means-机器学习笔记-斯坦福吴恩达教授

發(fā)布時(shí)間:2025/4/5 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 6.8 程序示例--二分 K-Means-机器学习笔记-斯坦福吴恩达教授 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

程序示例–二分 K-Means

仍然是在 kmeans.py 中,我們又添加了二分 K-Means 算法:

# coding: utf-8 # kmeans/kmeans.py# ... def biKmeans(dataSet, k):"""Args:def biKmeans(dataSet, k):"""二分kmeans算法Args:dataSet: 數(shù)據(jù)集k: 聚類數(shù)Returns:centroids: 聚類中心clusterAssment: 點(diǎn)分配結(jié)果"""m, n = np.shape(dataSet)# 起始時(shí),只有一個(gè)簇,該簇的聚類中心為所有樣本的平均位置centroid0 = np.mean(dataSet, axis=0).tolist()[0]# 設(shè)置一個(gè)列表保存當(dāng)前的聚類中心currentCentroids = [centroid0]# 點(diǎn)分配結(jié)果: 第一列指明樣本所在的簇,第二列指明該樣本到聚類中心的距離clusterAssment = np.mat(np.zeros((m, 2)))# 初始化點(diǎn)分配結(jié)果,默認(rèn)將所有樣本先分配到初始簇for j in range(m):clusterAssment[j, 1] = distEclud(dataSet[j, :], np.mat(centroid0))**2# 直到簇的數(shù)目達(dá)標(biāo)while len(currentCentroids) < k:# 當(dāng)前最小的代價(jià)lowestError = np.inf# 對于每一個(gè)簇for j in range(len(currentCentroids)):# 獲得該簇的樣本ptsInCluster = dataSet[np.nonzero(clusterAssment[:, 0].A == j)[0], :]# 在該簇上進(jìn)行2-means聚類# 注意,得到的centroids,其聚類編號(hào)含0,1centroids, clusterAss = kMeans(ptsInCluster, 2)# 獲得劃分后的誤差之和splitedError = np.sum(clusterAss[:, 1])# 獲得其他簇的樣本ptsNoInCluster = dataSet[np.nonzero(clusterAssment[:, 0].A != j)[0]]# 獲得剩余數(shù)據(jù)集的誤差nonSplitedError = np.sum(ptsNoInCluster[:, 1])# 比較,判斷此次劃分是否劃算if (splitedError + nonSplitedError) < lowestError:# 如果劃算,刷新總誤差lowestError = splitedError + nonSplitedError# 記錄當(dāng)前的應(yīng)當(dāng)劃分的簇needToSplit = j# 新獲得的簇以及點(diǎn)分配結(jié)果newCentroids = centroids.AnewClusterAss = clusterAss.copy()# 更新簇的分配結(jié)果# 第0簇應(yīng)當(dāng)修正為被劃分的簇newClusterAss[np.nonzero(newClusterAss[:, 0].A == 0)[0], 0] = needToSplit# 第1簇應(yīng)當(dāng)修正為最新一簇newClusterAss[np.nonzero(newClusterAss[:, 0].A == 1)[0], 0] = len(currentCentroids)# 被劃分的簇需要更新currentCentroids[needToSplit] = newCentroids[0, :]# 加入新的劃分后的簇currentCentroids.append(newCentroids[1, :])# 刷新點(diǎn)分配結(jié)果clusterAssment[np.nonzero(clusterAssment[:, 0].A == needToSplit)[0], :] = newClusterAssreturn np.mat(currentCentroids), clusterAssmentdataSet: 數(shù)據(jù)集k: 聚類數(shù)Returns:centroids: 聚類中心clusterAssment: 點(diǎn)分配結(jié)果"""# 隨機(jī)初始化聚類中心centroids = randCent(dataSet, k)m, n = np.shape(dataSet)# 點(diǎn)分配結(jié)果: 第一列指明樣本所在的簇,第二列指明該樣本到聚類中心的距離clusterAssment = np.mat(np.zeros((m, 2)))# 標(biāo)識(shí)聚類中心是否仍在改變clusterChanged = True# 直至聚類中心不再變化while clusterChanged:clusterChanged = False# 分配樣本到簇for i in range(m):# 計(jì)算第i個(gè)樣本到各個(gè)聚類中心的距離minIndex = 0minDist = np.inffor j in range(k):dist = distEclud(dataSet[i, :], centroids[j, :])if(dist < minDist):minIndex = jminDist = dist# 判斷cluster是否改變if(clusterAssment[i, 0] != minIndex):clusterChanged = TrueclusterAssment[i, :] = minIndex, minDist**2# 刷新聚類中心: 移動(dòng)聚類中心到所在簇的均值位置for cent in range(k):# 通過數(shù)組過濾獲得簇中的點(diǎn)ptsInCluster = dataSet[np.nonzero(clusterAssment[:, 0].A == cent)[0]]# 計(jì)算均值并移動(dòng)centroids[cent, :] = np.mean(ptsInCluster, axis=0)return centroids, clusterAssment # ...

測試

# coding: utf-8 # kmeans/test_bi_kmeans.pyimport kmeans import numpy as np import matplotlib.pyplot as pltif __name__ == "__main__":dataMat = np.mat(kmeans.loadDataSet('data/testSet2.txt'))centroids, clusterAssment = kmeans.biKmeans(dataMat, 3)clusterCount = centroids.shape[0]m = dataMat.shape[0]# 繪制散點(diǎn)圖patterns = ['o', 'D', '^']colors = ['b', 'g', 'y']fig = plt.figure()title = 'bi-kmeans with k=3'ax = fig.add_subplot(111, title=title)for k in range(clusterCount):# 繪制聚類中心ax.scatter(centroids[k,0], centroids[k,1], color='r', marker='+', linewidth=20)for i in range(m):# 繪制屬于該聚類中心的樣本ptsInCluster = dataMat[np.nonzero(clusterAssment[:, 0].A==k)[0]]ax.scatter(ptsInCluster[:, 0].flatten().A[0], ptsInCluster[:, 1].flatten().A[0], marker=patterns[k], color=colors[k])plt.show()

運(yùn)行結(jié)果如下:

總結(jié)

以上是生活随笔為你收集整理的6.8 程序示例--二分 K-Means-机器学习笔记-斯坦福吴恩达教授的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。