K++算法是优化版的kmeans算法,它避免不准确,所以要筛选两个距离远的点来作为中心点
1.在样本中随机一个中心点
2.在样本中找到距上一个中心点较远的一个点作为中心点
3.用kmeans算法进行聚类
下面是筛选距离的一个方法源代码
def roll_select(samples_distance):
"""
samples_distance:为样本当前的距离列表,get_distance的返回结果
选择下一个聚类中心,以距离远近作为概率值,距离越远则被选择概率越大,距离越近则概率越小
"""
# 依据距离计算每个样本点被选择作为下一个聚类中心点的概率
p = samples_distance / np.sum(samples_distance)
# 采用轮盘赌选择法选择下一个聚类中心
cum_p = np.cumsum(p)#累计和
# print(cum_p)
select_index_lst = []
# 为确保选择聚类中心比较靠谱,做多次轮盘赌选择出现次数比较多的样本索引
for i in range(int(0.15 * len(samples_distance))):
rand_num = rd.random()
select_index = list(rand_num > cum_p).index(False)#
print(select_index)
select_index_lst.append(select_index)
count_dict = {i: select_index_lst.count(i) for i in np.unique(select_index_lst)}#选出不同的元素并计算出出现次数
select_index = sorted(count_dict, key=lambda x: count_dict[x])[-1]#排序从后向前排序
return select_index