2021-06-22

算法演示和完整代码见文末,下一期将带来ML中经典的C4.5决策树算法。
读者闲聊
背景介绍

主要理论
数据清单
分词工具
工程复现
动态演示
优化展望
读者闲聊

这两天总结了读者对于公众号文章的建议,在改变自己输出知识方式的同时,也是从不同角度去了解这些知识,能把枯燥繁琐的算法变为精简干练、浅显易懂的干货文章也并非轻易之事。一起加油!

背景介绍

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

聚类算法:

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

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

主要理论

Name: Euclidean Distance

Model: KMeans Clustering

数据清单

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

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)

动态演示

Fig.2 KMeans training display
总结展望

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

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

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

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

完整代码

Github Code后台回复"KMEANS"获取完整代码
参考链接

Cvcr

DBSCAN

扫描二维码获取
更多精彩

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值