CDA数据分析师Kmeans算法精简版(无for loop循环)



CDA数据分析师Kmeans算法精简版(无for loop循环)
本文插图

? 大家在学习算法的时候会学习到关于Kmeans的算法 , 但是网络和很多机器学习算法书中关于Kmeans的算法理论核心一样 , 但是代码实现过于复杂 , 效率不高 , 不方便阅读 。 这篇文章首先列举出Kmeans核心的算法过程 , 并且会给出如何最大限度的在不用for循环的前提下 , 利用numpy, pandas的高效的功能来完成Kmeans算法 。 这里会用到列表解析 , 它是相当于速度更快的for循环 , 标题里指出的无for loop指的是除了列表解析解析以外不用for循环 , 来完成Kmeans算法 。
? 一般在python数据清洗中 , 数据量大的情况下 , for循环的方法会使的数据处理的过程特别慢 , 效率特别低 。 一个很好的解决方法就是使用numpy , pandas自带的高级功能 , 不仅可以使得代码效率大大提高 , 还可以使得代码方便理解阅读 。 这里在介绍用numpy , pandas来进行Kmeans算法的同时 , 也是带大家复习一遍numpy , pandas用法 。 1 Kmeans的算法原理创建k个点作为初始质?心(通常是随机选择)当任意一个点的簇分配结果发生改变时:对数据集中的每个点:对每个质?:计算质?与数据点之间的距离将数据点分配到据其最近的簇对每个簇 , 计算簇中所有点的均值并将均值作为新的质?点直到簇不再发?变化或者达到最大迭代次数2 聚类损失函数
SSE = \sum_{i=1}^k\sum_{x\in C_{i}}(c_{i} - x)^2SSE=i=1∑k?x∈Ci?∑?(ci??x)2
C_{i}指的是第i个簇, x是i个簇中的点 , c_{i}是第i个簇的质心Ci?指的是第i个簇,x是i个簇中的点 , ci?是第i个簇的质心import numpy as npimport pandas as pdimport matplotlib as mplimport matplotlib.pyplot as pltfrom sklearn.datasets import make_blobsimport seaborn as sns#r = np.random.randint(1,100)r = 4#print(r)k = 3x , y = make_blobs(n_samples = 51,cluster_std = [0.3, 0.3, 0.3],centers = [[0,0],[1,1],[-1,1]],random_state = r)sim_data = http://news.hoteastday.com/a/pd.DataFrame(x, columns = ['x', 'y'])sim_data['label'] = ysim_data.head(5)data = http://news.hoteastday.com/a/sim_data.copy()plt.scatter(sim_data['x'], sim_data['y'], c = y)

CDA数据分析师Kmeans算法精简版(无for loop循环)
本文插图

上图是一个随机生成的2维的数据 , 可以用来尝试完成Kmeans的代码 。
实际过程中 , Kmeans需要能运行在多维的数据上 , 所以下面的代码部分 , 会考虑多维的数据集 , 而不是仅仅2维的数据 。 3 随机生成数据点
? 这里的严格意义上不是随机的生成k个质心点 , 而是取出每个特征的最大值最小值 , 在最大值和最小值中取出一个随机数作为质心点的一个维度def initial_centers(datasets, k = 3):#首先将datasets的特征名取出来 , 这里需要除去label那一列cols = datasets.columnsdata_content = datasets.loc[:, cols != 'label']#直接用describe的方法将每一列的最小值最大值取出来range_info = data_content.describe().loc[['min','max']]#用列表解析的方法和np.random.uniform的方法生成k个随机的质心点#np.random.uniform(a, b, c) 随机生成在[a,b)区间里的3个数#对每个特征都做此操作k_randoms = [np.random.uniform(range_info[i]['min'],range_info[i]['max'], k)for i in range_info.columns]centers = pd.DataFrame(k_randoms, index = range_info.columns)return centers.Tcenters = initial_centers(data, k = 3)centers
xy00.1225750.0217621-0.9225961.3675042-0.677202-0.4118214 计算所有的点到所有中心点的距离
? 将每一个中心点取出来 , 然后使用pandas的广播的功能 , 可以直接将所有的实例和其中一个质心点相减 。 如下图 , 下图中是给出相加的例子 , 而我们的例子是减法 。


推荐阅读