Python sklearn中的K-Means聚类使用方法浅析

目录
  • 初步认识
  • 初值选取
  • 小批

初步认识

k-means翻译过来就是K均值聚类算法,其目的是将样本分割为k个簇,而这个k则是KMeans中最重要的参数:n_clusters,默认为8。

下面做一个最简单的聚类

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
X, y = make_blobs(1500)
fig = plt.figure()
for i in range(2):
    ax = fig.add_subplot(1,2,i+1)
    y = KMeans(i+2).fit_predict(X)
    plt.scatter(X[:, 0], X[:, 1], c=y)
plt.show()

其中,y是聚类结果,其数值表示对应位置X所属类号。

效果如图所示,对于下面这组数据来说,显然最好是分为两类,但如果KMeansn_clusters设为3,那就会聚成3类。

上面调用的KMeans是一个类,sklearn中同样提供了函数形式的调用,其使用方法如下

from sklearn.cluster import k_means
cen, y, interia = k_means(X, 3)

其中,cen表示聚类后,每一类的质心;y为聚类后的标签;interia表示均方误差之和。

初值选取

KMeans最重要的概念是簇,也就是被分割后的数据种类;而每个簇都有一个非常重要的点,就是质心。在设定好簇的个数之后,也就相当于确定了质心的个数,而KMeans算法的基本流程是

  • 选择k个点作为k个簇的初始质心
  • 计算样本到这k个质心(簇)的距离,并将其划入距离最近的簇中
  • 计算每个簇的均值,并使用该均值更新簇的质心

重复上述2-3的操作,直到质心区域稳定或者达到最大迭代次数。

从这个流程可以看出来,KMeans算法至少有两个细节需要考虑,一个是初始化方案,另一个则是质心更新的方案。

KMeans类或者k_means函数中,提供了两种初始化质心方案,通过参数init来控制

  • 'random':表示随机生成k个质心
  • 'k-means++':此为默认值,通过kMeans++方法来初始化质心。

kMeans++初始化质心的流程如下

  • 随机选择1个点作为初始质心 x 0
  • ​计算其他点到最近质心的距离
  • 假定现有 n n n个质心了,那么选择距离当前质心较远的点作为下一个质心 x n x_n xn​

重复步骤2和3,直到质心个数达到 k k k个。

若希望直接调用kMeans++函数,则可使用kmeans_plusplus

小批

sklearn提供了KMeans的一个变种MiniBatchKMeans,可在每次训练迭代中随机抽样,这种小批量的训练过程大大减少了运算时间。

当样本量非常巨大时,小批KMeans的优势是非常明显的

from sklearn.cluster import MiniBatchKMeans
import time
ys, xs = np.indices([4,4])*6
cens = list(zip(xs.reshape(-1), ys.reshape(-1)))
X, y = make_blobs(100000,centers=cens)
km = KMeans(16)
mbk = MiniBatchKMeans(16)
def test(func, value):
    t = time.time()
    func(value)
    print("耗时", time.time()-t)
test(km.fit_predict, X)
# 耗时 3.2028110027313232
test(mbk.fit_predict, X)
# 耗时 0.2590029239654541

可见效果非常明显,其中fit_predictpredict相似,但并没有返回值,km.fit_predict(X)运行之后,会更改km中的labels_属性,此即分类结果

fig = plt.figure()
ax = fig.add_subplot(1,2,1)
ax.scatter(X[:,0], X[:,1], c=km.labels_,
    marker='.', alpha=0.5)
ax = fig.add_subplot(1,2,2)
ax.scatter(X[:,0], X[:,1], c=mbk.labels_,
    marker='.', alpha=0.5)
plt.show()

效果如图所示,可见小批的KMeans算法和KMeans算法从结果上来看区别不大。

到此这篇关于Python sklearn中的K-Means聚类使用方法浅析的文章就介绍到这了,更多相关Python K-Means聚类内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 人工智能——K-Means聚类算法及Python实现

    目录 1 概述 1.1 无监督学习 1.2 聚类 1.3 K-Mean均值算法 2 K-Mean均值算法 2.1 引入 2.2 针对大样本集的改进算法:Mini Batch K-Means 2.3 图像 3 案例1 3.1 代码 3.2 结果 4 案例2 4.1 案例——数据 4.2 代码 4.3 结果 4.4 拓展&&改进 1 概述 1.1 无监督学习 在一个典型的监督学习中,我们有一个有标签的训练集,我们的目标是找到能够区分正样本和负样本的决策边界,在这里的监督学习中,我们有一系列标签

  • Python K-means实现简单图像聚类的示例代码

    这里直接给出第一个版本的直接实现: import os import numpy as np from sklearn.cluster import KMeans import cv2 from imutils import build_montages import matplotlib.image as imgplt image_path = [] all_images = [] images = os.listdir('./images') for image_name in images

  • Python实现聚类K-means算法详解

    目录 手动实现 sklearn库中的KMeans K-means(K均值)算法是最简单的一种聚类算法,它期望最小化平方误差 注:为避免运行时间过长,通常设置一个最大运行轮数或最小调整幅度阈值,若到达最大轮数或调整幅度小于阈值,则停止运行. 下面我们用python来实现一下K-means算法:我们先尝试手动实现这个算法,再用sklearn库中的KMeans类来实现.数据我们采用<机器学习>的西瓜数据(P202表9.1): # 下面的内容保存在 melons.txt 中 # 第一列为西瓜的密度:第

  • 利用Python实现K-Means聚类的方法实例(案例:用户分类)

    目录 K-Means聚类算法介绍 K-Means聚类算法基础原理 K-Means聚类算法实现流程 开始做一个简单的聚类 数据导入 数据探索 开始聚类 查看输出结果 聚类质心 K-Means聚类算法的评估指标 真实标签已知 真实标签未知 实用案例:基于轮廓系数来选择最佳的n_clusters 结果对比 优化方案选择 K-Means聚类算法介绍 K-Means又称为K均值聚类算法,属于聚类算法中的一种,而聚类算法在机器学习算法中属于无监督学习,在业务中常常会结合实际需求与业务逻辑理解来完成建模: 无

  • Python读取csv文件做K-means分析详情

    目录 1.运行环境及数据 2.基于时间序列的分析2D 2.1 2000行数据结果展示 2.2 6950行数据结果展示 2.3 300M,约105万行数据结果展示 3.经纬度高程三维坐标分类显示3D-空间点聚类 3.1 2000行数据结果显示 3.2 300M的CSV数据计算显示效果 1.运行环境及数据 Python3.7.PyCharm Community Edition 2021.1.1,win10系统. 使用的库:matplotlib.numpy.sklearn.pandas等 数据:CSV

  • Python sklearn中的K-Means聚类使用方法浅析

    目录 初步认识 初值选取 小批 初步认识 k-means翻译过来就是K均值聚类算法,其目的是将样本分割为k个簇,而这个k则是KMeans中最重要的参数:n_clusters,默认为8. 下面做一个最简单的聚类 import numpy as np import matplotlib.pyplot as plt from sklearn.cluster import KMeans from sklearn.datasets import make_blobs X, y = make_blobs(1

  • python中opencv K均值聚类的实现示例

    目录 K均值聚类 K均值聚类的基本步骤 K均值聚类模块 简单例子 K均值聚类 预测的是一个离散值时,做的工作就是“分类”. 预测的是一个连续值时,做的工作就是“回归”. 机器学习模型还可以将训练集中的数据划分为若干个组,每个组被称为一个“簇(cluster)”.这种学习方式被称为“聚类(clusting)”,它的重要特点是在学习过程中不需要用标签对训练样本进行标注.也就是说,学习过程能够根据现有训练集自动完成分类(聚类). 根据训练数据是否有标签,可以将学习划分为监督学习和无监督学习. K近邻.

  • Python sklearn中的.fit与.predict的用法说明

    我就废话不多说了,大家还是直接看代码吧~ clf=KMeans(n_clusters=5) #创建分类器对象 fit_clf=clf.fit(X) #用训练器数据拟合分类器模型 clf.predict(X) #也可以给新数据数据对其预测 print(clf.cluster_centers_) #输出5个类的聚类中心 y_pred = clf.fit_predict(X) #用训练器数据X拟合分类器模型并对训练器数据X进行预测 print(y_pred) #输出预测结果 补充知识:sklearn中

  • 19个Python Sklearn中超实用的隐藏功能分享

    目录 写在前面 1 .covariance.EllipticEnvelope 2 .feature_selection.RFECV 3 .ensemble.ExtraTrees 4 .impute.IterativeImputer 和 .impute.KNNImputer 5 .linear_model.HuberRegressor 6 .tree.plot_tree 7 .linear_model.Perceptron 8 .feature_selection.SelectFromModel

  • Python sklearn KFold 生成交叉验证数据集的方法

    源起: 1.我要做交叉验证,需要每个训练集和测试集都保持相同的样本分布比例,直接用sklearn提供的KFold并不能满足这个需求. 2.将生成的交叉验证数据集保存成CSV文件,而不是直接用sklearn训练分类模型. 3.在编码过程中有一的误区需要注意: 这个sklearn官方给出的文档 >>> import numpy as np >>> from sklearn.model_selection import KFold >>> X = [&quo

  • python spyder中读取txt为图片的方法

    有时候需要将一个环境中的图片可视化,但是可能这个环境下不方便,因此需要将这个环境下的图像数据保存下来,然后在另一个环境下查看,比如,有一个图像数据,image.txt,里面的数据是图像的像素值,范围是0-255,像素值之间以空格键分开,行与行之间是回车键分开,那么在Python Spyder环境下通过简单的几条语句就搞定: import numpy from skimage import io image = numpy.loadtxt("image.txt") io.imshow(i

  • 在python image 中安装中文字体的实现方法

    如果一些应用需要到中文字体(如果pygraphviz,不安装中文字体,中文会显示乱码),就要在image 中安装中文字体. 默认 python image 是不包含中文字体的: mac-temp:relation_graph test$ docker run --rm -it python bash root@36d738e2084c:/# fc-list /usr/share/fonts/truetype/dejavu/DejaVuSerif-Bold.ttf: DejaVu Serif:st

  • 对python PLT中的image和skimage处理图片方法详解

    用PLT比较轻量级,用opencv是比较重量级 import numpy as np from PIL import Image if __name__ == '__main__': image_file = '/Users/mac/Documents/学习文档/机器学习/5.Package/son.png' height = 100 #假定写入图片的高度是100 img = Image.open(image_file) img_width, img_height = img.size #获取i

  • python 字典中取值的两种方法小结

    如下所示: a={'name':'tony','sex':'male'} 获得name的值的方式有两种 print a['name'],type(a['name']) print a.get('name'),type(a.get('name')) 发现这两个结果完全一致,并没有任何的差异. 怎么选择这两个不同的字典取值方式呢? 如果字典已知,我们可以任选一个,而当我们不确定字典中是否存在某个键时,我之前的做法如下 if 'age' in a.keys(): print a['age'] 因为不先

  • Python OpenCV中的drawMatches()关键匹配绘制方法

    目录 作用说明 函数原型 参数详解 结果 作用说明 该方法被用于绘制关键点的匹配情况.我们看到的许多匹配结果都是使用这一方法绘制的——一左一右两张图像,匹配的关键点之间用线条链接. 函数原型 cv.drawMatches( img1, keypoints1, img2, keypoints2, matches1to2, outImg[, matchColor[, singlePointColor[, matchesMask[, flags]]]]) -> outImg cv.drawMatche

随机推荐