numpy実現k-meansアルゴリズム

3453 ワード

numpy実現k-meansアルゴリズム
numpyの中国語のドキュメントを見ていくつか学びました
彼のk-meansコードを試してみました
ローカルでの運用に問題がある場所もあります
ちょっと直して、詳しい注釈をつけて理解を助けました.
元のコードのアドレスは:NumPy中国語ドキュメント
import matplotlib.pyplot as plt
import numpy as np
import random
import math
import re

def euclDistance(v1, v2):
    #        
    return math.sqrt(sum(np.power(v2 - v1, 2)))

def initCentroids(dataSet, k):#dataSet-      k-      
    #      
    numSamples, dim = dataSet.shape#numSample-      dim-      
    #shape             
    centroids = np.zeros((k, dim))#centroids-       
    for i in range(k):
        index = int(random.uniform(0, numSamples))#index-             
        centroids[i, :] = dataSet[index, :]
        #        centroids
        """----------------------------------------  :   random               """
    return centroids

def kmeans(dataSet, k):
    #k-means       
    numSamples = dataSet.shape[0]#              
    clusterAssment = np.mat(np.zeros((numSamples, 2)))#clusterAssment-         
    #1.zeros      numSamples,  2   
    #2.mat 1          
    clusterChanged = True#clusterChanged-                 
    
    centroids = initCentroids(dataSet, k)#     
    
    while clusterChanged:#       
        clusterChanged = False#       
        for i in range(numSamples):#       
            minDist = 100000.0#minDist-            
            minIndex = 0#minIndex-       
            for j in range(k):
                #                 ,         
                distance = euclDistance(centroids[j, :], dataSet[i, :])#distance-             
                if distance < minDist:
                    minDist = distance
                    minIndex = j
            if clusterAssment[i, 0] != minIndex:#                            
                clusterChanged = True#       
                clusterAssment[i, :] = minIndex, minDist**2#              ,                  
        for j in range(k):#              
            pointsInCluster = dataSet[np.nonzero(clusterAssment[:, 0].A == j)[0]]#                  ?
            """----------------------------------------------------  :      """
            centroids[j, :] = np.mean(pointsInCluster, axis = 0)
            #np.mean()-       axis=0-        
    print("    ")
    return centroids,clusterAssment

def showCluster(dataSet, k, centroids, clusterAssment):
	#     
    numSamples, dim = dataSet.shape
    if dim != 2:
        print("         ")
        return 1
    mark = ['or', 'ob', 'og', 'ok', '^r', '+r', 'sr', 'dr', ' len(mark):
        print("k     ,      ")
        return 1
    for i in range(numSamples):#       
        markIndex = int(clusterAssment[i, 0])
        plt.plot(dataSet[i, 0], dataSet[i, 1], mark[markIndex])
    mark = ['Dr', 'Db', 'Dg', 'Dk', '^b', '+b', 'sb', 'db', '

一応分かりましたが、中には2つのコードがありますが、実装プロセスが分かりません.もし大物が知っていたら、説明してください(´v`)