vlambda博客
学习文章列表

ML机器学习|KMeans聚类算法|EM算法

算法演示和完整代码见文末,下一期将带来ML中经典的C4.5决策树算法。

  • 读者闲聊
  • 背景介绍

  • 主要理论

  • 数据清单

  • 分词工具

  • 工程复现

  • 动态演示

  • 优化展望
 读者闲聊  
 背景介绍  
EM算法:

全称Expectation Maximum,指最大期望算法。是通过极大似然估计进行迭代的优化算法。迭代分为E和M两步轮流进行,E步就是求当前的期望,M步是求当前的极大似然估计。

聚类算法:

顾名思义,物以类聚,指由聚类算法生成多组数据的集合 ,每组数据与同一个集合中的数据彼此相似,与其他集合中的数据相异。

KMeans算法:

K均值聚类算法是最著名的划分聚类算法,由于简洁和效率使得它成为最广泛使用的聚类算法,在业务上常用来对用户群体进行划分加强业务算法效率和性能。

 主要理论  

Name: Euclidean Distance

Model: KMeans Clustering

ML机器学习|KMeans聚类算法|EM算法

 数据清单  
结构化数据集
dataset.zip:包含1000行,3列特征列

ML机器学习|KMeans聚类算法|EM算法

Fig.1 data display

 工程复现  

配置基本需求库
""" Import the basic requirements package """import time
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

配置数据集导出函数

""" Dataset export function """

def read_csv():

    X = np.random.randint(low=1, high=100, size=(800, 3))
    print(X.shape)           # Print feature set and label set length
    return context
配置 Euclidean距离计算 函数
""" Euclidean distance function """

def distance(x, y):

    y = y.values

    x_C_dis = np.sqrt(np.sum(np.power(x - y, 2), axis=1))

    return x_C_dis
配置K中心点计算函数
""" K vectors calculation function """

def calc_k_vectors(data, k):

    C_set = []
    for c in range(k):
        C_set.append(data[data['C'] == c][['x', 'y', 'z']].mean().values)

    k_vectors = np.vstack(tuple(C_set))

    return k_vectors
配置TfIdf模型函数
""" KMeans model function """

# create model
def KMeans(k=10):

    kmeans_params = {
        'k': k,                                    # Set the base of the kmeans logarithm
    }
    return kmeans_params

# fit model
def fit(kmeans_params, X):

    data = pd.DataFrame(X, columns=['x', 'y', 'z'])

    k_index = data.sample(n=kmeans_params['k'], random_state=1).index   
# Initialize K randomly selected points
    k_vector = data[['x', 'y', 'z']].iloc[k_index].values

    ax = Axes3D(plt.figure(figsize=(9, 7.5)))

    plt.ion()

    for i in range(100):

        data['C'] = data[['x', 'y', 'z']].apply(lambda row: np.argmin(distance(k_vector, row)), axis=1)

        k_vector = calc_k_vectors(data, kmeans_params['k'])
        
# Initialize K randomly selected points
        ax.cla()

        for c in range(kmeans_params['k']):
            tmp = data[data['C'] == c]
            ax.scatter(tmp['x'], tmp['y'], tmp['z'], label='C' + str(c))

        ax.set_xlabel('X Label')
        ax.set_ylabel('Y Label')
        ax.set_zlabel('Z Label')
        ax.set_title('KMeans training...' + str(i) + ':')

        plt.legend()
        plt.pause(0.6)

    plt.ioff()
    plt.show()

    return data
配置训练主进程
""" KMeans model training host process """

if __name__ == '__main__':
    sta_time = time.time()

    X = read_csv()

    model = KMeans(k=4)
    KMeans_x= fit(model, X)

    print("Time:", time.time() - sta_time)
 动态演示  

ML机器学习|KMeans聚类算法|EM算法

Fig.2 KMeans training display

 总结展望  

本次复现的结果中,笔者提示有四个以上可以变换的方向
  • KMeans的K值选取同上篇文章PCA降维算法,可以使用累计方差贡献率作为评估指标,也就是手肘法

  • KMeans的K点选取初始化对聚类结果影响重大,本文采用随机选择初始化,可以根据正态高斯分布使K点选取初始化。

  • 业务中KMeans法的使用目的并不是将目标确区分,而是为了聚类对不同类别进行模型训练,增进模型效率和性能

  • KMeans采用的是欧氏距离公式,是一种线性聚类算法,对于现实世界中的非线性数据往往无从下手,可以尝试采用非线性聚类如DBSCAN算法

 完整代码  

Github Code后台回复"KMEANS"获取完整代码

参考链接  

Cvcr

https://www.termonline.cn/search?k=cumulative%20variance%20contribution%20rate&r=1623741786660

DBSCAN

https://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html
ML机器学习|KMeans聚类算法|EM算法

扫描二维码获取

更多精彩





筝自然语言处理和推荐算法