CDA数据分析师Kmeans算法精简版(无for loop循环)( 三 )
算法完成了 , 将所有的代码整合在一起def initial_centers(datasets, k = 3):cols = datasets.columnsdata_content = datasets.loc[:, cols != 'label']range_info = data_content.describe().loc[['min','max']]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.Tdef cal_distant(dataset, centers):data = http://news.hoteastday.com/a/dataset.loc[:, dataset.columns !='label']d_to_centers = [np.power(data - centers.loc[i], 2).sum(axis = 1)for i in centers.index]return pd.concat(d_to_centers, axis = 1)def iterate(dataset, centers):d_to_centers = cal_distant(dataset, centers)curr_group = d_to_centers.idxmin(axis=1)SSE = d_to_centers.min(axis = 1).sum()centers = dataset.loc[:, dataset.columns != 'label'].groupby(curr_group).mean()return curr_group, SSE, centersdef Kmeans_regular(data, k = 3):SSE_list = [0]centers = initial_centers(data, k = k)while True:curr_group, SSE, centers = iterate(data,centers)if SSE_list[-1] == SSE:breakSSE_list.append(SSE)return curr_group, SSE_list, centers
上面的函数已经完成 , 当然这里推荐大家尽量写成class的形式更好 , 这里为了方便观看 , 则用简单的函数完成 。
最后的函数是Kmeans_regular函数 , 这个函数里面包含了上面所有的函数 。 现在需要测试Kmeans_regular代码对于多特征的数据集鸢尾花数据集 , 是否也能进行Kmeans聚类算法from sklearn.datasets import load_irisdata_dict = load_iris()iris = pd.DataFrame(data_dict.data, columns = data_dict.feature_names)iris['label'] = data_dict.targetcurr_group, SSE_list, centers = Kmeans_regular(iris.copy(), k = 3)np.array(SSE_list)array([0., 589.73485975, 115.8301874 ,83.29216169,79.45325846,78.91005674,78.85144143])pd.crosstab(iris['label'], curr_group)
col_0012label0500010482201436np.diag(pd.crosstab(iris['label'], curr_group)).sum() /iris.shape[0]0.8933333333333333
最后可以看出我们的代码是可以适用于多特征变量的数据集 , 并且对于鸢尾花数据集来说 , 对角线上的数是预测正确的个数 , 准确率大约为90% 。 9 Kmeans中间过程以及可视化展现
? 在完成代码后 , 还是需要讨论一下 , 为什么我们的代码的算法是那样的 , 这个算法虽然看起来很有逻辑 , 但是它到底是从哪里来的 。
? 这个时候 , 我们就需要从Kmeans的损失函数出发来解释刚才提出的问题 。 对于无监督学习算法来说 , 也是有一个损失函数 。 而我们的Kmeans的中间过程的逻辑 , 就是从最小化Kmeans的损失函数的过程 。
? 假设我们有一个数据集{x_1, x_2, ..., x_N}x1?,x2?,...,xN? ,每个样本实例点x有多个特征 。 我们的目标是将这个数据集通过某种方式切分成K份 , 或者说我们最后想将每个样本点标上一个类别(簇) , 且总共有K个类别 , 使得每个样本点到各自的簇中心点的距离最小 , 并且u_kuk?来表示各个簇的中心点 。
我们还需要一些其他的符号 , 比如说r_{nk}rnk?, 它的值是0或者1 。 下标k代表的是第k个簇 , 下标n表示的是第n个样本点 。
【CDA数据分析师Kmeans算法精简版(无for loop循环)】举例说明 , 加入当前K=3 , k的可取1 , 2 , 3 。 对于第一个实例点n = 1来说它属于第3个簇 , 所以
r_{n=1, k = 1} = 0rn=1,k=1?=0
r_{n=1, k = 2} = 0rn=1,k=2?=0
r_{n=1, k = 3} = 1rn=1,k=3?=1
这个也可以把想象成独热编码 。
推荐阅读
- 互联网分析师于斌|对于陆正耀“背后”的愉悦资本来说,反思才是第一要务
- 人群中国科学家通过古人基因组数据探寻中国文明源流
- 联想|联想个人云存储Mac版上线 苹果电脑用户数据备份更便捷
- 信息史上最全SpaceX火箭数据开源,核心、组员舱、起落架、发射信息全都有!
- 云创|真旺(徐州)大数据总经理李华领一行到访云创
- 主题马蜂窝大数据:大人小孩一起过“六一”,主题公园最受欢迎
- |6大数据可视化应用设计规范
- 链上|链上数据5月扫描:10000美元阻力下的链上百态
- 孜然实验室|DNA存储器突破了理论极限,一部手机装下全世界的数据
- 数据驶向智能海洋深处,华为存储的无尽想象