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
相关文章
|
4月前
|
算法 数据可视化 数据挖掘
Python Monte Carlo K-Means聚类实战研究
Python Monte Carlo K-Means聚类实战研究
|
10月前
|
机器学习/深度学习 存储 自然语言处理
机器学习面试笔试知识点-贝叶斯网络(Bayesian Network) 、马尔科夫(Markov) 和主题模型(T M)1
机器学习面试笔试知识点-贝叶斯网络(Bayesian Network) 、马尔科夫(Markov) 和主题模型(T M)
141 0
机器学习面试笔试知识点-贝叶斯网络(Bayesian Network) 、马尔科夫(Markov) 和主题模型(T M)1
|
10月前
|
机器学习/深度学习 自然语言处理 算法
机器学习面试笔试知识点-贝叶斯网络(Bayesian Network) 、马尔科夫(Markov) 和主题模型(T M)2
机器学习面试笔试知识点-贝叶斯网络(Bayesian Network) 、马尔科夫(Markov) 和主题模型(T M)
52 0
|
机器学习/深度学习 算法
朴素贝叶斯Naive Bayesian分类器 (NBC)
本文介绍常见的机器学习模型朴素贝叶斯Naive Bayesian。 朴素贝叶斯模型属于generative model,即通过输出的结果反推生成结果的模型概率。
朴素贝叶斯Naive Bayesian分类器 (NBC)
|
机器学习/深度学习 算法 数据库
嗨! Apriori算法(二)
嗨! Apriori算法(二)
116 0
|
算法 数据挖掘 数据库
嗨! Apriori算法(一)
嗨! Apriori算法(一)
133 0
|
机器学习/深度学习 数据挖掘
【SVM最后一课】详解烧脑的Support Vector Regression
【SVM最后一课】详解烧脑的Support Vector Regression
283 0
【SVM最后一课】详解烧脑的Support Vector Regression
|
算法 安全 数据库
Drug Target Review | 开发一种算法来预测药物性肝损伤
Drug Target Review | 开发一种算法来预测药物性肝损伤
164 0
Drug Target Review | 开发一种算法来预测药物性肝损伤
|
机器学习/深度学习 算法 JavaScript
sklearn调包侠之逻辑回归
本系列教程为《机器学习实战》的读书笔记。首先,讲讲写本系列教程的原因: 第一,《机器学习实战》的代码由Python2编写,有些代码在Python3上运行已会报错,本教程基于Python3进行代码的修订. 第二:之前看了一些机器学习的书籍,没有进行记录,很快就忘记掉了,通过编写教程也是一种复习的过程. 第三,机器学习相对于爬虫和数据分析而言,学习难度更大,希望通过本系列文字教程,让读者在学习机器学习的路上少走弯路。
|
算法 Python 自然语言处理
sklearn调包侠之朴素贝叶斯
文档处理 朴素贝叶斯算法常用于文档的分类问题上,但计算机是不能直接理解文档内容的,怎么把文档内容转换为计算机可以计算的数字,这是自然语言处理(NLP)中很重要的内容。
1502 0