本文介绍 Python 语言调用 sklearn 包中 K-Means 算法实现聚类的方法。

在 sklearn 包中,常用的 K-Means 方法有两种:KMeans 和 MiniBatchKMeans

两种方法的参数相似,常用参数如下:
n_clusters:聚类数量,即 k 值,默认为 8
init:初始化聚类中心的方法,如需自定义设置,则传入 ndarray 格式的参数
n_init:用不同的初始化聚类中心运行算法的次数,默认为 10,如自定义设置初始聚类中心,则置为 1
max_iter:最大迭代次数,默认为 300
batch_size:(仅 MiniBatchKMeans)批次大小,默认为 100
verbose:是否打印日志,默认为否

注:自定义设置初始聚类中心的一个用处是去除算法的随机性,即防止每次运行结果不一样。

随机生成一组算例,给出代码和可视化结果作为示例:

基本参数:

NUM_POINT = 500  # 点的总数
RAN_COO = (0, 100)  # 坐标范围NUM_CLUSTER = 20  # 聚类数量
MAX_ITERATION = 5000  # 最大迭代次数
NUM_BATCH = 10  # 批次数量

随机生成算例:

import random
import pandas as pdedge_width= 1  # 坐标边界宽度random.seed(612)
list_coo_x = [random.randint(RAN_COO[0] + edge_width, RAN_COO[1] - edge_width) for _ in range(NUM_POINT)]
list_coo_y = [random.randint(RAN_COO[0] + edge_width, RAN_COO[1] - edge_width) for _ in range(NUM_POINT)]
df_point = pd.DataFrame({'x': list_coo_x, 'y': list_coo_y})

模型初始化:

from sklearn.cluster import KMeans, MiniBatchKMeans# 方式 1: KMeans 方法;初始聚类中心的生成方式为默认
model = KMeans(n_clusters=NUM_CLUSTER, max_iter=MAX_ITERATION, verbose=True)# 方式 2: MiniBatchKMeans 方法;初始聚类中心的生成方式为默认
model = MiniBatchKMeans(n_clusters=NUM_CLUSTER, max_iter=MAX_ITERATION, batch_size=round(NUM_POINT / NUM_BATCH), verbose=True)# 方式 3: KMeans 方法;自定义初始聚类中心
model = KMeans(n_clusters=num_cluster_adjust, init=init, n_init=1, max_iter=MAX_ITERATION, verbose=True)# 方式 4: MiniBatchKMeans 方法;自定义初始聚类中心
model = MiniBatchKMeans(n_clusters=NUM_CLUSTER, init=init, n_init=1, max_iter=MAX_ITERATION, batch_size=round(NUM_POINT / NUM_BATCH), verbose=True)

(附)一种自定义初始聚类中心的方法:

思路:将点集所在的矩形区域划分为格子,取每个小格的中心作为初始聚类中心

from typing import Tuple, List
import mathdef get_init_centres(num_cluster: int, ran_x: Tuple[float, float], ran_y: Tuple[float, float],per_adjust_n: float = 0.05) -> Tuple[int, List[Tuple[float, float]]]:"""获取初始聚类中心的坐标:param num_cluster:  聚类数量:param ran_x:  区域的横坐标范围:param ran_y:  区域的纵坐标范围:param per_adjust_n:  聚类数量允许调整的百分比,默认0.05:return: num_cluster_adjust:  调整后的聚类数量:return: list_pos_centres:  初始聚类中心的坐标列表"""print(">> 获取初始聚类中心的坐标,开始")def get_nearest_divisors(number: int) -> Tuple[int, int]:"""获取一个整数最相邻的两个约数:param number:  一个大的整数:return: a:  较小的约数:return: b:  较大的约数"""init_value = int(math.sqrt(number))a, b = init_value, init_valuewhile (a * b != number) and (a > 0):if a * b < number:b += 1else:a -= 1return a, b# 横坐标范围和纵坐标范围,哪一个为长边if_len_x = True if ran_x[1] - ran_x[0] >= ran_y[1] - ran_y[0] else Falselen_x_y = ran_x[1] - ran_x[0] if if_len_x else ran_y[1] - ran_y[0]wid_x_y = ran_y[1] - ran_y[0] if if_len_x else ran_x[1] - ran_x[0]# 聚类数量的可调整范围lb_num_cluster = math.ceil((1 - per_adjust_n) * num_cluster)ub_num_cluster = math.floor((1 + per_adjust_n) * num_cluster)# 调整聚类数量,使其尽可能符合坐标范围的长宽比len_cluster, wid_cluster = num_cluster, 1diff = 1for n in range(lb_num_cluster, ub_num_cluster + 1):tmp_wid, tmp_len = get_nearest_divisors(n)tmp_diff = abs(tmp_wid / tmp_len - wid_x_y / len_x_y)if tmp_diff < diff:len_cluster, wid_cluster = tmp_len, tmp_widdiff = tmp_diff# 结果输出:调整后的聚类数量num_cluster_adjust = len_cluster * wid_cluster# 结果输出:初始聚类中心的坐标列表if if_len_x:list_x_centres = [ran_x[0] + len_x_y / (2 * len_cluster) + len_x_y / len_cluster * i for i in range(len_cluster)]list_y_centres = [ran_y[0] + wid_x_y / (2 * wid_cluster) + wid_x_y / wid_cluster * j for j in range(wid_cluster)]else:list_x_centres = [ran_x[0] + wid_x_y / (2 * wid_cluster) + wid_x_y / wid_cluster * j for j in range(wid_cluster)]list_y_centres = [ran_y[0] + len_x_y / (2 * len_cluster) + len_x_y / len_cluster * i for i in range(len_cluster)]list_pos_centres = [(x, y) for x in list_x_centres for y in list_y_centres]print("<< 获取初始聚类中心的坐标,结束")return num_cluster_adjust, list_pos_centres
import numpy as npran_x, ran_y = (min(df_point['x']), max(df_point['x'])), (min(df_point['y']), max(df_point['y']))
num_cluster_adjust, list_centre_initial = get_init_centres(num_cluster=NUM_CLUSTER, ran_x=ran_x, ran_y=ran_y)
if num_cluster_adjust != NUM_CLUSTER:print("聚类数量由 {0} 调整为 {1}".format(NUM_CLUSTER, num_cluster_adjust), '\n')
init = np.array(list_centre_initial, dtype=np.float64)  # 自定义聚类中心的格式

算法运行:

model.fit(df_point)

结果处理:

df_centre = pd.DataFrame(model.cluster_centers_, columns=['x', 'y']).reset_index()
se_category = pd.Series(model.labels_, index=df_point.index)
df_res = pd.concat([df_point, se_category], axis=1)
df_res.rename(columns={0: "category"}, inplace=True)
print("最终聚类数量: {}".format(len(set(df_res["category"]))), '\n')

结果可视化:

from matplotlib import pyplot as pltlist_color = ["red", "green", "blue", "orange", "purple", 'darkorange', 'deepskyblue', 'lime', 'fuchsia', "grey"]
list_marker = ['.', 'o', 's', 'x', '+', '*', 'p', 'v', '^', '<', '>', '1', '2', '3', '4']i = 0
for c, df in df_res.groupby("category"):x, y = df['x'], df['y']plt.scatter(x=x, y=y, c=list_color[i % len(list_color)], marker=list_marker[i % len(list_marker)], alpha=1)i += 1plt.xlim(RAN_COO[0], RAN_COO[1])
plt.ylim(RAN_COO[0], RAN_COO[1])

上述算例的可视化结果:

方式 1: KMeans 方法;初始聚类中心的生成方式为默认

方式 2:MiniBatchKMeans 方法;初始聚类中心的生成方式为默认

方式 3: KMeans 方法;自定义初始聚类中心

方式 4: MiniBatchKMeans 方法;自定义初始聚类中心

sklearn K-Means 算法的调用相关推荐

  1. kmeans改进 matlab,基于距离函数的改进k―means 算法

    摘要:聚类算法在自然科学和和社会科学中都有很普遍的应用,而K-means算法是聚类算法中经典的划分方法之一.但如果数据集内相邻的簇之间离散度相差较大,或者是属性分布区间相差较大,则算法的聚类效果十分有 ...

  2. k means算法C语言伪代码,K均值算法(K-Means)

    1. K-Means算法步骤 算法步骤 收敛性定义,畸变函数(distortion function): 伪代码: 1) 创建k个点作为K个簇的起始质心(经常随机选择) 2) 当任意一个点的蔟分配结果 ...

  3. k均值聚类算法(K Means)及其实战案例

    算法说明 K均值聚类算法其实就是根据距离来看属性,近朱者赤近墨者黑.其中K表示要聚类的数量,就是说样本要被划分成几个类别.而均值则是因为需要求得每个类别的中心点,比如一维样本的中心点一般就是求这些样本 ...

  4. K means 图片压缩

    k-means的基本原理较为清晰,这里不多赘述,本次博客主要通过基础的k means算法进行图像的压缩处理. 原理分析 在彩色图像中,每个像素的大小为3字节(RGB),可以表示的颜色总数为256 * ...

  5. sklearn之LASSO算法应用

    sklearn之LASSO算法应用 前言: 本文介绍LASSO算法理论以及sklearn中Lasso算法如何调用和使用 一.LASSO算法和岭回归算法对比 •Tibshirani(1996)提出了La ...

  6. K近邻算法 模拟sklearn调用 自定义优化Knn算法模型 ---完整代码

    通过函数与欧拉距离公式实现Knn算法,再调用我们的py文件实现模拟 1.首先设置好欧拉距离公式计算个点之间距离的函数,收集它们的距离. import numpy as np import math f ...

  7. SK-learn实现k近邻算法【准确率随k值的变化】-------莺尾花种类预测

    代码详解: from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split fr ...

  8. 【机器学习】sklearn机器学习入门案例——使用k近邻算法进行鸢尾花分类

    1 背景 这个案例恐怕已经被说的很烂了,机器学习方面不同程度的人对该案例还是有着不同的感觉.有的人追求先理解机器学习背后的理论甚至自己推导一遍相关数学公式,再用代码实现:有的人则满足于能够实现相关功能 ...

  9. 基于K均值算法的鸢尾花聚类实验(Sklearn实现)

    实验代码 ##### 相关库导入部分 ##### from sklearn.datasets import load_iris import pandas as pd from sklearn.pre ...

  10. 【机器学习入门】(1) K近邻算法:原理、实例应用(红酒分类预测)附python完整代码及数据集

    各位同学好,今天我向大家介绍一下python机器学习中的K近邻算法.内容有:K近邻算法的原理解析:实战案例--红酒分类预测.红酒数据集.完整代码在文章最下面. 案例简介:有178个红酒样本,每一款红酒 ...

最新文章

  1. 广东省哪个学校电子计算机有名,广东省电子职业技术学校
  2. 机器学习Python实践》——数据导入(CSV)
  3. 省高校计算机等级考试二级,湖南省高校计算机等级考试二级考试0810.ppt
  4. Silverlight游戏设计(Game Design):目录
  5. 天龙八部3d最新服务器,天龙八部3DIOS正版服务器整合互通公告
  6. Qracle学习:时间和日期函数
  7. 自定义hashCode()
  8. 分布式与人工智能课程(part5)--第五课
  9. 计算机网络——数据链路层的概述
  10. django项目转pyc_Python自动化运维系列:Django搭建小博客
  11. 4月18日云栖精选夜读 | 阿里靠什么支撑 EB 级计算力?
  12. Redhat as 4 中创建 LVM 逻辑卷
  13. angular之service、factory预provider区别
  14. Dubbo服务治理(一):限流策略
  15. LT8618SX寄存器配置
  16. qregexp括号匹配_qt中的正则表达式QRegExp使用大全以及匹配中括号[]方法大全
  17. AES 对称加密算法
  18. 【Sass/SCSS】我花4小时整理了的Sass的函数
  19. 【Python 3 的基础语法】
  20. 羽毛球社团php,羽毛球兴趣小组计划

热门文章

  1. 零信任安全,从微分段做起
  2. 制作android布局模板,Android模板制作
  3. 工具软件:TCP网络调试程序(附源代码)
  4. 华科计算机学院报录比,华科各专业报录比
  5. axios中params和data的区别
  6. 微信服务商开通免充值代金券接口升级验收
  7. 王小川为何否认搜狗浏览器泄密!
  8. SOLIDWORKS又显示内存不足了?用这几个办法试试看
  9. ps学习 通道扣图——玻璃杯
  10. 初识DDD-理解基本概念