sklearn调包侠之K-Means

简介: K-Means算法k-均值算法(K-Means算法)是一种典型的无监督机器学习算法,用来解决聚类问题。算法流程K-Means聚类首先随机确定 K 个初始点作为质心(这也是K-Means聚类的一个问题,这个K值的不合理选择会使得模型不适应和解释性差)。
img_d363fda41060ff5f557e8af646e2ddd8.png

K-Means算法

k-均值算法(K-Means算法)是一种典型的无监督机器学习算法,用来解决聚类问题。

算法流程

K-Means聚类首先随机确定 K 个初始点作为质心(这也是K-Means聚类的一个问题,这个K值的不合理选择会使得模型不适应和解释性差)。然后将数据集中的每个点分配到一个簇中, 具体来讲,就是为每个点找到距其最近的质心(这里算的为欧式距离,当然也可以使用其他距离), 并将其分配该质心所对应的簇;这一步完成之后,每个簇的质心更新为该簇所有点的平均值;重复上述过程直到数据集中的所有点都距离它所对应的质心最近时结束。

算法伪代码
创建 k 个点作为起始质心(随机选择)
当任意一个点的簇分配结果发生改变时(不改变时算法结束)
    对数据集中的每个数据点
        对每个质心
            计算质心与数据点之间的距离
        将数据点分配到距其最近的簇
    对每一个簇, 计算簇中所有点的均值并将均值作为质心

实战

构造数据

首先,我们用make_blobs创建数据集,如图所示。

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets import make_blobs

X, y = make_blobs(n_samples=200,
                  n_features=2,
                  centers=4,
                  cluster_std=1,
                  center_box=(-10.0, 10.0),
                  shuffle=True,
                  random_state=1)

plt.figure(figsize=(6,4), dpi=144)
plt.xticks(())
plt.yticks(())
plt.scatter(X[:, 0], X[:, 1], s=20, marker='o')
img_c66d7a151b0bf1b429717a413cdba9c7.png
训练模型与评估

该算法使用 sklearn.cluster 模块中的KMeans函数。

from sklearn.cluster import KMeans

n_clusters = 3
kmean = KMeans(n_clusters=n_clusters)
kmean.fit(X);
print("kmean: k={}, cost={}".format(n_clusters, int(kmean.score(X))))

# result
# kmean: k=3, cost=-668
绘制聚类结果

最后,我们通过matplotlib绘制聚类的结果,如图所示:

labels = kmean.labels_
centers = kmean.cluster_centers_
markers = ['o', '^', '*']
colors = ['r', 'b', 'y']

plt.figure(figsize=(6,4), dpi=144)
plt.xticks(())
plt.yticks(())

# 画样本
for c in range(n_clusters):
    cluster = X[labels == c]
    plt.scatter(cluster[:, 0], cluster[:, 1], 
                marker=markers[c], s=20, c=colors[c])
# 画出中心点
plt.scatter(centers[:, 0], centers[:, 1],
            marker='o', c="white", alpha=0.9, s=300)
for i, c in enumerate(centers):
    plt.scatter(c[0], c[1], marker='$%d$' % i, s=50, c=colors[i])
img_6ee5bc9c8167ef0e20f1584a162da9c6.png
相关文章
|
6月前
|
机器学习/深度学习 编解码 计算机视觉
【论文速递】CVPR2022-Blind2Unblind:具有可见盲点的自监督图像去噪
【论文速递】CVPR2022-Blind2Unblind:具有可见盲点的自监督图像去噪
|
3月前
|
机器学习/深度学习 自然语言处理
准确率达60.8%,浙大基于Transformer的化学逆合成预测模型,登Nature子刊
【8月更文挑战第29天】浙江大学团队在《Nature》子刊上发表的论文介绍了一款名为EditRetro的基于Transformer架构的化学逆合成预测模型,其准确率高达60.8%,为化学合成领域带来了革命性的变化。此模型无需依赖传统化学反应模板,具备更强的泛化能力和多样化合成路线生成能力,在药物研发和材料科学领域展现出巨大潜力,尽管仍存在一定的错误率和计算资源需求高等挑战。论文详情见:https://www.nature.com/articles/s41467-024-50617-1。
53 3
|
5月前
|
算法 Python
使用k-近邻算法改进约会网站的配对效果(kNN)
使用k-近邻算法改进约会网站的配对效果(kNN)
48 6
|
6月前
|
机器学习/深度学习 数据可视化 算法
R语言中的SOM(自组织映射神经网络)对NBA球员聚类分析
R语言中的SOM(自组织映射神经网络)对NBA球员聚类分析
|
机器学习/深度学习 存储 人工智能
7 Papers & Radios | Hinton前向-前向神经网络训练算法;科学家造出「虫洞」登Nature封面
7 Papers & Radios | Hinton前向-前向神经网络训练算法;科学家造出「虫洞」登Nature封面
126 0
|
机器学习/深度学习 达摩院 算法
CIKM 2022 AnalytiCup Competition: 联邦异质任务学习
为了探索联邦学习中的异质性,推动联邦学习领域的发展,阿里巴巴达摩院智能计算实验室联合天池举办“CIKM 2022 AnalytiCup Competition: 联邦异质任务学习”大赛,期待借助本次比赛助力打破现实应用中的“数据孤岛”,推动实现数据价值的共享。
837 0
|
算法 安全 数据库
Drug Target Review | 开发一种算法来预测药物性肝损伤
Drug Target Review | 开发一种算法来预测药物性肝损伤
177 0
Drug Target Review | 开发一种算法来预测药物性肝损伤
|
安全
Science | 初步的SARS-CoV-2蛋白酶抑制剂在小鼠中显示功效
Science | 初步的SARS-CoV-2蛋白酶抑制剂在小鼠中显示功效
167 0
Science | 初步的SARS-CoV-2蛋白酶抑制剂在小鼠中显示功效
|
机器学习/深度学习 算法 JavaScript
sklearn调包侠之逻辑回归
本系列教程为《机器学习实战》的读书笔记。首先,讲讲写本系列教程的原因: 第一,《机器学习实战》的代码由Python2编写,有些代码在Python3上运行已会报错,本教程基于Python3进行代码的修订. 第二:之前看了一些机器学习的书籍,没有进行记录,很快就忘记掉了,通过编写教程也是一种复习的过程. 第三,机器学习相对于爬虫和数据分析而言,学习难度更大,希望通过本系列文字教程,让读者在学习机器学习的路上少走弯路。
|
算法 Python 机器学习/深度学习
sklearn调包侠之PCA降维
PCA PCA(主成分分析),它是一种维度约减算法,即把高维度数据在损失最小的情况下转换为低纬度数据的算法。 实战——人脸识别 数据导入 该数据集可通过sklearn进行下载。
3387 0