精华内容
下载资源
问答
  • 候选消除算法实现

    2013-04-11 22:10:49
    关于机器学习中的候选消除算法,严格按照算法说明执行,运行结果符合要求。
  • 采用C++编写,实现候选消除算法. 有详细说明。
  • Raft 算法详解(一)领导者选举

    千次阅读 2020-05-24 15:55:43
    Raft 算法属于 Multi-Paxos 算法,它是在兰伯特 Multi-Paxos 思想的基础上,做了一些简 化和限制,比如增加了日志必须是连续的,只支持领导者、跟随者和候选人三种状态,在理 解和算法实现上都相对容易许多。...

    Raft 算法属于 Multi-Paxos 算法,它是在兰伯特 Multi-Paxos 思想的基础上,做了一些简 化和限制,比如增加了日志必须是连续的,只支持领导者、跟随者和候选人三种状态,在理 解和算法实现上都相对容易许多。

    除此之外,Raft 算法是现在分布式系统开发首选的共识算法。绝大多数选用 Paxos 算法的 系统(比如 Cubby、Spanner)都是在 Raft 算法发布前开发的,当时没得选;而全新的系统大多选择了 Raft 算法(比如 Etcd、Consul、CockroachDB)。

    对你来说,掌握这个算法,可以得心应手地处理绝大部分场景的容错和一致性需求,比如分 布式配置系统、分布式 NoSQL 存储等等,轻松突破系统的单机限制。

    如果要用一句话概括 Raft 算法,我觉得是这样的:从本质上说,Raft 算法是通过一切以 领导者为准的方式,实现一系列值的共识和各节点日志的一致。 这句话比较抽象,我来做个 比喻,领导者就是 Raft 算法中的霸道总裁,通过霸道的“一切以我为准”的方式,决定了 日志中命令的值,也实现了各节点日志的一致。

    假设我们有一个由节点 A、B、C 组成的 Raft 集群(如图所示),因为 Raft 算法一切以领 导者为准,所以如果集群中出现了多个领导者,就会出现不知道谁来做主的问题。在这样一 个有多个节点的集群中,在节点故障、分区错误等异常情况下,Raft 算法如何保证在同一 个时间,集群中只有一个领导者呢?带着这个问题,我们正式进入今天的学习。
    在这里插入图片描述

    成员身份,又叫做服务器节点状态,Raft 算法支持领导者(Leader)跟随者 (Follower)候选人 (Candidate) 3 种状态。为了方便讲解,我们使用不同的图形表 示不同的状态。在任何时候,每一个服务器节点都处于这 3 个状态中的 1 个。
    在这里插入图片描述

    跟随者:就相当于普通群众,默默地接收和处理来自领导者的消息,当等待领导者心跳 信息超时的时候,就主动站出来,推荐自己当候选人。

    候选人:候选人将向其他节点发送请求投票(RequestVote)RPC 消息,通知其他节点 来投票,如果赢得了大多数选票,就晋升当领导者。

    领导者:蛮不讲理的霸道总裁,一切以我为准,平常的主要工作内容就是 3 部分,处理 写请求、管理日志复制和不断地发送心跳信息,通知其他节点“我是领导者,我还活 着,你们现在不要发起新的选举,找个新领导者来替代我。”

    Raft 算法是强领导者模型,集群中只能有一个“霸道总裁”。

    选举领导者的过程

    首先,在初始状态下,集群中所有的节点都是跟随者的状态。
    在这里插入图片描述

    Raft 算法实现了随机超时时间的特性。也就是说,每个节点等待领导者节点心跳信息的超 时时间间隔是随机的。通过上面的图片你可以看到,集群中没有领导者,而节点 A 的等待 超时时间小(150ms),它会先因为没有等到领导者的心跳信息,发生超时。

    这个时候,节点 A 就增加自己的任期编号,并推举自己为候选人,先给自己投上一张选 票,然后向其他节点发送请求投票 RPC 消息,请它们选举自己为领导者。
    在这里插入图片描述

    如果其他节点接收到候选人 A 的请求投票 RPC 消息,在编号为 1 的这届任期内,也还没有 进行过投票,那么它将把选票投给节点 A,并增加自己的任期编号。
    在这里插入图片描述

    如果候选人在选举超时时间内赢得了大多数的选票,那么它就会成为本届任期内新的领导者。
    在这里插入图片描述
    节点 A 当选领导者后,他将周期性地发送心跳消息,通知其他服务器我是领导者,阻止跟 随者发起新的选举,篡权。
    在这里插入图片描述

    讲到这儿,你是不是发现领导者选举很容易理解?与现实中的议会选举也蛮类似?当然,你 可能还是对一些细节产生一些疑问:

    • 节点间是如何通讯的呢?
    • 什么是任期呢?
    • 选举有哪些规则?
    • 随机超时时间又是什么?

    选举过程四连问
    老话说,细节是魔鬼。这些细节也是很多同学在学习 Raft 算法的时候比较难掌握的,所以 我认为有必要具体分析一下。咱们一步步来,先来看第一个问题。

    节点间如何通讯?

    在 Raft 算法中,服务器节点间的沟通联络采用的是远程过程调用(RPC),在领导者选举 中,需要用到这样两类的 RPC:

    • 请求投票(RequestVote)RPC,是由候选人在选举期间发起,通知各节点进行投票;
    • 日志复制(AppendEntries)RPC,是由领导者发起,用来复制日志和提供心跳消息。

    我想强调的是,日志复制 RPC 只能由领导者发起,这是实现强领导者模型的关键之一,希 望你能注意这一点,后续能更好地理解日志复制,理解日志的一致是怎么实现的。

    什么是任期?

    我们知道,议会选举中的领导者是有任期的,领导者任命到期后,要重新开会再次选举。 Raft 算法中的领导者也是有任期的,每个任期由单调递增的数字(任期编号)标识,比如 节点 A 的任期编号是 1。任期编号是随着选举的举行而变化的,这是在说下面几点:

    • 跟随者在等待领导者心跳信息超时后,推举自己为候选人时,会增加自己的任期号,比 如节点 A 的当前任期编号为 0,那么在推举自己为候选人时,会将自己的任期编号增加 为 1

    • 如果一个服务器节点,发现自己的任期编号比其他节点小,那么它会更新自己的编号到 较大的编号值。比如节点 B 的任期编号是 0,当收到来自节点 A 的请求投票 RPC 消息 时,因为消息中包含了节点 A 的任期编号,且编号为 1,那么节点 B 将把自己的任期编 号更新为 1。

    我想强调的是,与现实议会选举中的领导者的任期不同,Raft 算法中的任期不只是时间 段,而且任期编号的大小,会影响领导者选举和请求的处理。

    • 在 Raft 算法中约定,如果一个候选人或者领导者,发现自己的任期编号比其他节点小, 那么它会立即恢复成跟随者状态。比如分区错误恢复后,任期编号为 3 的领导者节点 B,收到来自新领导者的,包含任期编号为 4 的心跳消息,那么节点 B 将立即恢复成跟 随者状态。

    • 还约定如果一个节点接收到一个包含较小的任期编号值的请求,那么它会直接拒绝这个 请求。比如节点 C 的任期编号为 4,收到包含任期编号为 3 的请求投票 RPC 消息,那么它将拒绝这个消息。

    在这里,你可以看到,Raft 算法中的任期比议会选举中的任期要复杂。同样,在 Raft 算法 中,选举规则的内容也会比较多。

    选举有哪些规则

    在议会选举中,比成员的身份、领导者的任期还要重要的就是选举的规则,比如一人一票、 弹劾制度等。“无规矩不成方圆”,在 Raft 算法中,也约定了选举规则,主要有这样几 点。

    • 领导者周期性地向所有跟随者发送心跳消息(即不包含日志项的日志复制 RPC 消息), 通知大家我是领导者,阻止跟随者发起新的选举。

    • 如果在指定时间内,跟随者没有接收到来自领导者的消息,那么它就认为当前没有领导 者,推举自己为候选人,发起领导者选举。

    • 在一次选举中,赢得大多数选票的候选人,将晋升为领导者。

    • 在一个任期内,领导者一直都会是领导者,直到它自身出现问题(比如宕机),或者因 为网络延迟,其他节点发起一轮新的选举。

    • 在一次选举中,每一个服务器节点多会对一个任期编号投出一张选票,并且按照“先 来先服务”的原则进行投票。比如节点 C 的任期编号为 3,先收到了 1 个包含任期编号 为 4 的投票请求(来自节点 A),然后又收到了 1 个包含任期编号为 4 的投票请求(来 自节点 B)。那么节点 C 将会把唯一一张选票投给节点 A,当再收到节点 B 的投票请求 RPC 消息时,对于编号为 4 的任期,已没有选票可投了。
      在这里插入图片描述
      当任期编号相同时,日志完整性高的跟随者(也就是后一条日志项对应的任期编号值 更大,索引号更大),拒绝投票给日志完整性低的候选人。比如节点 B、C 的任期编号 都是 3,节点 B 的后一条日志项对应的任期编号为 3,而节点 C 为 2,那么当节点 C 请求节点 B 投票给自己时,节点 B 将拒绝投票。

    在这里插入图片描述

    我想强调的是,选举是跟随者发起的,推举自己为候选人;大多数选票是指集群成员半数以 上的选票;大多数选票规则的目标,是为了保证在一个给定的任期内多只有一个领导者。

    其实在选举中,除了选举规则外,我们还需要避免一些会导致选举失败的情况,比如同一任 期内,多个候选人同时发起选举,导致选票被瓜分,选举失败。那么在 Raft 算法中,如何 避免这个问题呢?答案就是随机超时时间。

    如何理解随机超时时间

    在议会选举中,常出现未达到指定票数,选举无效,需要重新选举的情况。在 Raft 算法的 选举中,也存在类似的问题,那它是如何处理选举无效的问题呢?

    其实,Raft 算法巧妙地使用随机选举超时时间的方法,把超时时间都分散开来,在大多数 情况下只有一个服务器节点先发起选举,而不是同时发起选举,这样就能减少因选票瓜分导 致选举失败的情况。

    我想强调的是,在 Raft 算法中,随机超时时间是有 2 种含义的,这里是很多同学容易理解 出错的地方,需要你注意一下:

    1. 跟随者等待领导者心跳信息超时的时间间隔,是随机的;
    2. 当没有候选人赢得过半票数,选举无效了,这时需要等待一个随机时间间隔,也就是 说,等待选举超时的时间间隔,是随机的。
    展开全文
  • 候选消除算法

    2013-12-02 16:48:00
    这个过程是特殊向一般的转变,这个过程非常地类似FIND-S算法 接着我们处理第三条样本: 让我们回到数据 我们会发现,Sky,AirTemp和Foreast和以前的数据不一致,我们可以怀疑是这三个数据导致最后结果的变化。 ...

    样本集:

     

    把S集合初始化为H中极大特殊假设:

    把G集合初始化为H中极大一般假设:

     

    首先加载第一条和第二条样本:

    这个过程是特殊向一般的转变,这个过程非常地类似FIND-S算法

    接着我们处理第三条样本:

    让我们回到数据

    我们会发现,Sky,AirTemp和Foreast和以前的数据不一致,我们可以怀疑是这三个数据导致最后结果的变化。

    所以,我们就针对这3个数据进行一次特殊化:

    接着,我们输入第四条样本:

     

     

     

    在处理第四条样本的时候,我们先对于S集合进行一般化:

     

     

    然后,为了让G集合覆盖S集合,我们需要剔除,过程为

     

    在处理完了这四个样本后,我们就可以获取所有的假设:

     

    当前为6个假设,当我们可以获取到更多的训练集的时候,我们可以划出更小的设计空间。

    当我使用这6个假设对测试集进行测试的时候,我们可以使用这6个假设同时对测试样本进行检测,每个假设都有自己的权重,如果最后的结果超过80%,那么就测试通过。

    本算法弊端:1.对噪点兼容性非常差 2.当我们Sky属性有10+个的时候,往往这个属性必然被一般化,所以我们需要对数据进行预处理

    参考书籍:机器学习

     

     

     

    转载于:https://www.cnblogs.com/otomii/p/3454280.html

    展开全文
  • 候选人淘汰 Java中候选消除算法的实现 ##输入格式第一行包含N和M。 其中N =要作为训练数据读取的数字记录,而M =属性的数目。 接下来的M行将包含属性名称及其可以使用的值。 接下来的N行给出M个属性的值。 最后一个...
  • 一文搞懂K-means聚类算法

    千次阅读 2019-12-01 16:09:30
    阅读目录目录聚类K-means(k均值)聚类算法案例描述从文件加载数据集计算两个向量的欧氏距离构建一个包含 K 个随机质心的集合K-Means 聚类算法分析数据:聚类可视化结果讨论与分析算法描述二分 K-Means 聚类算法伪...

    一步步教你轻松学K-means聚类算法

    一步步教你轻松学K-means聚类算法
    ( 白宁超    2018年9月13日09:10:33)

    导读:k-均值算法(英文:k-means clustering),属于比较常用的算法之一,文本首先介绍聚类的理论知识包括什么是聚类、聚类的应用、聚类思想、聚类优缺点等等;然后通过k-均值聚类案例实现及其可视化有一个直观的感受,针对算法模型进行分析和结果优化提出了二分k-means算法。最后我们调用机器学习库函数,很短的代码完成聚类算法。(本文原创,转载必须注明出处: 一步步教你轻松学K-means聚类算法

    目录

    机器学习:一步步教你轻松学KNN模型算法

    机器学习:一步步教你轻松学决策树算法

    机器学习:一步步教你轻松学朴素贝叶斯模型算法理论篇1 

    机器学习:一步步教你轻松学朴素贝叶斯模型实现篇2 

    机器学习:一步步教你轻松学朴素贝叶斯模型算法Sklearn深度篇3

    机器学习:一步步教你轻松学逻辑回归模型算法

    机器学习:一步步教你轻松学K-means聚类算法

    机器学习:一步步教你轻松学关联规则Apriori算法

    机器学习: 一步步教你轻松学支持向量机SVM算法之理论篇1

    10 机器学习: 一步步教你轻松学支持向量机SVM算法之案例篇2

    11 机器学习: 一步步教你轻松学主成分分析PCA降维算法

    12 机器学习: 一步步教你轻松学支持向量机SVM降维算法

    更多文章请点击这里>>

    理论介绍

    聚类

    什么是聚类

    统计数据分析的一门技术,在许多领域受到广泛应用,包括机器学习,数据挖掘,模式识别,图像分析以及生物信息。聚类是把相似的对象通过静态分类的方法分成不同的组别或者更多的子集(subset),这样让在同一个子集中的成员对象都有相似的一些属性,常见的包括在坐标系中更加短的空间距离等。

    聚类的应用

    在商务上,聚类能帮助市场分析人员从客户基本库中发现不同的客户群,并且用购买模式来刻画不同的客户群的特征。在生物学上,聚类能用于推导植物和动物的分类,对基因进行分类,获得对种群中固有结构的认识。聚类在地球观测数据库中相似地区的确定,汽车保险单持有者的分组,及根据房子的类型、价值和地理位置对一个城市中房屋的分组上也可以发挥作用。聚类也能用于对Web上的文档进行分类,以发现信息。诸如此类,聚类有着广泛的实际应用。

    K-means(k均值)聚类算法

    什么是k-means聚类算法

    k-平均算法(英文:k-means clustering)源于信号处理中的一种向量量化方法,现在则更多地作为一种聚类分析方法流行于数据挖掘领域。k-平均聚类的目的是:把 n个点划分到k个聚类中,使得每个点都属于离他最近的均值(此即聚类中心)对应的聚类,以之作为聚类的标准。k-平均聚类与k-近邻之间没有任何关系(后者是另一流行的机器学习技术)。

    K-Means 是发现给定数据集的 K 个簇的聚类算法, 之所以称之为 K-均值 是因为它可以发现 K 个不同的簇, 且每个簇的中心采用簇中所含值的均值计算而成.簇个数 K 是用户指定的, 每一个簇通过其质心(centroid), 即簇中所有点的中心来描述.
    聚类与分类算法的最大区别在于, 分类的目标类别已知, 而聚类的目标类别是未知的.

    发展历史

    虽然其思想能够追溯到1957年的Hugo Steinhaus,术语“k-均值”于1967年才被James MacQueen 首次使用。标准算法则是在1957年被Stuart Lloyd作为一种脉冲码调制的技术所提出,但直到1982年才被贝尔实验室公开出版。在1965年,E.W.Forgy发表了本质上相同的方法,所以这一算法有时被称为Lloyd-Forgy方法。更高效的版本则被Hartigan and Wong提出。

    算法描述

    已知观测集,其中每个观测都是一个 d-维实向量,k-平均聚类要把这 n个观测划分到k个集合中(k≤n),使得组内平方和最小。换句话说,它的目标是找到使得下式满足的聚类

    其中 中所有点的均值。

    k-means术语

    • 簇: 所有数据的点集合,簇中的对象是相似的。
    • 质心: 簇中所有点的中心(计算所有点的均值而来).
    • SSE: Sum of Sqared Error(误差平方和), 它被用来评估模型的好坏,SSE 值越小,表示越接近它们的质心. 聚类效果越 好。由于对误差取了平方,因此更加注重那些远离中心的点(一般为边界点或离群点)。详情见kmeans的评价标准。
      有关 簇 和 质心 术语更形象的介绍, 请参考下图:

    k-means应用场景

    kmeans,用于数据集内种类属性不明晰,希望能够通过数据挖掘出或自动归类出有相似特点的对象的场景。其商业界的应用场景一般为挖掘出具有相似特点的潜在客户群体以便公司能够重点研究、对症下药。

    例如,在2000年和2004年的美国总统大选中,候选人的得票数比较接近或者说非常接近。任一候选人得到的普选票数的最大百分比为50.7%而最小百分比为47.9% 如果1%的选民将手中的选票投向另外的候选人,那么选举结果就会截然不同。 实际上,如果妥善加以引导与吸引,少部分选民就会转换立场。尽管这类选举者占的比例较低,但当候选人的选票接近时,这些人的立场无疑会对选举结果产生非常大的影响。如何找出这类选民,以及如何在有限的预算下采取措施来吸引他们? 答案就是聚类(Clustering)。

    那么,具体如何实施呢?首先,收集用户的信息,可以同时收集用户满意或不满意的信息,这是因为任何对用户重要的内容都可能影响用户的投票结果。然后,将这些信息输入到某个聚类算法中。接着,对聚类结果中的每一个簇(最好选择最大簇 ), 精心构造能够吸引该簇选民的消息。最后, 开展竞选活动并观察上述做法是否有效。

    另一个例子就是产品部门的市场调研了。为了更好的了解自己的用户,产品部门可以采用聚类的方法得到不同特征的用户群体,然后针对不同的用户群体可以对症下药,为他们提供更加精准有效的服务。

    k-means算法思想

    先随机选取K个对象作为初始的聚类中心。然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给它们的对象就代表一个聚类。一旦全部对象都被分配了,每个聚类的聚类中心会根据聚类中现有的对象被重新计算。这个过程将不断重复直到满足某个终止条件。终止条件可以是以下任何一个:

    • 没有(或最小数目)对象被重新分配给不同的聚类。
    • 没有(或最小数目)聚类中心再发生变化。
    • 误差平方和局部最小。

    得到相互分离的球状聚类,在这些聚类中,均值点趋向收敛于聚类中心。 一般会希望得到的聚类大小大致相当,这样把每个观测都分配到离它最近的聚类中心(即均值点)就是比较正确的分配方案。

    k-means工作流程

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

    k-means开发流程

    收集数据:使用任意方法
    准备数据:需要数值型数据类计算距离, 也可以将标称型数据映射为二值型数据再用于距离计算
    分析数据:使用任意方法
    训练算法:不适用于无监督学习,即无监督学习不需要训练步骤
    测试算法:应用聚类算法、观察结果.可以使用量化的误差指标如误差平方和(后面会介绍)来评价算法的结果.
    使用算法:可以用于所希望的任何应用.通常情况下, 簇质心可以代表整个簇的数据来做出决策.
    

    k-means评价标准

    k-means算法因为手动选取k值和初始化随机质心的缘故,每一次的结果不会完全一样,而且由于手动选取k值,我们需要知道我们选取的k值是否合理,聚类效果好不好,那么如何来评价某一次的聚类效果呢?也许将它们画在图上直接观察是最好的办法,但现实是,我们的数据不会仅仅只有两个特征,一般来说都有十几个特征,而观察十几维的空间对我们来说是一个无法完成的任务。因此,我们需要一个公式来帮助我们判断聚类的性能,这个公式就是SSE (Sum of Squared Error, 误差平方和 ),它其实就是每一个点到其簇内质心的距离的平方值的总和,这个数值对应kmeans函数中clusterAssment矩阵的第一列之和。 SSE值越小表示数据点越接近于它们的质心,聚类效果也越好。 因为对误差取了平方,因此更加重视那些远离中心的点。一种肯定可以降低SSE值的方法是增加簇的个数,但这违背了聚类的目标。聚类的目标是在保持簇数目不变的情况下提高簇的质量。

    k-means优缺点

    • 优点:

      属于无监督学习,无须准备训练集
      原理简单,实现起来较为容易
      结果可解释性较好

    • 缺点:

      聚类数目k是一个输入参数。选择不恰当的k值可能会导致糟糕的聚类结果。这也是为什么要进行特征检查来决定数据集的聚类数目了。
      可能收敛到局部最小值, 在大规模数据集上收敛较慢
      对于异常点、离群点敏感

    • 使用数据类型 : 数值型数据


      k-means聚类算法实现

      案例描述

      我们假设这样的一个案例需求:某公司发布一批新型手机,根据客户热衷度进行投放。公司市场人员收集其中四个地区用户对手机的满意程度(由两个特征决定的)。分析哪个区域对手机产品比较热衷,对应的进行市场销售工作。这里就用到k-means聚类算法。

      从文件加载数据集

      上文中我们收集好四个地区用户对产品满意的特征数据值,转化为向量预先保存到文本中(关于词向量转化及其词袋模型问题,参考:决策树算法模型研究与案例分析一文)。我们加载文件并以数据矩阵形式返回数据集,代码实现如下:

      '''加载数据集'''
      def loadDataSet(fileName):
          dataSet = [] # 初始化一个空列表
          fr = open(fileName)
          for line in fr.readlines():
              # 切割每一行的数据
              curLine = line.strip().split('\t')
              # 将数据追加到dataMat,映射所有的元素为 float类型
              fltLine = list(map(float,curLine))    
              dataSet.append(fltLine)
          return mat(dataSet)
      

      我们打印看下结果:


      计算两个向量的欧氏距离

      上文在k均值算法思想和工作流程都提到过,我们一个重要的方法就是随机设置质心,然后比较每条数据(可以理解为单一客户的特征数据)与质心之间的距离。这里距离公式包括很多,本文采用的是欧式距离计算,其代码实现如下:

      '''欧氏距离计算函数'''
      def distEclud(vecA, vecB):
          return sqrt(sum(power(vecA - vecB, 2)))
      

      构建一个包含 K 个随机质心的集合

      接下来,我们构建随机质心(中心点),这里的K值是经过数据观察随机设置的值,假如k=3,代表我们将数据集分为3个簇,也就是说分为3个部分。我们随机质心在整个数据集的边界之内,这可以通过找到数据集每一维的最小和最大值来完成,然后生成0到1.0之间的随机数并通过取值范围和最小值,以便确保随机点在数据的边界之内

      '''
      随机质心
      '''
      def randCent(dataMat, k):

          # 获取样本数与特征值
          m, n = shape(dataMat)
          # 初始化质心,创建(k,n)个以零填充的矩阵
          centroids = mat(zeros((k, n)))
          # 循环遍历特征值
          for j in range(n):
              # 计算每一列的最小值
              minJ = min(dataMat[:, j])
              # 计算每一列的范围值
              rangeJ = float(max(dataMat[:, j]) - minJ)
              # 计算每一列的质心,并将值赋给centroids
              centroids[:, j] = mat(minJ + rangeJ * random.rand(k, 1))
          # 返回质心
          return centroids 
      

      我们测试下k=3的随机质心结果:


      K-Means 聚类算法

      我们基于以上算法构建k均值算法,该算法会创建k个质心,然后将每个点分配到最近的质心,再重新计算质心。这个过程重复数次,直到数据点的簇分配结果不再改变位置。返回类质心与点分配结果(多次运行结果可能会不一样,可以试试,原因为随机质心的影响,但总的结果是对的,因为数据足够相似,也可能会陷入局部最小值),代码实现如下:

      '''
      创建K个质心,然后将每个点分配到最近的质心,再重新计算质心。
      这个过程重复数次,直到数据点的簇分配结果不再改变为止
      '''
      def kMeans(dataMat, k, distMeas=distEclud, createCent=randCent):
          # 获取样本数和特征数
          m, n = shape(dataMat)
          # 初始化一个矩阵来存储每个点的簇分配结果
          # clusterAssment包含两个列:一列记录簇索引值,第二列存储误差(误差是指当前点到簇质心的距离,后面会使用该误差来评价聚类的效果)
          clusterAssment = mat(zeros((m, 2)))
          # 创建质心,随机K个质心
          centroids = createCent(dataMat, k)
          # 初始化标志变量,用于判断迭代是否继续,如果True,则继续迭代
          clusterChanged = True
          while clusterChanged:
              clusterChanged = False
              # 遍历所有数据找到距离每个点最近的质心,
              # 可以通过对每个点遍历所有质心并计算点到每个质心的距离来完成
              for i in range(m):
                  minDist = inf # 正无穷
                  minIndex = -1
                  for j in range(k):
                      # 计算数据点到质心的距离
                      # 计算距离是使用distMeas参数给出的距离公式,默认距离函数是distEclud
                      distJI = distMeas(centroids[j, :], dataMat[i, :])
                      # 如果距离比minDist(最小距离)还小,更新minDist(最小距离)和最小质心的index(索引)
                      if distJI < minDist:
                          minDist = distJI
                          minIndex = j
                  # 如果任一点的簇分配结果发生改变,则更新clusterChanged标志
                  if clusterAssment[i, 0] != minIndex:
                      # print(clusterAssment[i, 0],minIndex)
                      clusterChanged = True
                  # 更新簇分配结果为最小质心的index(索引),minDist(最小距离)的平方
                  clusterAssment[i, :] = minIndex, minDist ** 2
              # print(centroids)
              # 遍历所有质心并更新它们的取值
              for cent in range(k):
                  # 通过数据过滤来获得给定簇的所有点
                  ptsInClust = dataMat[nonzero(clusterAssment[:, 0].A == cent)[0]]
                  # 计算所有点的均值,axis=0表示沿矩阵的列方向进行均值计算
                  centroids[cent, :] = mean(ptsInClust, axis=0)# axis=0列方向
          # 返回所有的类质心与点分配结果
          return centroids, clusterAssment
      

      测试查看下运行结果:


      分析数据:聚类可视化

      通过上文返回的数据结果,似乎我们还不能直观感受,接下来我们采用可视化分析方法直观感受下,代码实现如下:

      '''
      可视化展示
      '''
      def kmeanShow(dataMat,centers,clusterAssment):
          plt.scatter(np.array(dataMat)[:, 0], np.array(dataMat)[:, 1], c=np.array(clusterAssment)[:, 0].T)
          plt.scatter(centers[:, 0].tolist(), centers[:, 1].tolist(), c="r")
          plt.show()
      

      测试查看可视化结果:


      结果讨论与分析

      局部最小值(局部最优的结果,但不是全局最优的结果)

      上文可视化结果显示,其中两个簇聚集在一起,也就说说没有达到我们预期的效果。出现这个问题有很多原因,可能是k值取的不合适,可能是距离函数不合适,可能是最初随机选取的质心靠的太近,也可能是数据本身分布的问题。

      为了解决这个问题,我们可以对生成的簇进行后处理,一种方法是将具有最大SSE值的簇划分成两个簇。具体实现时可以将最大簇包含的点过滤出来并在这些点上运行K-均值算法,令k设为2。

      为了保持簇总数不变,可以将某两个簇进行合并。从上图中很明显就可以看出,应该将上图下部两个出错的簇质心进行合并。那么问题来了,我们可以很容易对二维数据上的聚类进行可视化, 但是如果遇到40维的数据应该如何去做?

      有两种可以量化的办法:合并最近的质心,或者合并两个使得SSE增幅最小的质心。 第一种思路通过计算所有质心之间的距离, 然后合并距离最近的两个点来实现。第二种方法需要合并两个簇然后计算总SSE值。必须在所有可能的两个簇上重复上述处理过程,直到找到合并最佳的两个簇为止。

      因为上述后处理过程实在是有些繁琐,所以有更厉害的大佬提出了另一个称之为二分K-均值(bisecting K-Means)的算法.

      二分 K-Means 聚类算法

      算法描述

      该算法首先将所有点作为一个簇,然后将该簇一分为二。之后选择其中一个簇继续进行划分,选择哪一个簇进行划分取决于对其划分时候可以最大程度降低 SSE(平方和误差)的值。上述基于 SSE 的划分过程不断重复,直到得到用户指定的簇数目为止。

      二分 K-Means 聚类算法伪代码

      将所有点看成一个簇
      当簇数目小于 k 时
      对于每一个簇
          计算总误差
          在给定的簇上面进行 KMeans 聚类(k=2)
          计算将该簇一分为二之后的总误差
      选择使得误差最小的那个簇进行划分操作
      

      另一种做法是选择 SSE 最大的簇进行划分,直到簇数目达到用户指定的数目位置。

      二分 K-Means 聚类算法代码

      根据算法思想,我们基于k均值算法做了少许的改动,代码实现如下:

      '''在给定数据集,所期望的簇数目和距离计算方法的条件下,函数返回聚类结果'''
      def biKmeans(dataMat, k, distMeas=distEclud):
          m, n = shape(dataMat)
          # 创建一个矩阵来存储数据集中每个点的簇分配结果及平方误差
          clusterAssment = mat(zeros((m, 2)))
          # 计算整个数据集的质心,并使用一个列表来保留所有的质心
          centroid0 = mean(dataMat, axis=0).tolist()[0]
          centList = [centroid0] # [-0.15772275000000002, 1.2253301166666664]
          # 遍历数据集中所有点来计算每个点到质心的误差值
          for j in range(m):
              clusterAssment[j, 1] = distMeas(mat(centroid0), dataMat[j, :]) ** 2
          # 对簇不停的进行划分,直到得到想要的簇数目为止
          while (len(centList) < k):
              # 初始化最小SSE为无穷大,用于比较划分前后的SSE
              lowestSSE = inf
              # 通过考察簇列表中的值来获得当前簇的数目,遍历所有的簇来决定最佳的簇进行划分
              for i in range(len(centList)):
                  # 对每一个簇,将该簇中的所有点堪称一个小的数据集
                  ptsInCurrCluster = dataMat[nonzero(clusterAssment[:, 0].A == i)[0], :]
                  # 将ptsInCurrCluster输入到函数kMeans中进行处理,k=2,
                  # kMeans会生成两个质心(簇),同时给出每个簇的误差值
                  centroidMat, splitClustAss = kMeans(ptsInCurrCluster, 2, distMeas)
                  # 将误差值与剩余数据集的误差之和作为本次划分的误差
                  sseSplit = sum(splitClustAss[:, 1])
                  sseNotSplit = sum(clusterAssment[nonzero(clusterAssment[:, 0].A != i)[0], 1])
                  print('sseSplit, and notSplit: ', sseSplit, sseNotSplit)
                  # 如果本次划分的SSE值最小,则本次划分被保存
                  if (sseSplit + sseNotSplit) < lowestSSE:
                      bestCentToSplit = i
                      bestNewCents = centroidMat
                      bestClustAss = splitClustAss.copy()
                      lowestSSE = sseSplit + sseNotSplit
              # 找出最好的簇分配结果
              # 调用kmeans函数并且指定簇数为2时,会得到两个编号分别为0和1的结果簇
              bestClustAss[nonzero(bestClustAss[:, 0].A == 1)[0], 0] = len(centList)
              # 更新为最佳质心
              bestClustAss[nonzero(bestClustAss[:, 0].A == 0)[0], 0] = bestCentToSplit
              print('the bestCentToSplit is: ', bestCentToSplit)
              print('the len of bestClustAss is: ', len(bestClustAss))
              # 更新质心列表
              # 更新原质心list中的第i个质心为使用二分kMeans后bestNewCents的第一个质心
              centList[bestCentToSplit] = bestNewCents[0, :].tolist()[0]
              # 添加bestNewCents的第二个质心
              centList.append(bestNewCents[1, :].tolist()[0])
              # 重新分配最好簇下的数据(质心)以及SSE
              clusterAssment[nonzero(clusterAssment[:, 0].A == bestCentToSplit)[0], :] = bestClustAss
          return mat(centList), clusterAssment
      

      测试二分 KMeans 聚类算法

      经过改进后,我们运行biKmeans函数得到可视化结果如下:


      总结:如此我们得到预想的结果,解决了局部最优的问题,聚类会收敛到全局最小值。而原始的 kMeans() 函数偶尔会陷入局部最小值。

      调用机器学习库sklearn实现k-means 聚类

      加载数据集

      # 加载数据集
      dataMat = []
      fr = open("./testSet2.txt") # 注意,这个是相对路径
      for line in fr.readlines():
          curLine = line.strip().split('\t')
          fltLine = list(map(float,curLine))    # 映射所有的元素为 float(浮点数)类型
          dataMat.append(fltLine)
      

      训练k-means算法模型

      km = KMeans(n_clusters=3) # 初始化
      km.fit(dataMat) # 拟合
      km_pred = km.predict(dataMat) # 预测
      centers = km.cluster_centers_ # 质心
      

      可视化结果

      plt.scatter(np.array(dataMat)[:, 1], np.array(dataMat)[:, 0], c=km_pred)
      plt.scatter(centers[:, 1], centers[:, 0], c="r")
      plt.show()
      

      聚类结果


      参考文献

      1. scikit中文社区:http://sklearn.apachecn.org/cn/0.19.0/
      2. 中文维基百科:https://zh.wikipedia.org/wiki/K-%E5%B9%B3%E5%9D%87%E7%AE%97%E6%B3%95
      3. GitHub:https://github.com/BaiNingchao/MachineLearning-1
      4. 图书:《机器学习实战》
      5. 图书:《自然语言处理理论与实战》

      完整代码下载

      源码请进【机器学习和自然语言QQ群:436303759】文件下载:


      作者声明

      本文版权归作者所有,旨在技术交流使用。未经作者同意禁止转载,转载后需在文章页面明显位置给出原文连接,否则相关责任自行承担。

       

       

       

       

       

       

       

       

      作者:白宁超,工学硕士,现工作于四川省计算机研究院,研究方向是自然语言处理和机器学习。曾参与国家自然基金项目和四川省科技支撑计划等多个省级项目。著有《自然语言处理理论与实战》一书。 自然语言处理与机器学习技术交流群号:436303759 。 出处:http://www.cnblogs.com/baiboy/

      本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

    展开全文
  • 128比特分组加密算法E2是日本密码学家M.Kanda等向NIST提交的一种AES候选算法,详细介绍E2的基本特征、算法描述以及安全特性。研究结果表明,E2不仅具有十分优异的抗差分攻击和抗线性攻击的性能*而且实现也十分方便...
  • 问题陈述:根据所需技能和候选人技能为项目找到合适的候选人 解决问题的方法: 我解决给定问题的方法包括以下步骤: 取得资料 数据提取 数据清理 数据处理 匹配因子的计算 根据匹配因子找到合适的候选人 算法: ...
  • 【优化算法】简述灰狼优化算法(GWO)原理

    万次阅读 多人点赞 2019-03-25 21:10:34
    灰狼优化算法(Grey Wolf Optimizer,GWO)由澳大利亚格里菲斯大学学者 Mirjalili 等于2014年提出来的一种群智能优化算法。该算法受到了灰狼捕食猎物活动的启发而开发的一种优化搜索方法,它具有较强的收敛性能、...

    前言:

    灰狼优化算法(Grey Wolf Optimizer,GWO)由澳大利亚格里菲斯大学学者 Mirjalili 等人于2014年提出来的一种群智能优化算法。该算法受到了灰狼捕食猎物活动的启发而开发的一种优化搜索方法,它具有较强的收敛性能、参数少、易实现等特点。近年来受到了学者的广泛关注,它己被成功地应用到了车间调度、参数优化、图像分类等领域中。


    算法原理:

    灰狼隶属于群居生活的犬科动物,且处于食物链的顶层。灰狼严格遵守着一个社会支配等级关系。如图:

    社会等级第一层:狼群中的头狼记为 \alpha\alpha 狼主要负责对捕食、栖息、作息时间等活动作出决策。由于其它的狼需要服从\alpha 狼的命令,所以 \alpha 狼也被称为支配狼。另外, \alpha 狼不一定是狼群中最强的狼,但就管理能力方面来说, \alpha 狼一定是最好的。

    社会等级第二层\beta 狼,它服从于 \alpha 狼,并协助 \alpha 狼作出决策。在 \alpha 狼去世或衰老后,\beta 狼将成为 \alpha 狼的最候选者。虽然 \beta 狼服从 \alpha 狼,但 \beta 狼可支配其它社会层级上的狼。

    社会等级第三层\delta 狼,它服从 \alpha 、\beta 狼,同时支配剩余层级的狼。\delta 狼一般由幼狼、哨兵狼、狩猎狼、老年狼及护理狼组成。

    社会等级第四层\omega 狼,它通常需要服从其它社会层次上的狼。虽然看上去 \omega 狼在狼群中的作用不大,但是如果没有 \omega 狼的存在,狼群会出现内部问题如自相残杀。

    GWO 优化过程包含了灰狼的社会等级分层跟踪包围攻击猎物等步骤,其步骤具体情况如下所示。

    1)社会等级分层(Social Hierarchy)当设计 GWO 时,首先需构建灰狼社会等级层次模型。计算种群每个个体的适应度,将狼群中适应度最好的三匹灰狼依次标记为 \alpha\beta 、\delta ,而剩下的灰狼标记为 \omega。也就是说,灰狼群体中的社会等级从高往低排列依次为; \alpha\beta 、\delta  及 \omega。GWO 的优化过程主要由每代种群中的最好三个解(即  \alpha\beta 、\delta )来指导完成。

    2)包围猎物( Encircling Prey )灰狼捜索猎物时会逐渐地接近猎物并包围它,该行为的数学模型如下:

    式中:t 为当前迭代次数:。表示 hadamard 乘积操作;A 和 C 是协同系数向量;Xp 表示猎物的位置向量; X(t) 表示当前灰狼的位置向量;在整个迭代过程中 a 由2 线性降到 0; r1 和 r2 是 [0,1] 中的随机向量。

    3)狩猎( Hunring)

    灰狼具有识别潜在猎物(最优解)位置的能力,搜索过程主要靠 \alpha\beta 、\delta 灰狼的指引来完成。但是很多问题的解空间特征是未知的,灰狼是无法确定猎物(最优解)的精确位置。为了模拟灰狼(候选解)的搜索行为,假设 \alpha\beta 、\delta 具有较强识别潜在猎物位置的能力。因此,在每次迭代过程中,保留当前种群中的最好三只灰狼( \alpha\beta 、\delta ),然后根据它们的位置信息来更新其它搜索代理(包括 \omega)的位置。该行为的数学模型可表示如下:

    式中:X_{_{\alpha }}X_{_{\beta }}X_{_{\delta }} 分别表示当前种群中 \alpha\beta 、\delta 的位置向量;X表示灰狼的位置向量;D_{_{\alpha }}D_{_{\beta }}D_{_{\delta }}  分别表示当前候选灰狼与最优三条狼之间的距离;当|A|>1时,灰狼之间尽量分散在各区域并搜寻猎物。当|A|<1时,灰狼将集中捜索某个或某些区域的猎物。

    从图中可看出,候选解的位置最终落在被 \alpha\beta 、\delta 定义的随机圆位置内。总的来说, \alpha\beta 、\delta 需首先预测出猎物(潜
    在最优解)的大致位置,然后其它候选狼在当前最优兰只狼的指引下在猎物附近随机地更新它们的位置。

    4)攻击猎物(Attacking Prey)构建攻击猎物模型的过程中,根据2)中的公式,a值的减少会引起 A 的值也随之波动。换句话说,A 是一个在区间[-a,a](备注:原作者的第一篇论文里这里是[-2a,2a],后面论文里纠正为[-a,a])上的随机向量,其中a在迭代过程中呈线性下降。当 A 在[-1,1]区间上时,则捜索代理(Search Agent)的下一时刻位置可以在当前灰狼与猎物之间的任何位置上。

    5)寻找猎物(Search for Prey)灰狼主要依赖 \alpha\beta 、\delta 的信息来寻找猎物。它们开始分散地去搜索猎物位置信息,然后集中起来攻击猎物。对于分散模型的建立,通过|A|>1使其捜索代理远离猎物,这种搜索方式使 GWO 能进行全局搜索。GWO 算法中的另一个搜索系数是C。从2)中的公式可知,C向量是在区间范围[0,2]上的随机值构成的向量,此系数为猎物提供了随机权重,以便増加(|C|>1)或减少(|C|<1)。这有助于 GWO 在优化过程中展示出随机搜索行为,以避免算法陷入局部最优。值得注意的是,C并不是线性下降的,C在迭代过程中是随机值,该系数有利于算法跳出局部,特别是算法在迭代的后期显得尤为重要。


    参考文献:

    加工时间可控的多目标车间调度问题研究

    Grey Wolf Optimizer
     

     

    展开全文
  • 图像识别算法

    万次阅读 多人点赞 2019-08-15 17:36:40
    2006年,Bay和Ess等基于SIFT算法的思路,提出了加速鲁棒特征(SURF),该算法主要针对于SIFT算法速度太慢,计算量大的缺点,使用了近似Harr小波方法来提取特征点,这种方法就是基于Hessian行列式(DoH)的斑点特征...
  • 序 列 报告熊 赟 基本概念 类Apriori生成候选算法 FreeSpan算法,PrefixSpan算法 相似性搜索 其他内容概要6.1 基本概念6.2 原 理6.3 核心算法6.4 其 他第6章 序 列 序列是不同项集的有序排列 定义1(序列)I=i1i2im是...
  • 文章目录第十章 蝙蝠算法10.1 介绍10.2 蝙蝠的自然行为概述10.3 蝙蝠算法的数学表达10.4 蝙蝠算法变种10.4.1 混沌蝙蝠算法10.4.2 二进制蝙蝠算法10.4.3 并行蝙蝠算法10.4.4 定向蝙蝠算法10.4.5 自适应蝙蝠算法参考...
  • SIFT算法原理

    万次阅读 多人点赞 2019-03-16 21:33:58
    SIFT算法 SIFT即尺度不变特征变换,是用于图像处理领域的一种描述。这种描述具有尺度不变性,可在图像中检测出关键点,是一种局部特征描述子。 一、SIFT算法特点: 1、具有较好的稳定性和不变性,能够适应旋转、尺度...
  • 如果X→U在R上成立,但对X的任一真子集都有→U不成立(即→U不在中,或者XU),那么称X是R上的一个候选键。 快速求解候选键的一个充分条件 对于给定的关系模式R(, ,…, )和函数依赖集F,可将其属性分为以下四类。 ...
  • 国际权威的学术组织theIEEE International Conference on Data Mining (ICDM) 2006年12月评选出了数据挖掘领域的十大经典算法。不仅仅是选中的十大算法,其实...一、数据挖掘18种候选算法   Classification(分类) ==
  • 候选人得票的统计程序

    千次阅读 2020-05-14 18:55:09
    设有3个候选人,每次输入一个得票的候选人名字,输出候选人名字及其得票数 #include <string.h> #include <stdio.h> int main() { int i,j; char leader_name[10]; struct person { char name[20];...
  • 点击上方 "大数据肌肉猿"关注,星标一起成长后台回复【加群】,进入高质量学习交流群2021年大数据肌肉猿公众号奖励制度最近帮公司面了一些候选人,岗位是高级大数据开发,经验...
  • 中国造纸学会2019年两院院士推荐候选人公示.pdf
  • 粒子群算法改进思路

    万次阅读 2019-03-19 09:13:58
    粒子群算法的发展过程。粒子群优化算法(Partical Swarm Optimization PSO),粒子群中的每一个粒子都代表一个问题的可能解,通过粒子个体的简单行为,群体内的信息交互实现问题求解的智能性.由于PSO操作简单、收敛...
  • 人体姿态骨架估计算法研究

    千次阅读 2019-07-26 10:21:02
    基本上,它是一组坐标,用于描述一个的姿势。骨架中的每个坐标称为此图的零件(或关节,关键点)。我们将两个组件之间的有效连接称为一对(对或肢)。但是,应该注意,并非所有组件组合都产生有效对。下图是人体...
  • 针对现有电子投票中存在的各种问题,基于数字签名算法和全同态加密提出了一种多候选人电子投票方案.该方案采用椭圆曲线数字签名算法解决电子投票中的身份认证问题;利用全同态加密技术实现对选票加密以及对加密选票...
  • Faster RCNN行人检测算法采用区域建议网络(RPN)生成候选区域,RPN 与Fast RCNN共享卷积层,以提高网络训练和检测速度;在图像特征提取过程中采用动态自适应池化方法对不同池化域进行自适应池化操作,提高了检测...
  • 通过Adaboost算法和Haar特征来构建人脸分类器,对多人脸图片进行检测,流程是用分类效果较弱的Haar特征构造弱分类器,再通过Adaboost算法对大量人脸样本和非人脸样本进行训练,将大量弱分类器中训练得到若干强分类器...
  • 压缩感知

    千次阅读 2018-10-07 21:26:43
    本文综述了压缩感知的理论框架及关键的技术问题,并着重介绍了压缩感知稀疏重构中的主流贪婪算法,通过算法实验分析了各种算法的重构性能。 压缩感知理论主要包括信号的稀疏表示,编码测量和信号...
  • 图像分割综述

    万次阅读 多人点赞 2019-07-09 22:03:48
    参数主动轮廓模型将曲线或曲面的形变以参数化形式表达,Kass等提出了经典的参数活动轮廓模型即“Snake”模型,其中Snake定义为能量极小化的样条曲线,它在来自曲线自身的内力和来自图像数据的外力的共同作用下移动...
  • 学会推荐省科协第九次代表大会代表及委员候选人获通过.pdf
  • 关于推荐第六届中国电源学会科学技术奖项目及候选人的通知.pdf
  • 关于2020年《乐器》杂志新一届编审委员推荐候选人的公示.pdf
  • 关于推荐第七届中国电源学会科学技术奖项目及候选人的通知.pdf
  • 机器学习(10): Apriori算法 小结及实验

    千次阅读 多人点赞 2019-07-29 16:14:25
    文章目录1 Apriori算法简介2 关联分析简介2.1 关联分析2.2 频繁项集的度量标准2.2.1 支持度2.2.2 置信度2.3 关联规则3 Apriori算法原理3.1 先验原理3.2 Apriori 算法流程4 实验4.1 使用Apriori算法来发现频繁项集...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 47,187
精华内容 18,874
关键字:

候选人算法