本文之編寫程序涉及到API介紹,程序的完整實現(xiàn),具體算法原理請查看之前所寫的K-Means算法介紹
一、基礎(chǔ)準(zhǔn)備
1、python 基礎(chǔ)
2、scikit 基礎(chǔ)
2.1 K-Means類概述
在scikit-learn中,包括兩個K-Means的算法,一個是傳統(tǒng)的K-Means算法,對應(yīng)的類是KMeans。另一個是基于采樣的Mini Batch K-Means算法,對應(yīng)的類是MiniBatchKMeans。一般來說,使用K-Means的算法調(diào)參是比較簡單的。
用KMeans類的話,一般要注意的僅僅就是k值的選擇,即參數(shù)n_clusters;如果是用MiniBatchKMeans的話,也僅僅多了需要注意調(diào)參的參數(shù)batch_size,即我們的Mini Batch的大小。
當(dāng)然KMeans類和MiniBatchKMeans類可以選擇的參數(shù)還有不少,但是大多不需要怎么去調(diào)參。下面我們就看看KMeans類和MiniBatchKMeans類的一些主要參數(shù)。
2.2 KMeans類主要參數(shù)
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類的主要參數(shù)有:
- n_clusters: 即我們的k值,一般需要多試一些值以獲得較好的聚類效果。k值好壞的評估標(biāo)準(zhǔn)在下面會講。
2)max_iter: 最大的迭代次數(shù),一般如果是凸數(shù)據(jù)集的話可以不管這個值,如果數(shù)據(jù)集不是凸的,可能很難收斂,此時可以指定最大的迭代次數(shù)讓算法可以及時退出循環(huán)。
3)n_init:用不同的初始化質(zhì)心運行算法的次數(shù)。由于K-Means是結(jié)果受初始值影響的局部最優(yōu)的迭代算法,因此需要多跑幾次以選擇一個較好的聚類效果,默認(rèn)是10,一般不需要改。如果你的k值較大,則可以適當(dāng)增大這個值。
4)init: 即初始值選擇的方式,可以為完全隨機(jī)選擇'random',優(yōu)化過的'k-means++'或者自己指定初始化的k個質(zhì)心。一般建議使用默認(rèn)的'k-means++'。
5)algorithm:有“auto”, “full” or “elkan”三種選擇。"full"就是我們傳統(tǒng)的K-Means算法, “elkan”是我們原理篇講的elkan K-Means算法。默認(rèn)的"auto"則會根據(jù)數(shù)據(jù)值是否是稀疏的,來決定如何選擇"full"和“elkan”。一般數(shù)據(jù)是稠密的,那么就是 “elkan”,否則就是"full"。一般來說建議直接用默認(rèn)的"auto"
2.3. MiniBatchKMeans類主要參數(shù)
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類的主要參數(shù)比KMeans類稍多,主要有:
- n_clusters: 即我們的k值,和KMeans類的n_clusters意義一樣。
2)max_iter:最大的迭代次數(shù), 和KMeans類的max_iter意義一樣。
3)n_init:用不同的初始化質(zhì)心運行算法的次數(shù)。這里和KMeans類意義稍有不同,KMeans類里的n_init是用同樣的訓(xùn)練集數(shù)據(jù)來跑不同的初始化質(zhì)心從而運行算法。而MiniBatchKMeans類的n_init則是每次用不一樣的采樣數(shù)據(jù)集來跑不同的初始化質(zhì)心運行算法。
4)batch_size:即用來跑Mini Batch KMeans算法的采樣集的大小,默認(rèn)是100.如果發(fā)現(xiàn)數(shù)據(jù)集的類別較多或者噪音點較多,需要增加這個值以達(dá)到較好的聚類效果。
5)init: 即初始值選擇的方式,和KMeans類的init意義一樣。
6)init_size: 用來做質(zhì)心初始值候選的樣本個數(shù),默認(rèn)是batch_size的3倍,一般用默認(rèn)值就可以了。
7)reassignment_ratio: 某個類別質(zhì)心被重新賦值的最大次數(shù)比例,這個和max_iter一樣是為了控制算法運行時間的。這個比例是占樣本總數(shù)的比例,乘以樣本總數(shù)就得到了每個類別質(zhì)心可以重新賦值的次數(shù)。如果取值較高的話算法收斂時間可能會增加,尤其是那些暫時擁有樣本數(shù)較少的質(zhì)心。默認(rèn)是0.01。如果數(shù)據(jù)量不是超大的話,比如1w以下,建議使用默認(rèn)值。如果數(shù)據(jù)量超過1w,類別又比較多,可能需要適當(dāng)減少這個比例值。具體要根據(jù)訓(xùn)練集來決定。
8)max_no_improvement:即連續(xù)多少個Mini Batch沒有改善聚類效果的話,就停止算法, 和reassignment_ratio, max_iter一樣是為了控制算法運行時間的。默認(rèn)是10.一般用默認(rèn)值就足夠了。
二、完整程序
# -*- 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
#展示數(shù)據(jù)
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("加載數(shù)據(jù)")
dataSet = []
fileIn = open('data\\testData.txt')
for line in fileIn.readlines():
lineArr = line.strip().split(' ')
dataSet.append([float(lineArr[0]), float(lineArr[1])])
#轉(zhuǎn)化為矩陣
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)
# # 最后結(jié)果
print(clusterAssment)
# print("顯示數(shù)據(jù)")
showCluster(dataSet, k, clusterAssment)