K-Means - 基于scikit實現(xiàn)程序

本文之編寫程序涉及到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ù)有:

  1. 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類稍多,主要有:

  1. 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)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容