河南省建设注册中心网站,一级a做爰片免费网站 新闻,企业公司网站模板下载,焦作做网站K-Means算法是将一组N个样本的特征矩阵X划分为K个无交集的簇#xff0c;直观上来看是簇是一组一组聚集在一起的数据#xff0c;在一个簇中的数据就认为是同一类。簇就是聚类的结果表现。簇中所有数据的均值通常被称为这个簇的“质心”(Centroids)。在一个二维平面中#xff…K-Means算法是将一组N个样本的特征矩阵X划分为K个无交集的簇直观上来看是簇是一组一组聚集在一起的数据在一个簇中的数据就认为是同一类。簇就是聚类的结果表现。簇中所有数据的均值通常被称为这个簇的“质心”(Centroids)。在一个二维平面中一簇数据点的质心的横坐标就是这一簇数据点的横坐标的均值质心的纵坐标就是这一簇数据点的纵坐标的均值。同理可推广至高维空间。算法实现一、随机取n个点即想要分类数目二、将当前数据每个点都与取到的n个点进行作差将差值最小的分为一类三、将分好类的结果取出计算均值取出每个类中和均值距离最小的值将其做为新的中心点四、重复上述步骤直到最终分成的簇内结果不再发生变化在当前的算法里我们连续验证三次即在三次内结果不再发生变化迭代就会停止#k均值计算import numpy as npimport pandas as pdimport randomimport mathdef data(): rand_value [random.randint(1,10000) for i in range(10000)] # print(rand_value) # rand_value [63, 23, 93, 52, 33, 84, 34, 91, 52, 68, 64, 4, 3, 58, 37, 76, 75, 52, 49, 34, 91, 29, 67, 42, 97, 69, 99, 9, 15, # 44, 12, 46, 86, 92, 10, 67, 46, 93, 49, 29, 93, 95, 60, 33, 30, 63, 24, 45, 26, 47, 12, 62, 50, 54, 13, 62, 40, 39, # 32, 2, 92, 34, 20, 72, 68, 37, 88, 32, 84, 28, 88, 85, 5, 88, 56, 30, 5, 3, 43, 9, 13, 62, 44, 11, 90, 97, 80, 34, # 12, 90, 56, 54, 87, 59, 20, 51, 58, 54, 29, 32] return rand_value#进行计算并返回质心及详细信息def k_mean(data_list,k,rand_choice): # rand_choice [random.choice(data_list) for i in range(k)] temp_dict {} for i in range(len(data_list)): temp_list [] for j in range(len(rand_choice)): #解决符号差异带来的影响 temp_list.append(abs(abs(data_list[i]) - abs(rand_choice[j]))) insert_index temp_list.index(min(temp_list)) if temp_dict.get(rand_choice[insert_index]): temp_dict[rand_choice[insert_index]].append(data_list[i]) else: temp_dict[rand_choice[insert_index]] [data_list[i]] return temp_dict#输出距离均值最近的点返回新的质心及中心点def min_distince(data_dict): k_list [] k_keys list(data_dict.keys()) for j in range(len(k_keys)): data_list data_dict[k_keys[j]] mean_value sum(data_list)/len(data_list) for i in range(len(data_list)): if i 0: distance_value abs(data_list[i] - mean_value) s 0 # distance_list.append(distance_value) else: if distance_value abs(data_list[i] - mean_value): s i distance_value min(distance_value,abs(data_list[i] - mean_value)) k_list.append(data_list[s]) # distance_list.append(distance_value) return k_listdef iteration(source_data,k): iter_num 0 end_list [] if len(source_data) k: print(需要计算的数据量少于要分类的数据量请检查数据源\n) else: while True: iter_num 1 print(迭代次数%d%iter_num) if iter_num 1: data_dict k_mean(source_data,k,[random.choice(source_data) for i in range(k)]) end_list.append(data_dict) # print(data_dict) result min_distince(data_dict) # result min_distince(k_mean(source_data,k,[random.choice(source_data) for i in range(k)])) else: data_dict k_mean(source_data,k,result) end_list.append(data_dict) # print(data_dict) result min_distince(data_dict) if len(end_list) 4: del end_list[0] if end_list[0] end_list[1] and end_list[1] end_list[2]: print(data_dict) breakif __name__ __main__: source_data data() iteration(source_data,5)