k-means算法

[笔记] 使用numpy手写k-means算法

时光怂恿深爱的人放手 提交于 2020-03-30 02:49:08
代码包括数据生成、可视化。 注意:下面代码仅供参考,实际使用还需加上一些约束,如迭代次数需要有个最大值,等等。 import numpy as np from matplotlib import pyplot as plt # - generate random data def generate_data(n_point_per_cate, center_point_list): """ n_point_per_cate: point number per category center_point_list: center point list """ points_list = [] for point in center_point_list: points_list.append(np.random.randn(n_point_per_cate, 2) + np.array(point)) return np.concatenate(points_list, axis=0) # - generate random data data = generate_data(100, [[3,4], [10,-4], [-5,0]]) data.shape (300, 2) # - visulize data plt.scatter(data[:,0], data[:,1]) #

8.机器学习之聚类算法

倾然丶 夕夏残阳落幕 提交于 2020-03-14 01:43:39
分类 是在一群已经知道类别标号的样本中,训练一种分类器,让其能够对某种未知的样本进行分类,分类算法属于一种有监督的学习。分类算法的分类过程就是建立一种分类模型来描述预定的数据集或概念集,通过分析由属性描述的数据库元组来构造模型。分类的目的就是使用分类对新的数据集进行划分,其主要涉及分类规则的准确性、过拟合、矛盾划分的取舍等。 ———————————————— 聚类 是在一群未知类别标号的样本上,用某种算法将他们分成若干类别,这是一种无监督学习。给定一组数据点,我们可以用聚类算法将每个数据点分到特定的组中,理论上属于同一组的数据点应该有相似的属性和/或特征,而属于不同组的数据点应该有非常不同的属性和/或特征。所以在给定的数据集中,我们可以通过聚类算法将其分成一些不同的组。 聚类是一种将数据点按一定规则分群(分组)的机器学习技术。其主要研究数据间逻辑上或物理上的相互关系。聚类分析本身不是一个特定的算法,而是要解决的一般任务。它可以通过各种算法来实现,这些算法在理解群集的构成以及如何有效地找到它们方面存在显着差异。由聚类所组成的簇是一组数据对象的集合,这些对象与同一簇中的对象彼此类似,与其他簇中的对象相异。其分析结果不仅可以揭示数据间的内在联系与区别,还可以为进一步的数据分析与知识发现提供重要依据。 监督学习: 当我们根据一组给定的预测因子变量或自变量去预测一个目标变量时

算法笔记- K均值(K-Means)

非 Y 不嫁゛ 提交于 2020-02-28 15:33:14
前言 本系列为机器学习算法的总结和归纳,目的为了清晰阐述算法原理,同时附带上手代码实例,便于理解。 目录    k近邻(KNN)    决策树    线性回归    逻辑斯蒂回归    朴素贝叶斯    支持向量机(SVM)    组合算法(Ensemble Method)    K-Means    机器学习算法总结 本章主要介绍无监督学习中的k-means,以及简单代码实现。 一、算法简介 k-Means算法是一种聚类算法,它是一种无监督学习算法,目的是将相似的对象归到同一个蔟中。蔟内的对象越相似,聚类的效果就越好。聚类和分类最大的不同在于,分类的目标事先已知,而聚类则不一样。其产生的结果和分类相同,而只是类别没有预先定义。 1.1 算法原理 设计的目的: 使各个样本与所在簇的质心的均值的误差平方和达到最小 (这也是评价K-means算法最后聚类效果的评价标准)。 1.2 算法特点 · 优点:容易实现 · 缺点:可能收敛到局部最小值,在大规模数据上收敛较慢 适合数据类型:数值型数据 1.3 聚类过程 1)创建k个点作为k个簇的起始质心(经常随机选择)。 2)分别计算剩下的元素到k个簇中心的相异度(距离),将这些元素分别划归到相异度最低的簇。 3)根据聚类结果,重新计算k个簇各自的中心,计算方法是取簇中所有元素各自维度的算术平均值。 4)将D中全部元素按照新的中心重新聚类。 5

k-means算法

五迷三道 提交于 2020-01-24 02:07:35
k-means算法为常见的聚类算法。 算法的大致思路为: 首先指定要分多少类(k),然后指定k个类中心点的初始坐标。 线性扫描所有的点,计算其至各中心点的距离,选择最小距离使自己归于此类。然后更新各个类中心点的坐标。 迭代上述步骤直至达到收敛条件。 伪码如下: 但是,k初始以及中心点坐标初始值的随机选定可能会对结果造成影响。 k初始值我们可以采用 手肘法 : (图片取自知乎@是泽哥啊) 取每个点至其所在类中心点的总距离,然后取其 拐点 (3)。 还可以采用 蒙特卡洛模拟 ,自动取得k值。 解决随机选取中心点的坐标的问题可以采用**k-means++**算法。 但是,每次都要线性扫描所有的比较耗时。 为了提高效率,我们可以采用 kd树 。 kd树即在n维空间(坐标为n维时),以垂直于坐标轴的方法进行空间切分。且切分位置为其坐标的中位数,如下图所示: kd树为二叉树,初始时,二叉树的根节点为整个坐标空间,然后左右子树为被其切分的两个区域,重复,直到切分到区域中没有坐标点为止。 来源: CSDN 作者: JLUspring 链接: https://blog.csdn.net/qq_37724465/article/details/103834700

K-means聚类算法原理及c++实现

孤人 提交于 2020-01-18 03:56:56
聚类是指根据数据本身的特征对数据进行分类,不需要人工标注,是无监督学习的一种。k-means算法是聚类算法中最简单的算法之一。 k-means 算法将n个数据对象划分为 k个聚类以便使得所获得的聚类满足:同一聚类中的对象相似度较高;而不同聚类中的对象相似度较小。聚类相似度是利用各聚类中对象的均值所获得一个“中心对象”(引力中心)来进行计算的。 基于这样一个假设,我们再来导出k-means所要优化的目标函数:设我们一共有N个数据点需要分为K个cluster,而k-means要做的就是要最小化这个目标函数 为第k个类聚中心, 当第n个数据属于第k类时为1,否则为0。 过程如下: 1.首先从n个数据对象任意选择 k 个对象作为初始聚类中心;而对于所剩下其它对象,则根据它们与这些聚类中心的相似度(距离),分别将它们分配给与其最相似的(聚类中心所代表的)聚类; 2.然后再计算每个所获新聚类的聚类中心(该聚类中所有对象的 均值 );不断重复这一过程直到标准测度函数开始收敛为止。 一般都采用均方差作为标准测度函数,k个聚类具有以下特点:各聚类本身尽可能的紧凑,而各聚类之间尽可能的分开。 每一次更新聚类中心都会使目标函数减小,因此迭代最终J会达到一个极小值,不能保证是全局最小值。k-means对于噪声十分敏感。 c++实现: class ClusterMethod { private:

机器学习~K-Means

余生颓废 提交于 2020-01-13 05:13:05
文章目录 概述 原理 示例 Sklearn实现 聚类效果的评估 KMeans存在的几个问题 初始重心选择 K值选择 基于密度聚类(DBSCAN) mini batch kmeans 参考 概述 k-means算法是一种聚类算法,所谓聚类,是指在数据中发现数据对象之间的关系,将数据进行分组,组内的相似性越大,组间的差别越大,则聚类效果越好。 聚类算法与分类算法不同,聚类算法属于无监督学习,通俗来讲:分类就是向事物分配标签,聚类就是将相似的事物放在一起。 聚类算法通常用来寻找相似的事物,比如:银行寻找优质客户,信用卡诈骗,社交划分社区圈等等。 原理 首先K-means中的K类似与KNN中的参数K,是指将数据聚类成K个类别。 算法原理: 先从没有标签的元素集合A中随机取K个元素,作为K个子集各自的重心。 分别计算剩下的元素到K个子集重心的距离,根据距离将这些元素分别划归到最近的子集。(这里的距离可以使用欧式距离或其他的距离量度) 根据聚类结果,重新计算重心(即子集中所有元素各个维度的算数平均数) 将集合A中全部元素按照新的中心然后再重新聚类 重复第4步,直到聚类结果不再发生变化。 示例 看着算法的步骤有点懵逼,我们来看个简单的例子。 1.假设画布上有四个点,如下: 我们想将其聚类成两类,首先我们先随机选取两个点,比如A,B两点选取两个类别的重心点,然后分别计算所有元素到这两个重心的距离

聚类算法之K-Means,K-Means++,elkan K-Means和MiniBatch K-Means算法流程

核能气质少年 提交于 2020-01-04 00:14:28
聚类问题是机器学习中无监督学习的典型代表,在数据分析、模式识别的很多实际问题中得到了应用。我们知道,分类问题是机器学习中最常见的一类问题,它的目标是确定一个物体所属的类别。分类问题和聚类问题一个最重要的区别在于分类问题有标签,学习过程实际就是程序不断学习各个标签特点的过程,而聚类问题是一种无监督学习问题,我们事先并不知道这些事物一共多少个类,每个事物的所属类别,我们需要让程序基于一定的规则,自动地将事物分为我们需要的类。 我们在进行聚类分析的时候,需要确定 无监督学习算法需要决定的三个问题: 1.分成几类? 2.样本之间的距离度量方式? 3.聚类策略? 下面,我们来看一些常用的聚类算法: 一、K-Means K-Means聚类又叫K均值聚类,是一种迭代求解的聚类分析算法,其步骤是随机选取K个对象作为初始的聚类中心,然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给它们的对象就代表一个聚类。每分配一个样本,聚类的聚类中心会根据聚类中现有的对象被重新计算。这个过程将不断重复直到满足某个终止条件。终止条件可以是没有(或最小数目)对象被重新分配给不同的聚类,没有(或最小数目)聚类中心再发生变化,误差平方和局部最小。 K-Means算法过程: 1.输入数据 D = { x 1 , x 2 , x 3 , . . . , x m } D=

6. 聚类算法之K-Means

对着背影说爱祢 提交于 2020-01-01 16:10:19
有监督学习&无监督学习: 决策树,随机森林,PCA和逻辑回归,他们虽然有着不同的功能,但却都属于“有监督学习”的一部分,即是说,模型在训练的时候,即需要特征矩阵X,也需要真实标签y。 机器学习当中,还有相当一部分算法属于“无监督学习”,无监督的算法在训练的时候只需要特征矩阵X,不需要标签。而聚类算法,就是无监督学习的代表算法。 K-Means的定义: 作为聚类算法的典型代表,KMeans可以说是最简单的聚类算法没有之一,那它是怎么完成聚类的呢? 答: KMeans算法将一组N个样本的特征矩阵X划分为K个无交集的簇,直观上来看是簇是一组一组聚集在一起的数据,在一个簇中的数据就认为是同一类。簇就是聚类的结果表现。 簇中所有数据的均值通常被称为这个簇的“质心”(centroids)。 在一个二维平面中,一簇数据点的质心的横坐标就是这一簇数据点的横坐标的均值,质心的纵坐标就是这一簇数据点的纵坐标的均值。同理可推广至高维空间。 簇的个数K是一个超参数,需要我们人为输入来确定。KMeans的核心任务就是根据我们设定好的K,找出K个最优的质心,并将离这些质心最近的数据分别分配到这些质心代表的簇中去。 K-Means的过程: 1 随机抽取K个样本作为最初的质心 2 开始循环: 2.1 将每个样本点分配到离他们最近的质心,生成K个簇 2.2 对于每个簇,计算所有被分到该簇的样本点的平均值作为新的质心

K-MEANS算法

有些话、适合烂在心里 提交于 2020-01-01 09:50:26
一、聚类思想 所谓聚类算法是指将一堆没有标签的数据自动划分成几类的方法,属于无监督学习方法,这个方法要保证同一类的数据有相似的特征,如下图所示: 根据样本之间的距离或者说是相似性(亲疏性),把越相似、差异越小的样本聚成一类(簇),最后形成多个簇,使同一个簇内部的样本相似度高,不同簇之间差异性高。 二、k-means聚类分析算法 相关概念: K值:要得到的簇的个数 质心:每个簇的均值向量,即向量各维取平均即可 距离量度:常用欧几里得距离和余弦相似度(先标准化) 算法流程: 1、首先确定一个k值,即我们希望将数据集经过聚类得到k个集合。 2、从数据集中随机选择k个数据点作为质心。 3、对数据集中每一个点,计算其与每一个质心的距离(如欧式距离),离哪个质心近,就划分到那个质心所属的集合。 4、把所有数据归好集合后,一共有k个集合。然后重新计算每个集合的质心。 5、如果新计算出来的质心和原来的质心之间的距离小于某一个设置的阈值(表示重新计算的质心的位置变化不大,趋于稳定,或者说收敛),我们可以认为聚类已经达到期望的结果,算法终止。 6、如果新质心和原质心距离变化很大,需要迭代3~5步骤。 三、数学原理 K-Means采用的启发式方式很简单,用下面一组图就可以形象的描述: 上图a表达了初始的数据集,假设k=2。在图b中,我们随机选择了两个k类所对应的类别质心,即图中的红色质心和蓝色质心

ML08 -- 聚类算法K-means

老子叫甜甜 提交于 2019-12-29 20:34:47
聚类算法K-means K-means最简单的聚类算法属于无监督算法 聚类算法和分类算法的对比 - 聚类 分类 核心 将数据分成多个组,探索每个组的数据是否有联系 从已经分组的数据中去学习,把新数据放到已经分好的组中去 学习类型 无监督,无需标签进行训练 有监督,需要标签进行训练 典型算法 K-Means,DBSCAN,层次聚类 决策树,贝叶斯,逻辑回归 算法输出 聚类结果是不确定的, 不一定总是能够反映数据的真实分类, 同样的聚类,根据不同的业务需求,可能是一个好结果,也可能是一个坏结果 分类的结果是确定的, 分类的优劣是客观的, 不是根据业务或算法需求决定 关键概念:簇与质心 簇:KMeans算法将一组N个样本的特征矩阵X划分为K个无交集的簇,直观上来看簇是一组一组聚集在一起的数据,在一个簇中的数据就认为是同一类。簇是聚类结果的表现。 质心:簇中所有数据的均值uj通常被称为这个簇的质心,在一个二维平面中,一簇数据点的质心的横坐标就是这一簇数据点横坐标的均值,质心的纵坐标就是这一簇数据点的纵坐标的均值。同理可推广到高维空间。 在KMeans算法中,簇的个数K是一个超参数,需要我们人为输入来确定。KMeans的核心任务就是根据我们设定好的K,找出K个最优质心,并将离这些质心最近的数据分别分配到这些质心代表的的簇中去。具体步骤 1.随机抽取K个样本作为最初的质心 2.开始循环: 2