kmeans手写实现与sklearn接口

kmeans手写实现与sklearn接口

kmeans简介

K 均值聚类是最基础的一种聚类方法。它是一种迭代求解的聚类分析算法。

kmeans的迭代步骤

  1. 给各个簇中心 μ1,…,μc\mu_1,\dots,\mu_cμ1,,μc 以适当的初值;

  2. 更新样本 x1,…,xnx_1,\dots,x_nx1,,xn 对应的簇标签 y1,…,yny_1,\dots,y_ny1,,yn
    yi←argminy∈{1,…,c}∣∣xi−μy∣∣2,i=1,…,ny_i\leftarrow argmin_{y\in \{1,\dots,c\}}||x_i-\mu_y||^2,\ \ \ i=1,\dots,n yiargminy{1,,c}∣∣xiμy2,   i=1,,n

  3. 更新各个簇中心 μ1,…,μc\mu_1,\dots,\mu_cμ1,,μc
    μy←1ny∑i:yi=yxi,y=1,…,c\mu_y\leftarrow \frac{1}{n_y}\sum_{i:y_i=y}x_i,\ \ \ y=1,\dots,c μyny1i:yi=yxi,   y=1,,c
    其中,nyn_yny 为属于簇 yyy 的类别总数

  4. 重复上述步骤2, 3,直到簇标签不再变化(变化足够小),达到收敛精度为止

优缺点

优点

  1. 算法快速、简单;
  2. 对大数据集有较高的效率并且是可伸缩性的;
  3. 时间复杂度近于线性,而且适合挖掘大规模数据集。K-Means聚类算法的时间复杂度是O(n×k×t) ,其中n代表数据集中对象的数量,t代表着算法迭代的次数,k代表着簇的数目

缺点

  1. 在k-measn算法中K是事先给定的,但是K值的选定是非常难以估计的。
  2. 在 K-means 算法中,首先需要根据初始聚类中心来确定一个初始划分,然后对初始划分进行优化。这个初始聚类中心的选择对聚类结果有较大的影响,一旦初始值选择的不好,可能无法得到有效的聚类结果,这也成为 K-means算法的一个主要问题。
  3. 当数据量很大时,算法的开销是非常大的。

kmeans算法的改进

  • kmeans++
  • 二分Kmeans
    • 分解最大 SSE (误差平方和)的簇
    • 合并距离最小的簇 或者 合并SSE增幅最小的两个簇。

手写实现

伪代码:

创建 k 个点作为起始质心 (随机选择):当任意一个点的簇分配结果发生改变的时候:对数据集中的每个数据点:对每个质心:计算质心与数据点之间的距离将数据点分配到距其最近的簇对每一个簇:求出均值并将其更新为质心

Python实现:

import numpy as npdef kmeans(data, n_clusters, tolerence):n_samples = data.shape[0]sample_asign = np.zeros((n_samples, 2))cluster_centers = data[: n_clusters, :]isChanged = Trueepoch_cnt = 0while isChanged:epoch_cnt += 1isChanged = False# 更新每个样本点所属于的类for sample_index in range(n_samples):min_dist = np.infmin_index = 0for cluster_index in range(n_clusters):dist = np.linalg.norm(data[sample_index, :] - cluster_centers[cluster_index, :])if dist < min_dist:min_dist = distmin_index = cluster_indexsample_asign[sample_index, :] = min_dist, min_index# 更新每个聚类中心for cluster_index in range(n_clusters):new_cluster_samples = data[ sample_asign[:, 1] == cluster_index ]new_center = np.mean(new_cluster_samples, axis=0)cluster_center_diff = np.linalg.norm( new_center - cluster_centers[cluster_index, :] )cluster_centers[cluster_index, :] = new_centerif cluster_center_diff > tolerence:isChanged = Trueprint(f"epoch count: {epoch_cnt}")return cluster_centersif __name__ == '__main__':n_samples = 512data_dim = 3n_clusters = 4data = np.random.randn(n_samples, data_dim)tol = 1e-12centers = kmeans(data, n_clusters, tol)print(centers)

sklearn接口

kmeans 手写实现主要还是为了理解算法,在实际应用中,我们一般调 sklearn 的包就好了。

class sklearn.cluster.KMeans(n_clusters=8, init='k-means++', n_init=10, max_iter=300, tol=0.0001, verbose=0, random_state=None, copy_x=True, algorithm='lloyd')

类初始化参数

  • init:指定初始化聚类中心的方法。可以是 kmeans++ (默认),random 随机选取,或者是一个形状为 (n_clusters, n_features) 的数组,直接将该数组作为初始的聚类中心。
  • n_init:使用不同质心 (centeroid) 种子运行k -means 算法的次数。最终结果将是 inertia 最佳时的输出。整型,默认为 10。
  • max_iter:kmeans 算法单词运行的最大迭代数。整型,默认 300。
  • tol:关于两次连续迭代的聚类中心差异的 Frobenius 范数的相对容忍度,小于该值认为收敛。浮点数。
  • verbose:是否打印迭代过程中的输出。整型,默认为 0。
  • random_state:决定初始聚类中心的随机数种子。整型。
  • copy_x:在预先计算距离时,首先将数据居中在数值上更准确。 如果 copy_x 为 True(默认),则不修改原始数据。 如果为 False,则修改原始数据,并在函数返回之前放回,但通过减去再添加数据均值可能会引入小的数值差异。 请注意,如果原始数据不是 C 连续的,即使 copy_x 为 False,也会进行复制。 如果原始数据是稀疏的,但不是 CSR 格式,即使 copy_x 为 False,也会进行复制。
  • algorithm:要使用的 K-means 算法。 默认是经典的 EM 风格算法 “lloyd”。可选项有:“lloyd”, “elkan”, “auto”, “full”。

类属性

  • cluster_centers_:聚类中心的坐标,是一个形状为 (n_clusters, n_features) 的数组。如果算法完全收敛,则与 labels_ 一致。
  • labels_:每个点的标签,形状为 (n_clusters, ) 。
  • inertia_:样本到其最近聚类中心的平方距离总和,如果给了权重的话会计算加权和。浮点数。
  • n_features_in_:在运行 fit 方法时见到的特征数,整型、
  • feature_names_in_:在运行 fit 方法时见到到的特征名称。只有当 X 的要素名称均为字符串时才定义。形状为 (n_features_in_, ) 的数组。

类方法

函数签名说明
fit(X[, y, sample_weight])计算 kmeans 聚类
fit_predict(X[, y, sample_weight])计算 kmeans 聚类并预测每个样本的簇序号
fit_transform(X[, y, sample_weight])计算 kmeans 聚类并将 X 转换到聚类距离空间
get_feature_names_out([input_features])获取转换的输出特征名称
get_params([deep])获取 estimator 的参数
predict(X[, sample_weight])预测 X 中每个样本所属于的簇
score(X[, y, sample_weight])(看起来是评估模型的准确率)
set_params(**params)设置 estimator 的参数
transform(X)将 X 转换到聚类距离空间

模型保存与加载

需要通过 joblib 来保存,安装:

pip install joblib

保存/加载模型

from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
import joblibx, y = make_blobs(n_samples=1000, n_features=4, centers=[[-1, -1], [0, 0], [1, 1], [2, 2]], cluster_std=[0.4, 0.2, 0.2, 0.4], random_state=42)
model = KMeans(n_clusters=6)
model.fit(x, y)
print(model.cluster_centers_)
# 保存模型
joblib.dump(model, 'kmeans_model.pkl')
# 加载模型
model = joblib.load('kmeans_model.pkl')
print(model.cluster_centers_)

Ref

  1. 图解机器学习——杉山将
  2. sklearn官方文档
  3. k-means原理与实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/532438.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小说中场景的功能_《流浪地球》:从小说到电影

2019年春节贺岁档冒出一匹黑马&#xff1a;国产科幻片《流浪地球》大年初一上映后口碑、票房双丰收&#xff1a;截至9日下午&#xff0c;票房已破15亿&#xff0c;并获得9.2的高评分。著名导演詹姆斯卡梅隆通过社交媒体对我国春节期间上映的科幻影片《流浪地球》发出的祝愿&…

线性回归与逻辑回归及其实现

线性回归与逻辑回归及其实现 回归与分类 预测值定性分析&#xff0c;即离散变量预测时&#xff0c;称之为分类&#xff1b;预测值定量分析&#xff0c;即连续变量预测时&#xff0c;称之为回归。 如预测一张图片是猫还是狗&#xff0c;是分类问题&#xff1b;预测明年的房价…

hbase 页面访问_HBase

HBase 特点 海量存储 Hbase 适合存储 PB 级别的海量数据&#xff0c;在 PB 级别的数据以及采用廉价 PC 存储的情况下&#xff0c;能在几十到百毫秒内返回数据。这与 Hbase 的极易扩展性息息相关。正式因为 Hbase 良好的扩展性&#xff0c;才为海量数据的存储提供了便利。 2&…

深入理解L1、L2正则化

深入理解L1、L2正则化 转自&#xff1a;【面试看这篇就够了】L1、L2正则化理解 一、概述 正则化&#xff08;Regularization&#xff09;是机器学习中一种常用的技术&#xff0c;其主要目的是控制模型复杂度&#xff0c;减小过拟合。正则化技术已经成为模型训练中的常用技术&a…

rk3128屏幕占空比参数设置_瑞芯微RK3128芯片怎么样 性能全面解读

最近&#xff0c;笔者听说一款搭载瑞芯微RK3128芯片方案的盒子问市了&#xff0c;打听了一下才知道还真有其事&#xff0c;这款上市的RK3128盒子叫做开博尔M1&#xff0c;报价229元&#xff0c;这个价位在如今的四核网络机顶盒市场可谓是不多见&#xff0c;但是这款芯片的性能怎…

机器学习中的概率模型

机器学习中的概率模型 转自&#xff1a;https://zhuanlan.zhihu.com/p/164551678 机器学习中的概率模型 概率论&#xff0c;包括它的延伸-信息论&#xff0c;以及随机过程&#xff0c;在机器学习中有重要的作用。它们被广泛用于建立预测函数&#xff0c;目标函数&#xff0c;以…

访问云服务器储存的mp4_访问云服务器储存的mp4

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":6,"count":6}]},"card":[{"des":"云服务器 ECS(Elastic Compute Service)是一…

先验、后验、似然

先验、后验、似然 先验分布、后验分布和似然函数 本节转自&#xff1a;先验分布、后验分布、似然估计这几个概念是什么意思&#xff0c;它们之间的关系是什么&#xff1f; 通俗解释 先验分布&#xff1a;根据一般的经验认为随机变量应该满足的分布。先验分布是你瞎猜参数服从啥…

max std value 宏_Rust Macro/宏 新手指南

Rust语言最强大的一个特点就是可以创建和利用宏/Macro。不过创建 Rust宏看起来挺复杂&#xff0c;常常令刚接触Rust的开发者心生畏惧。这片文章 的目的就是帮助你理解Rust Macro的基本运作原理&#xff0c;学习如何创建自己的 Rust宏。相关链接&#xff1a;在线学编程 - 汇智网…

高斯分布及其极大似然估计

高斯分布及其极大似然估计 高斯分布 一维高斯分布 一维高斯分布的概率密度函数为&#xff1a; N(μ,σ2)12πσexp⁡(−(x−μ)22σ2)N(\mu,\sigma^2)\frac{1}{\sqrt{2\pi}\sigma}\exp(-\frac{(x-\mu)^2}{2\sigma^2}) N(μ,σ2)2π​σ1​exp(−2σ2(x−μ)2​) 多维高斯分布…

农林资金 大数据审计案例_大数据审计:现状与发展

大数据审计&#xff1a;现状与发展【摘要】传统手工环境下&#xff0c;审计人员常用的审计方法包括检查法、观察法、重新计算法、外部调查法、分析法、鉴定法等。随着信息技术的发展&#xff0c;被审计单位的运行越来越依赖于信息化环境。信息化环境下审计工作发生了巨大的变化…

商标45类分类表明细表_2019版注册商标分类表,商标注册45类范围明细

注册商标的时候都是要确定具体的产品或服务的&#xff0c;目前我国商标分类是用《类似商品和服务区分表–基于尼斯分类第十一版》2019年版这本分类书。这本分类表也是全球通用的分类表&#xff0c;商标分类总共有45个类别&#xff0c;1-34类是产品类、35-45类是服务类。这45个大…

高维高斯分布基础

高维高斯分布基础 多位高斯分布的几何理解 多维高斯分布表达式为&#xff1a; p(x∣μ,Σ)1(2π)p/2∣Σ∣1/2e−12(x−μ)TΣ−1(x−μ)p(x|\mu,\Sigma)\frac{1}{(2\pi)^{p/2}|\Sigma|^{1/2}}e^{-\frac{1}{2}(x-\mu)^{T}\Sigma^{-1}(x-\mu)} p(x∣μ,Σ)(2π)p/2∣Σ∣1/21​…

angularjs sill 创建项目_开源项目——博客项目MyBlogs.Core,基于.NET 5

个人博客站项目源码&#xff0c;高性能低占用的博客系统&#xff0c;这也许是我个人目前写过的性能最高的web项目了 。目前日均处理请求数80-120w次&#xff0c;同时在线活跃用户数30-100人&#xff0c;数据量累计已达到100多万条&#xff0c;数据库Redis网站主程序同时运行在一…

怀旧服推荐配置_【怀旧服】狂暴战P4毕业装备推荐

在怀旧服开启P4阶段之后&#xff0c;狂暴战玩家的输出也得到了进一步的提升。当然&#xff0c;狂暴战想要打出足够的伤害离不开对应的装备&#xff0c;现在就给大家介绍下狂暴战P4阶段的BIS装备。散件装备狂暴战在这一阶段依旧有非常不错的散件装备&#xff0c;个人建议玩家入手…

高斯混合模型GMM及EM迭代求解算法(含代码实现)

高斯混合模型GMM及EM迭代求解算法&#xff08;含代码实现&#xff09; 高斯分布与高斯混合模型 高斯分布 高斯分布大家都很熟悉了&#xff0c;下面是一元高斯分布的概率密度函数&#xff08;Probability Density Function&#xff0c;PDF&#xff09;&#xff1a; P(x)N(μ,…

十个模块_专栏 | ABAQUS Part模块的十个小技巧

作者介绍星辰_北极星2012年开始从事Abaqus仿真相关工作&#xff0c;服务大小课题逾百项; 主要仿真领域&#xff1a;石油工程、岩土工程和金属加工工艺&#xff1b; 重点研究方向&#xff1a;ABAQUS GUI二次开发、固体力学、断裂以及损伤等。Abaqus有部件(Part)和装配体(Assembl…

深度学习时代的视频理解综述

深度学习时代的视频理解综述 本文为b站bryanyzhu老师四期视频理解相关论文解读的汇总图文笔记。 我们先精读深度学习时代视频理解领域最为重要的两篇论文&#xff1a;双流网络和 I3D。它们分别是领域内两大类方法双流&#xff08;利用光流&#xff09;网络和 3D CNN 网络的代…

typec扩展坞hdmi没反应_typec扩展坞转hdmi/vga多功能网口usb转换器苹果华为电脑matebook6元优惠券券后价26.8元...

★typec扩展坞转hdmi/vga多功能网口usb转换器苹果华为电脑matebook&#xff0c;6元拼多多优惠券★券后价26.8元★★★typec扩展坞转hdmi/vga多功能网口usb转换器苹果华为电脑matebook&#xffe5;26.8元&#xffe5;32.8元已拼5097件点击抢购猜你喜欢[速发]喵喵机P1热敏打印机手…

NLP任务概览

NLP任务概览 本文为台湾大学李宏毅老师视频课程笔记。本课程介绍了 &#xff08;2020年&#xff09;NLP 领域常见的 17 种任务。本文只会从输入输出的角度概览多种 NLP 任务&#xff0c;并简介它们的常见做法&#xff0c;并不会细致地介绍每个任务模型的具体细节。 两种模式与…