【手すりマシン学習シリーズ】kmeansアルゴリズム


「マシン学習の実戦」を復習して、その中の古典的なアルゴリズムに対して改めて勉強して、また別の感じです.やっと自分が以前に本当に理解していなかったことを発見しました.データ構造アルゴリズムの理解をもとに、またマシン学習アルゴリズムを見てみて、同じ作業の妙があることを発見しました.
【手すりマシン学習シリーズ】kmeansアルゴリズム
原理:(資源が多すぎて、ここではもはや説明しない)
手裂きコード:
import math
import random

'''
Author:kevinelstri
Date:2021/04/22
Desc:        
'''

#     
def load_data(filename):
    dataSet = []
    for line in open(filename).readlines():
        dataLines = [float(i) for i in line.strip().split('\t')]
        dataSet.append(dataLines)
    return dataSet

#     (    )
def dist(vec1,vec2):
    return math.sqrt(pow(vec1[0]-vec2[0],2)+pow(vec1[1]-vec2[1],2))

#        
def mean():
    L = [[1.658985, 4.285136], [-3.453687, 3.424321], [4.838138, -1.151539]]
    sum_list = [sum(i) for i in zip(*L)]
    avg_list = [sum(i)/len(L) for i in zip(*L)]
    return sum_list,avg_list

#     k     
def randomCenter(dataSet,k):
    dataLength = len(dataSet)
    if k > dataLength:
        return
    randomCenter = []
    for i in range(k):
        randomNum = random.randomInt(1,dataLength-1) #      
        randomCenter.append(dataSet[randomNum])
    return randomCenter

#     
def kmeans(dataSet,k,randomCenter):
    clusterCenterBegin = randomCenter
    clusterCenterEnd = []
    dataLength = len(dataSet)
    cluster = [[] for i in range(k)]
    for i in range(dataLength):
		distList = []
        for j in range(k):
            distList.append(dist(dataSet[i],dataSet[j]))
        cluster[distList.index(min(distList))].append(dataSet[i])  #       ,    ,        list
        
    #        
    for i in range(k):
        tmp = cluster[i]
        avg = [sum(i)/len(tmp) for i in zip(*tmp)]  #      
        randomCenterEnd[i] = avg
    
    #     
    if clusterCenterBegin != clusterCenterEnd:
        kmeans(dataSet,k,clusterCenterEnd)
    return cluster,clusterCenterEnd

#      
if __name__ == '__main__':
    #     
    filename = 'testSet.txt'
    dataSet = load_data(filename)
    print('   :',dataSet)
    
    #     k     
    k = 3
    randonCenter = randomCenter(dataSet,k)
    print(f'  {k}     {randomCenter}')
    
    #     
    cluster,clusterCenter = kmeans(dataSet,k,randomCenter)
    
    #       
    for i in range(k):
        print(f' {i+1}     ',cluster[i])
        print(f' {i+1}     'clusterCenter[i])
コード解析:
今回のコードは「再帰」方式を用いてkmeansアルゴリズムを実現し、無監督アルゴリズムでは最終的な目標は最適化結果を解決することであり、再帰アルゴリズムを使って反復して最終結果を得ることができる.
コードリンク:https://github.com/kevinelstri/Hander-Marchine-Learning-Series/tree/main/K-means