本文之編寫程序涉及到API介紹,程序的完整實現,具體算法原理請查看之前所寫的K-Means算法介紹
一、基礎準備
1、python 基礎
2、scikit 基礎
2.1 K-Means類概述
在scikit-learn中,包括兩個K-Means的算法,一個是傳統的K-Means算法,對應的類是KMeans。另一個是基于采樣的Mini Batch K-Means算法,對應的類是MiniBatchKMeans。一般來說,使用K-Means的算法調參是比較簡單的。
用KMeans類的話,一般要注意的僅僅就是k值的選擇,即參數n_clusters;如果是用MiniBatchKMeans的話,也僅僅多了需要注意調參的參數batch_size,即我們的Mini Batch的大小。
當然KMeans類和MiniBatchKMeans類可以選擇的參數還有不少,但是大多不需要怎么去調參。下面我們就看看KMeans類和MiniBatchKMeans類的一些主要參數。
2.2 KMeans類主要參數
KMeans(n_clusters=8, init='k-means++', n_init=10, max_iter=300, tol=0.0001, precompute_distances='auto', verbose=0, random_state=None, copy_x=True, n_jobs=1, algorithm='auto')
KMeans類的主要參數有:
- n_clusters: 即我們的k值,一般需要多試一些值以獲得較好的聚類效果。k值好壞的評估標準在下面會講。
2)max_iter: 最大的迭代次數,一般如果是凸數據集的話可以不管這個值,如果數據集不是凸的,可能很難收斂,此時可以指定最大的迭代次數讓算法可以及時退出循環。
3)n_init:用不同的初始化質心運行算法的次數。由于K-Means是結果受初始值影響的局部最優的迭代算法,因此需要多跑幾次以選擇一個較好的聚類效果,默認是10,一般不需要改。如果你的k值較大,則可以適當增大這個值。
4)init: 即初始值選擇的方式,可以為完全隨機選擇'random',優化過的'k-means++'或者自己指定初始化的k個質心。一般建議使用默認的'k-means++'。
5)algorithm:有“auto”, “full” or “elkan”三種選擇。"full"就是我們傳統的K-Means算法, “elkan”是我們原理篇講的elkan K-Means算法。默認的"auto"則會根據數據值是否是稀疏的,來決定如何選擇"full"和“elkan”。一般數據是稠密的,那么就是 “elkan”,否則就是"full"。一般來說建議直接用默認的"auto"
2.3. MiniBatchKMeans類主要參數
MiniBatchKMeans(n_clusters=8, init='k-means++', max_iter=100, batch_size=100, verbose=0, compute_labels=True, random_state=None, tol=0.0, max_no_improvement=10, init_size=None, n_init=3, reassignment_ratio=0.01)
MiniBatchKMeans類的主要參數比KMeans類稍多,主要有:
- n_clusters: 即我們的k值,和KMeans類的n_clusters意義一樣。
2)max_iter:最大的迭代次數, 和KMeans類的max_iter意義一樣。
3)n_init:用不同的初始化質心運行算法的次數。這里和KMeans類意義稍有不同,KMeans類里的n_init是用同樣的訓練集數據來跑不同的初始化質心從而運行算法。而MiniBatchKMeans類的n_init則是每次用不一樣的采樣數據集來跑不同的初始化質心運行算法。
4)batch_size:即用來跑Mini Batch KMeans算法的采樣集的大小,默認是100.如果發現數據集的類別較多或者噪音點較多,需要增加這個值以達到較好的聚類效果。
5)init: 即初始值選擇的方式,和KMeans類的init意義一樣。
6)init_size: 用來做質心初始值候選的樣本個數,默認是batch_size的3倍,一般用默認值就可以了。
7)reassignment_ratio: 某個類別質心被重新賦值的最大次數比例,這個和max_iter一樣是為了控制算法運行時間的。這個比例是占樣本總數的比例,乘以樣本總數就得到了每個類別質心可以重新賦值的次數。如果取值較高的話算法收斂時間可能會增加,尤其是那些暫時擁有樣本數較少的質心。默認是0.01。如果數據量不是超大的話,比如1w以下,建議使用默認值。如果數據量超過1w,類別又比較多,可能需要適當減少這個比例值。具體要根據訓練集來決定。
8)max_no_improvement:即連續多少個Mini Batch沒有改善聚類效果的話,就停止算法, 和reassignment_ratio, max_iter一樣是為了控制算法運行時間的。默認是10.一般用默認值就足夠了。
二、完整程序
# -*- coding: utf-8 -*-
from sklearn.cluster import KMeans
from sklearn.cluster import KMeans
from sklearn.cluster import MiniBatchKMeans
import matplotlib.pyplot as plt
import numpy as np
#展示數據
def showCluster(dataSet, k, clusterAssment):
dataSet = np.array(dataSet)
numSamples= np.shape(dataSet)[0]
dim = np.shape(dataSet)[1]
if dim != 2:
print("Sorry! I can not draw because the dimension of your data is not 2!")
return 1
mark = ['or', 'ob', 'og', 'ok', '^r', '+r', 'sr', 'dr', '<r', 'pr']
if k > len(mark):
print("")
return 1
# draw all samples
for i in range(numSamples):
markIndex = int(clusterAssment[i])
plt.plot(dataSet[i, 0], dataSet[i, 1], mark[markIndex])
plt.show()
if __name__ == '__main__':
print("加載數據")
dataSet = []
fileIn = open('data\\testData.txt')
for line in fileIn.readlines():
lineArr = line.strip().split(' ')
dataSet.append([float(lineArr[0]), float(lineArr[1])])
#轉化為矩陣
k = 2
# centroids = KMeans(n_clusters=k, random_state=9).fit_predict(dataSet)
clusterAssment = MiniBatchKMeans(n_clusters=k, batch_size=200, random_state=9).fit_predict(dataSet)
# # 最后結果
print(clusterAssment)
# print("顯示數據")
showCluster(dataSet, k, clusterAssment)