算法策略间的比较
浅谈算法间的策略比较
算法策略的中心思想是:将解决问题的过程归纳为可以用基本工具“循环机制和递归机制”表示的规范操作。
当我们面临实际的各种问题时,应该首先分析它属于常见问题中的哪一种。
对于查找问题,它在实际运用中主要用于搜索,而且要求时间效率很高。
1算法设计
1.1穷举法,采用2~n-1之间的数试除法。
这是最自然的想法,如果n除以在这个范围内的任一数,而余数为0,则这个数就是n的因子。
求余数采用取模的方法。
1.2采用2~sqrt(n)之间的数试除。
因为n的最大因子≤n/2,如果求出n在2~n/2范围内的因子i,那么n 的另外一个因子就是n/i。
但是在这个范围内有重复操作。
所以还可缩小范围在2~sqrt(n),这样就避免了重复输出。
1.3采用迭代法解数学模型。
一个合数的所有因子都可以由素数相乘得到。
所以只要求出n的所有素数因子就可以相应求出它的所有因子。
由此该问题将被分解为整数因子划分和素数测试两个子问题。
数学模型设计:n=P1(Q1)*P2(Q2)………Pn(Qn)
其中,P1<P2<……<Pn是素数,P1(Q1)表示P1的Q1次方,Q1,
Q2……Qn是正整数。
数据结构设计:新增两个一维数组A[N]与B[N],其中A[i]存放素数Pi,B[N]存放该素数的指数Qi因为小于10的4次方的素数有1229,小于10的8次方的素数有5761455个,小于10的12次方的素数有37607912018个。
如果n值很大,则相应地N值就会很大,用A[0],B[0]存放实际元素个数。
算法优化:对算法3中的整数划分算法其实就是一个求质数的问题。
质数除了2
之外,其余的都是奇数,所以可以把2单独考虑,在3~sqrt(n)范围内每次都自增2,而不是自增1,这样又大大缩小了时间复杂度,得到O(log2(n)/2)。
1.4 采用递归法求解数学模型
因为算法3的整数因子划分算法其实是个递推过程,现在把它转换成递归过程。
其中数组A[N],B[N],变量L都设置为外部变量,且都初始化为0。
2算法分析
算法1分析:问题域从2~n-1,基本语句为if(n%i==0),该语句执行次数为n-2次,时间复杂度为O(n)。
算法2分析:其基本语句与算法1相同,语句执行次数为sqrt(n)-1,时间复杂度为O(log2(n))。
对于一个正整数n,其位数为m=[log10(n+1)],则算法时间复杂性是O(10m/2)。
假设m=40,每次循环只需要1ns,它也需要花费1000年的时间完成。
算法3分析:在整数因子划分算法中采用了迭代法,对每找到一个质数因子i,n的值就变成n/i。
其基本语句是n=n/i,时间复杂度为O(log2(n))如果n=24,n的值变化情况如下:24->12->6->3->1。
也就是说for循环语句只执行了2次,基本语句n=n/i执行了4次。
有两次调用了素数判断算法,该算法只分别执行了1次。
所以总共执行了5次,这与算法2:sqrt(n)-1=sqrt(24)-1=3次相比时间复杂度增加,而且还开辟了两个数组,浪费了空间。
因此对于n域较小时,直接使用穷举法最合适。
若是n域很大,其位数超过16位,显然采用迭代法求解可以将n划分成更小的值,其时间复杂度将大大减小。
算法4分析:算法4的时间复杂度与算法3相当,但是又需要增加栈来操作,所以对该问题递归算法没有递推算法好。
这也正好验证了对于大多数实际问题能够采用递推法的时候尽量不要使用递归法。
因为分治法与动态规划法都是递归算法思想的应用与扩展,那么采用这两种策略是否能够提高效率。
分治法有一个很重要的特征,就是该问题所分解出的各个子问题是相互独立的,且子问题之间不包含公共的子问题。
对于整数因子分解,它显然不满足该特征。
首先,它包含公共的子问题:判断素数,其次各子问题之间也不是独立的,都与n,i有关。
动态规划=贪婪策略+递推+存储递推结果。
贪婪策略采用的是局部处理法
来求解最优解,因此它具有无向性。
即后面的过程不会影响前面的状态,只与当前状态有关,从而达到由局部最优解构造出全局最优解。
但是整数因子分解并不是个求最优解的过程,所以不适合采用贪婪策略解该问题。
虽然这两种策略不适合该问题,但是它们在实际运用中很广泛。
如果采用蛮力法的选择排序与起泡排序,其时间复杂度是O(n(2)),但是采用归并排序与快速排序其时间复杂度可以缩小为O(nlog2(n)),减小了一个数量级。
n值越大,分治策略的优越性就越明显。
3算法策略比较
由以上分析可知,解决该问题最好的策略是迭代法。
对于问题域较小又容易解决的问题采用蛮力法。
对于需要进行数值计算的问题采用迭代法。
对于较复杂难以直接解决,必须进行分解才能解决的的大问题,采用分治法和动态规划法。
特别是当这个问题涉及到最优化问题时采用动态规划法。
如果这个问题在每一阶段的选择都是当前状态下的最优选择,并且最终能够求得问题的整体最优解,则采用贪心法。
在计算机领域中,最常见的问题有:查找问题、排序问题、图问题、组合问题、几何问题。
蛮力法解决这些问题,一般情况下时间复杂度分别为O(n)、O (n*n)、O(n!)、O(2(n))、O(n*n)。
它的解题思路简单明了,实现容易,附加空间小,而且经过思考可以对算法进行一定程序的改良。
但是对于组合问题,图问题,除非是问题规模非常小的实例,否则蛮力法几乎不实用。
分治法解决各种问题比蛮力法更优越,大多情况下时间复杂度均为O(nlog(2(n))。
它利用空间复杂度来换取时间效率。
因此查找或排序的速度更快。
迭代法可进行数学建模,对于问题规模大而且可以设计数学模型的问题来说,它比其它算法更优越。
贪婪策略和动态规划策略对图问题,组合问题比其它策略更好。
只是动态规划比贪婪策略更通用。
因为很多问题采用贪婪策略可能找不到解时,采用动态规划可以解决。
如果贪婪策略可以解决,一般采用贪婪策略。
当我们面临实际的各种问题时,应该首先分析它属于上述常见问题中的哪一种。
对于查找问题,它在实际运用中主要用于搜索,而且要求时间效率很高。
若搜索的内容是已经排好序的线性表,这时应该采用分治法。
若搜索的内容是需要进行增、删改的动态查找表,则采用动态规划法。
对于排序问题,在实际运用中
主要是内排序,排序的目的主要是为了进行快速查找,一般采用分治或减治法提高时间效率。
其中二路归并排序,快速排序与堆排序的时间复杂度都可以达到最优值O(nlog2(n))。
对于图问题,总是会涉及到最优化问题,所以可针对不同问题的特点,在动态规划法、贪心法、回溯法中选择。
对于组合问题,这几种策略都可以用,但是分治法、贪心法的实际运用范围更广。
对于几何问题,若涉及到数值计算,选用迭代法。
若涉及到最优化问题应该选用分治法或动态规划法。
马尔可夫决策过程中的策略迭代算法与蒙特卡洛树搜索算法比较(十)
马尔可夫决策过程中的策略迭代算法与蒙特卡洛树搜索算法比较在人工智能和机器学习领域,马尔可夫决策过程(MDP)是一种常用的数学框架,用于建模具有随机性和不确定性的决策问题。
MDP的解决方法有很多种,其中策略迭代算法和蒙特卡洛树搜索算法是两种常用的方法。
本文将对这两种算法进行比较和分析。
策略迭代算法是一种经典的动态规划方法,用于求解MDP中的最优策略。
它的基本思想是通过不断迭代更新策略,直到策略收敛为止。
在每一次迭代中,算法都会先根据当前的策略计算出价值函数,然后再根据价值函数更新策略,直到策略不再发生变化。
这种方法的优点是收敛性好,能够找到最优策略。
然而,策略迭代算法的缺点也是显而易见的,它的计算复杂度较高,尤其在状态空间较大或动作空间连续的情况下,算法的效率很低。
与策略迭代算法相比,蒙特卡洛树搜索算法是一种基于模拟的启发式搜索方法,主要用于解决零和博弈问题。
它的基本思想是通过模拟对游戏树进行搜索,并利用模拟结果来估计每个节点的价值,从而选择最优的动作。
蒙特卡洛树搜索算法的优点在于它不需要对环境进行建模,而且能够处理状态空间较大的问题。
然而,与策略迭代算法相比,蒙特卡洛树搜索算法的收敛性不如策略迭代算法,而且在实际应用中往往需要大量的模拟次数才能得到可靠的结果。
在实际应用中,选择策略迭代算法还是蒙特卡洛树搜索算法取决于具体的问题和需求。
对于状态空间较小且能够建模的问题,策略迭代算法通常是一个不错的选择,它能够找到最优策略并且收敛速度较快。
而对于状态空间较大或连续的问题,蒙特卡洛树搜索算法可能更适合,它能够处理随机性和不确定性较大的问题,并且不需要对环境进行建模,适用性更广。
总的来说,策略迭代算法和蒙特卡洛树搜索算法各有其优缺点,选择合适的方法取决于具体问题的性质和需求。
在未来的研究中,可以通过结合这两种算法的优点,设计出更加有效的解决方案,从而更好地应对复杂的决策问题。
遗传算法三种编码策略的比较研究
为 S =口l 2 …口 k …a a12 …口li…a …aln…口 口 12 2 a 蝇 三 i i n 2 口2 a
相应 的位 段译码函数 r ( : Q
=
,为 v / ]
it・ =Z () 1
问题上研 究者却普遍 倾 向于使用 实数编码 策略 ,认为 实数编 码具有精度高 ,便于大空 间搜 索的优点 ~。但也有研 究者指 出对 搜 索 空 间较 大 的复 杂 优 化 问题 ,实 数编 码 G 解 问 题 的 A求
随 后受 到 各 国学 者 的广 泛 研 究 和 关 注 。 G 理 论研 究 的 一 个 重 要 方 向就 是 对 编 码 策 略 的 研 究 , 因 A 为 编 码 策 略 决 定 了 遗 传 算 子 的操 作 方 式 , 对 算 法 的搜 索 效 果 和 效率 有 重 要 影 响 。 在 G A编 码 策 略 问题 上 , o ln 建 议 采 用 二进 制 编 码 。 而 在 连续 参 数 优 化 H lad 然
效 率 很 低 ,不 及 二 进 制 编 码 , 并且 建议 采用 十 进 制 编 码 。 。 针 对 上 述 有 争 议 的 问题 , 以 多层 前 馈 神 经 网 络 权 值 优 化
r , ・咄)q . = 如,、
其中 , , 噍为个体位串S 的第f 整个 译码函数为 。 …, 段。
为其一个体 的基 因型,对应 表现 型为
=[ . , .5 32 , . , .3 。 7 1 53 , . 4 1 27 ] O O 2
33 十 进 制 编 码 . 十 进 制 编 码 将 待 处 理 的参 数 数 值 ( 数 ) 位 数 字 地 转 。 实 逐 化 为 一 定 长 度 的数 字 字 符 并 形 成 字 符 串 。
贪心算法、分治算法、动态规划算法间的比较.doc
题目:贪心算法、分治算法、动态规划算法间的比较贪心算法:贪心算法采用的是逐步构造最优解的方法。
在每个阶段,都在一定的标准下做出一个看上去最优的决策。
决策一旦做出,就不可能再更改。
做出这个局部最优决策所依照的标准称为贪心准则。
分治算法:分治法的思想是将一个难以直接解决大的问题分解成容易求解的子问题,以便各个击破、分而治之。
动态规划:将待求解的问题分解为若干个子问题,按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。
在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。
依次解决各子问题,最后一个子问题就是初始问题的解。
二、算法间的关联与不同1、分治算法与动态规划分治法所能解决的问题一般具有以下几个特征:①该问题的规模缩小到一定程度就可以容易地解决。
②该问题可以分为若干个较小规模的相似的问题,即该问题具有最优子结构性质。
③利用该问题分解出的子问题的解可以合并为该问题的解。
④该问题所分解出的各个子问题是相互独立的且子问题即之间不包含公共的子问题。
上述的第一条特征是绝大多数问题都可以满足的,因为问题的计算复杂性一般是随着问题规模的增加而增加;第二条特征是分治法应用的前提,它也是大多数问题可以满足的,此特征反映了递归思想的应用;第三条特征是关键,能否利用分治法完全取决于问题是否具有第三条特征,如果具备了第一条和第二条特征,而不具备第三条特征,则可以考虑贪心算法或动态规划算法;第四条特征涉及到分治法的效率,如果各个子问题不是独立的,则分治法要做许多不必要的工作,重复地解公共的子问题。
这类问题虽然可以用分治法解决,但用动态规划算法解决效率更高。
当问题满足第一、二、三条,而不满足第四条时,一般可以用动态规划法解决,可以说,动态规划法的实质是:分治算法思想+解决子问题冗余情况2、贪心算法与动态规划算法多阶段逐步解决问题的策略就是按一定顺序或一定的策略逐步解决问题的方法。
遗传算法中种群选择策略的比较与优化方法
遗传算法中种群选择策略的比较与优化方法遗传算法(Genetic Algorithm,简称GA)是一种模拟自然选择和遗传机制的优化算法,广泛应用于解决复杂问题。
在遗传算法中,种群选择策略起着至关重要的作用,直接影响算法的性能和收敛速度。
本文将比较不同的种群选择策略,并探讨一些优化方法。
1. 简单选择策略简单选择策略是最基本的选择策略之一,根据个体适应度的大小来选择个体。
适应度越大的个体被选择的概率越大,适应度较小的个体则被淘汰的概率较大。
这种策略简单直观,但容易导致早熟收敛和局部最优解的陷阱。
2. 锦标赛选择策略锦标赛选择策略是一种随机选择个体进行比较的方法。
每次从种群中随机选择一定数量的个体,然后选择其中适应度最好的个体作为父代。
这种策略能够增加种群的多样性,减少早熟收敛的可能性。
3. 轮盘赌选择策略轮盘赌选择策略是一种按照适应度比例进行选择的方法。
将适应度值转化为概率,然后根据个体的适应度概率进行选择。
适应度越大的个体被选择的概率越高,适应度较小的个体也有一定的选择机会。
这种策略能够更好地保留优秀个体,并增加种群的多样性。
4. 非支配排序选择策略非支配排序选择策略是一种多目标优化的选择方法。
通过将个体按照非支配排序进行划分,优先选择非支配解,并根据拥挤度进行选择,以维持种群的多样性。
这种策略适用于多目标优化问题,能够得到一系列的非支配解。
优化方法:1. 精英保留策略精英保留策略是一种保留种群中最优个体的方法。
在选择过程中,将适应度最好的个体直接复制到下一代中,以保持种群中优秀个体的稳定。
这种策略能够加速算法的收敛速度,但也容易导致早熟收敛。
2. 多样性保持策略为了避免种群过早陷入局部最优解,需要保持种群的多样性。
多样性保持策略可以通过引入随机因素、增加选择压力等方式来增加种群的多样性。
例如,可以在选择过程中引入一定的随机性,或者通过调整选择压力参数来平衡种群的多样性和收敛速度。
3. 自适应选择策略自适应选择策略是根据种群的动态变化来调整选择策略的方法。
算法策略的总结
算法策略的总结策略是⾯向问题的,算法是⾯向实现的。
⼀、不同算法策略特点⼩结1、贪⼼策略贪⼼策略⼀⽅⾯是求解过程⽐较简单的算法,另⼀⽅⾯它⼜是对能适⽤问题的条件要求最严格(即适⽤范围很⼩)的算法。
贪⼼策略解决问题是按⼀定顺序,在只考虑当前局部信息的情况下,就做出⼀定的决策,最终得出问题的解。
即:通过局部最优决策能得到全局最优决策2、递推策略递推也是由当前问题的逐步解决从⽽得到整个问题的解,依赖于信息间本⾝的递推关系,每⼀步不需要决策参与到算法中,更多⽤于计算3、递归策略递归常常⽤于分治算法、动态规划算法中。
递归是利⽤⼤问题与其⼦问题间的递推关系来解决问题的。
能采⽤递归策略的算法⼀般有以下特征:(1)为求解规模为N的问题,设法将它分解成规模较⼩的问题,然后从这些⼩问题的解⽅便地构造出⼤问题的解(2)并且这些规模较⼩的问题也能采⽤同样的分解和综合⽅法,分解成更⼩的问题,并从这些更⼩的问题的解构造出规模较⼤问题的解(3)特别的,当规模N = 1时,能直接得解4、枚举策略对问题所有的解逐⼀尝试,从⽽找出问题的真正解。
⼀般⽤于决策类问题,很难找到⼤、⼩规模之间的关系,也不易对问题进⾏分解。
5、递归回溯策略类似于枚举,通过尝试遍历问题各个可能解的通路,当发现此路不通时,回溯到上⼀步继续尝试别的通路。
6、分治策略分治⼀般⽤于较复杂的问题,必须可以逐步被分解为容易解决的独⽴的⼦问题,这些⼦问题解决后,进⽽将它们的解“合成”,就得到较⼤问题的解,最终合成为总问题的解。
7、动态规划策略与贪⼼类似,也是通过多阶段决策过程来解决问题。
每个阶段决策的结果是⼀个决策结果序列,这个结果序列中,最终哪⼀个是最优的结果,取决于以后每个阶段的决策,当然每次决策结果序列都必须进⾏存储。
因此是“⾼效率,⾼消费的算法”。
同时,它⼜与递归法类似,当问题不能分解为独⽴的阶段,却⼜符合最优化原理时,就可以使⽤动态规划法,通过递归决策过程,逐步找出⼦问题的最优解,从⽽决策出问题的解。
马尔可夫决策过程中的策略迭代算法与蒙特卡洛树搜索算法比较(五)
马尔可夫决策过程(Markov Decision Process,MDP)是一种用于描述决策制定过程的数学框架,可以用来解决许多涉及不确定性的问题,比如机器人路径规划、自动驾驶、金融投资等。
在MDP中,智能体通过与环境的交互来学习最优策略,以达到最大化长期回报的目标。
策略迭代算法和蒙特卡洛树搜索算法都是用于解决MDP问题的经典算法,它们各有优劣,下面我们将对两种算法进行比较。
策略迭代算法是一种基于值函数的迭代算法,它通过反复迭代优化策略和值函数来求解MDP。
算法的基本思想是从一个随机初始化的策略开始,不断更新值函数和策略,直到策略收敛为止。
在每一次迭代中,算法首先根据当前的策略计算值函数,然后根据值函数更新策略,直到策略不再发生改变。
策略迭代算法的优点是收敛速度较快,而且对于大规模问题也有较好的适用性。
与策略迭代算法不同,蒙特卡洛树搜索算法是一种基于树搜索的算法,它通过模拟大量的随机样本来估计状态值函数和策略。
算法的基本思想是从根节点开始,不断扩展搜索树,直到达到指定的搜索深度或满足终止条件为止。
在每一次搜索中,算法根据当前的策略和值函数来选择动作,并根据环境的反馈来更新值函数和策略。
蒙特卡洛树搜索算法的优点是能够处理高维度、连续动作空间的问题,而且在处理具有大量随机性的问题时表现较好。
在实际应用中,策略迭代算法和蒙特卡洛树搜索算法都有其独特的优势和劣势。
对于维度较小、离散动作空间的问题,策略迭代算法通常能够在较短的时间内找到较优策略,而且收敛速度较快。
但是,策略迭代算法对于高维度、连续动作空间的问题表现不佳,因为值函数的计算和策略的更新需要大量的计算资源。
相比之下,蒙特卡洛树搜索算法在处理高维度、连续动作空间的问题时具有一定的优势,因为它能够通过大量的随机样本来估计状态值函数和策略,而不需要显式地计算值函数和策略。
但是,蒙特卡洛树搜索算法在处理低维度、离散动作空间的问题时通常表现不佳,因为搜索树的构建和更新需要大量的计算资源。
优化算法的比较分析
优化算法的比较分析优化算法是指在解决问题时,通过改进现有算法或提出新的算法来增加算法的效率或减少资源消耗的过程。
优化算法的比较分析是指对多个不同的优化算法进行比较和评估,以确定哪个算法最适合解决一些特定问题。
本文将介绍优化算法的比较分析方法、常用的优化算法以及如何选择最合适的优化算法。
一、优化算法的比较分析方法1.理论分析:通过对算法进行数学建模和分析,推导出算法的时间复杂度和空间复杂度等指标。
根据指标的大小比较算法的效率和资源消耗。
理论分析可以提供算法之间的大致性能比较,但是不考虑具体的实际问题和实际运行环境。
2.实验评估:通过在真实的问题场景下实施算法并进行测试,根据测试结果进行算法性能的评估。
实验评估能够考虑实际问题和实际运行环境的影响,比理论分析更接近实际情况。
实验评估的方法包括对算法在不同数据规模、不同输入特征、不同硬件环境等条件下进行测试,并记录算法的运行时间、资源消耗等指标进行比较。
3.综合比较:将理论分析和实验评估相结合,综合考虑算法的理论性能和实际性能,进行最终的比较和评估。
综合比较方法可以提供更全面、更准确的算法性能比较结果。
二、常用的优化算法1.贪婪算法:贪婪算法是一种通过在每一步选择当前最佳选项来构建最优解的算法。
贪婪算法通常具有较低的计算复杂度,但是不能保证获得全局最优解。
2.动态规划算法:动态规划算法是将问题划分为多个子问题,并通过解决子问题来构建最优解的算法。
动态规划算法通常使用递归或迭代的方式来解决问题,可以获得全局最优解,但是计算复杂度较高。
3.遗传算法:遗传算法是一种通过模拟自然选择和遗传机制来解决优化问题的算法。
遗传算法通过模拟遗传过程中的交叉、变异和选择等操作来不断进化,最终找到适应度最高的解。
4.模拟退火算法:模拟退火算法是一种模拟金属退火过程来解决优化问题的算法。
模拟退火算法通过随机和概率迭代的方式,在局部最优解中跳出,寻找更好的解。
5.粒子群算法:粒子群算法是一种模拟鸟群行为来解决优化问题的算法。
基因组学中的DNA测序算法比较与优化策略
基因组学中的DNA测序算法比较与优化策略DNA测序是基因组学研究的关键步骤,它确定了DNA序列中的碱基顺序,为进一步理解基因功能和疾病发生机制提供了重要的信息。
DNA测序算法的比较与优化策略是提高测序效率和准确性的关键。
本文将从DNA测序的原理入手,介绍当前常用的DNA测序算法,并分析比较与优化策略,以期为基因组学研究提供指导。
DNA测序算法是通过测量DNA分子中的碱基序列来确定其排列顺序的方法。
当前常用的DNA测序技术包括链终止法(Sanger测序)、测序通量法(Next-generation sequencing, NGS)和第三代测序技术。
其中,链终止法是第一种广泛应用的测序技术,其原理是利用特殊的ddNTP(二脱氧核苷酸)标记终止DNA链生长,通过电泳分离不同长度的DNA片段来确定碱基顺序。
带有荧光标记的末端ddNTP可以被自动测序仪检测到,从而推断DNA序列。
虽然链终止法准确性高,但速度较慢且昂贵,限制了其在大规模基因组测序中的应用。
相比之下,新一代测序技术(如Illumina和Ion Torrent)使用高通量并行测序原理,大大提高了测序速度和效率,降低了成本。
这些技术通过将DNA样本分为数百万至数十亿个碎片,同时并行测序,然后利用计算方法将碎片重新组装成整个基因组。
这些测序技术具有快速、高效和经济的特点,成为当前主流的DNA测序方法。
然而,尽管新一代测序技术在测序速度和经济性上有明显优势,但其测序准确性相对较低。
这主要是由于受到测序过程中错误的影响,例如碱基读取错误和碱基间的串扰。
为了解决这些问题,研究人员开发了许多比较与优化策略。
首先,测序算法中的误差校正是一种常见的优化策略。
误差校正旨在识别和纠正测序过程中的错误。
为此,研究人员使用多次独立的测序反应来重复测序,通过统计分析来准确估计测序错误率,并使用错误模型对读取的碱基进行校正。
此外,一些高级算法还使用碱基质量值来调整错误校正。
试述问题解决的策略并加以比较分析
试述问题解决的策略并加以比较分析问题解决的策略包括算法式和启发式两种。
(一)算法式算法策略是将所有可能的针对性问题解决的方法都一一列举出来并进行尝试,直到最终从根本上解决问题。
很明显,算法策略需要在解决问题时进行大量的准备工作,需要花费较大的精力和较多的时间,但是优点就是能够确保找到问题解决的途径。
例如,解锁密码箱时每一位密码都有0——9个数字,那么把所有数字组合一个一个进行尝试,直到找到打开密码箱的正确密码,这一过程就是在使用算法策略。
(二)启发式启发式策略是运用已有的知识经验,在问题空间内只做少量的搜索就能解决问题的策略。
它可以迅速地解决问题,但不排除失败的可能。
启发式的策略包括以下几种:(1)手段-目的分析法所谓的手段——目的分析就是将需要达到的问题的目标状态分成若干子目标,通过实现一系列的子目标最终达到总目标。
它的基本步骤是:①比较初始状态和目标状态,提出第一个子目标。
②找出完成第一个子目标的方法或操作。
③实现子目标。
④提出新的子目标,如此循环往复,直至问题的解决。
手段——目的分析是一种不断减少当前状态与目标状态之间的差别而逐步前进的策略。
但有时,人们为了达到目的,不得不暂时扩大目标状态与初始状态的差异,以便最终达到目标。
在日常生活中,手段——目的分析是人们比较常用的一种解题策略,它对解决复杂的问题有重要的应用价值。
例如,对某些学生而言,写一篇20页的论文是一件很头疼的问题,但如果把该任务划分为几个子任务,如选题、查找资料、阅读资料、组织材料、编写提纲、分段写作等,他们就可能表现的好一些。
(2)爬山法爬山法是类似于手段——目的分析的一种解题策略。
它是采用一定的方法逐步降低初始状态和目标的距离,以达到问题解决的一种方法。
这就好像登山者,为了登上山峰,需要从山脚一步一步登上山峰一样。
例如,医生给慢性病人用药时常常用这种方法来确定药的剂量。
(3)逆向反推法逆向搜索就是从问题的目标状态开始搜索直至找到通往初始状态的通路或方法。
各种聚类算法介绍及对比
一、层次聚类1、层次聚类的原理及分类1层次法Hierarchical methods先计算样本之间的距离;每次将距离最近的点合并到同一个类;然后,再计算类与类之间的距离,将距离最近的类合并为一个大类;不停的合并,直到合成了一个类;其中类与类的距离的计算方法有:最短距离法,最长距离法,中间距离法,类平均法等;比如最短距离法,将类与类的距离定义为类与类之间样本的最短距离;层次聚类算法根据层次分解的顺序分为:自下底向上和自上向下,即凝聚的层次聚类算法和分裂的层次聚类算法agglomerative和divisive,也可以理解为自下而上法bottom-up和自上而下法top-down;自下而上法就是一开始每个个体object都是一个类,然后根据linkage寻找同类,最后形成一个“类”;自上而下法就是反过来,一开始所有个体都属于一个“类”,然后根据linkage排除异己,最后每个个体都成为一个“类”;这两种路方法没有孰优孰劣之分,只是在实际应用的时候要根据数据特点以及你想要的“类”的个数,来考虑是自上而下更快还是自下而上更快;至于根据Linkage判断“类”的方法就是最短距离法、最长距离法、中间距离法、类平均法等等其中类平均法往往被认为是最常用也最好用的方法,一方面因为其良好的单调性,另一方面因为其空间扩张/浓缩的程度适中;为弥补分解与合并的不足,层次合并经常要与其它聚类方法相结合,如循环定位;2Hierarchical methods中比较新的算法有BIRCHBalanced Iterative Reducing and Clustering Using Hierarchies利用层次方法的平衡迭代规约和聚类主要是在数据量很大的时候使用,而且数据类型是numerical;首先利用树的结构对对象集进行划分,然后再利用其它聚类方法对这些聚类进行优化;ROCKA Hierarchical Clustering Algorithm for Categorical Attributes主要用在categorical 的数据类型上;ChameleonA Hierarchical Clustering Algorithm Using Dynamic Modeling里用到的linkage是kNNk-nearest-neighbor算法,并以此构建一个graph,Chameleon的聚类效果被认为非常强大,比BIRCH好用,但运算复杂度很高,On^2;2、层次聚类的流程凝聚型层次聚类的策略是先将每个对象作为一个簇,然后合并这些原子簇为越来越大的簇,直到所有对象都在一个簇中,或者某个终结条件被满足;绝大多数层次聚类属于凝聚型层次聚类,它们只是在簇间相似度的定义上有所不同;这里给出采用最小距离的凝聚层次聚类算法流程:1 将每个对象看作一类,计算两两之间的最小距离;2 将距离最小的两个类合并成一个新类;3 重新计算新类与所有类之间的距离;4 重复2、3,直到所有类最后合并成一类;聚类的效果如下图,黑色是噪音点:另外我们可以看出凝聚的层次聚类并没有类似基本K均值的全局目标函数,没有局部极小问题或是很难选择初始点的问题;合并的操作往往是最终的,一旦合并两个簇之后就不会撤销;当然其计算存储的代价是昂贵的;3、层次聚类的优缺点优点:1,距离和规则的相似度容易定义,限制少;2,不需要预先制定聚类数;3,可以发现类的层次关系;4,可以聚类成其它形状缺点:1,计算复杂度太高;2,奇异值也能产生很大影响;3,算法很可能聚类成链状r语言中使用hclustd, method = "complete", members=NULL:进行层次聚类;d为距离矩阵;method 表示类的合并方法,single最短距离法,complete最长距离法,median中间距离法,mcquitty相似法,average类平均法,centroid重心法,ward离差平方和法;members为NULL或d长度的矢量;二、划分聚类法k-means基于划分的方法Partition-based methods:其原理简单来说就是,想象你有一堆散点需要聚类,想要的聚类效果就是“类内的点都足够近,类间的点都足够远”;首先你要确定这堆散点最后聚成几类,然后挑选几个点作为初始中心点,再然后依据预先定好的启发式算法heuristic algorithms给数据点做迭代重置iterative relocation,直到最后到达“类内的点都足够近,类间的点都足够远”的目标效果;Partition-based methods聚类多适用于中等体量的数据集,但我们也不知道“中等”到底有多“中”,所以不妨理解成,数据集越大,越有可能陷入局部最小;1、Kmeans算法的原理k-means算法以k为参数,把n个对象分成k个簇,使簇内具有较高的相似度,而簇间的相似度较低;k-means算法的处理过程如下:首先,随机地选择k个对象,每个对象初始地代表了一个簇的平均值或中心,即选择K个初始质心;对剩余的每个对象,根据其与各簇中心的距离,将它赋给最近的簇;然后重新计算每个簇的平均值; 这个过程不断重复,直到准则函数收敛,直到质心不发生明显的变化;通常,采用平方误差准则,误差的平方和SSE作为全局的目标函数,即最小化每个点到最近质心的欧几里得距离的平方和;此时,簇的质心就是该簇内所有数据点的平均值;选择K个点作为初始质心repeat将每个点指派到最近的质心,形成K个簇重新计算每个簇的质心until簇不发生变化或达到最大迭代次数时间复杂度:OtKmn,其中,t为迭代次数,K为簇的数目,m为记录数,n为维数空间复杂度:Om+Kn,其中,K为簇的数目,m为记录数,n为维数K-Means 算法的详细过程从上图中,我们可以看到,A, B, C, D, E 是五个在图中点;而灰色的点是我们的种子点,也就是我们用来找点群的点;有两个种子点,所以K=2;然后,K-Means的算法如下:①随机在图中取K这里K=2个种子点;②然后对图中的所有点求到这K个种子点的距离,假如点Pi离种子点Si最近,那么Pi属于Si点群;我们可以看到A,B属于上面的种子点,C,D,E属于下面中部的种子点③接下来,我们要移动种子点到属于他的“点群”的中心;见图上的第三步④然后重复第2和第3步,直到,种子点没有移动我们可以看到图中的第四步上面的种子点聚合了A,B,C,下面的种子点聚合了D,E;聚类的效果如下图,折线是历次循环时3个簇的质心的更新轨迹,黑点是初始质心:我们查看基本K均值算法实现步骤及上面的聚类效果可以发现,该聚类算法将所有数据点都进行了指派,不识别噪音点;另外选择适当的初试质心是基本K均值过程的关键;2、k均值的优缺点及分类优点:1,简单,易于理解和实现;2,时间复杂度低缺点:1kmeans要手工输入类数目,对初始值的设置很敏感;所以有了k-means++、intelligent k-means、genetic k-means;2k-means对噪声和离群值非常敏感,所以有了k-medoids和k-medians;3k-means只用于numerical类型数据,不适用于categorical类型数据,所以k-modes;4k-means不能解决非凸non-convex数据,所以有了kernel k-means;5k-means主要发现圆形或者球形簇,不能识别非球形的簇;3、k-means与DBSCAN的区别k-means聚类算法的初始点选择不稳定,是随机选取的,这就引起聚类结果的不稳定;k-means属于动态聚类,往往聚出来的类有点圆形或者椭圆形;kmeans对于圆形区域聚类效果较好,dbscan基于密度,对于集中区域效果较好;对于不规则形状,kmeans完全无法用,dbscan可以起到很好的效果;4、k-means注意问题1K如何确定kmenas算法首先选择K个初始质心,其中K是用户指定的参数,即所期望的簇的个数;这样做的前提是我们已经知道数据集中包含多少个簇,但很多情况下,我们并不知道数据的分布情况,实际上聚类就是我们发现数据分布的一种手段;如何有效的确定K值,这里大致提供几种方法:①与层次聚类结合2经常会产生较好的聚类结果的一个有趣策略是,首先采用层次凝聚算法决定结果粗的数目,并找到一个初始聚类,然后用迭代重定位来改进该聚类;②稳定性方法3稳定性方法对一个数据集进行2次重采样产生2个数据子集,再用相同的聚类算法对2个数据子集进行聚类,产生2个具有k个聚类的聚类结果,计算2个聚类结果的相似度的分布情况;2个聚类结果具有高的相似度说明k个聚类反映了稳定的聚类结构,其相似度可以用来估计聚类个数;采用次方法试探多个k,找到合适的k值;③系统演化方法3系统演化方法将一个数据集视为伪热力学系统,当数据集被划分为K个聚类时称系统处于状态K;系统由初始状态K=1出发,经过分裂过程和合并过程,系统将演化到它的稳定平衡状态Ki,所对应的聚类结构决定了最优类数Ki;系统演化方法能提供关于所有聚类之间的相对边界距离或可分程度,适用于明显分离的聚类结构和轻微重叠的聚类结构;④使用canopy算法进行初始划分4基于Canopy Method的聚类算法将聚类过程分为两个阶段Stage1、聚类最耗费计算的地方是计算对象相似性的时候,Canopy Method在第一阶段选择简单、计算代价较低的方法计算对象相似性,将相似的对象放在一个子集中,这个子集被叫做Canopy ,通过一系列计算得到若干Canopy,Canopy之间可以是重叠的,但不会存在某个对象不属于任何Canopy的情况,可以把这一阶段看做数据预处理;Stage2、在各个Canopy 内使用传统的聚类方法如K-means,不属于同一Canopy 的对象之间不进行相似性计算;从这个方法起码可以看出两点好处:首先,Canopy 不要太大且Canopy 之间重叠的不要太多的话会大大减少后续需要计算相似性的对象的个数;其次,类似于K-means这样的聚类方法是需要人为指出K 的值的,通过Stage1得到的Canopy 个数完全可以作为这个K值,一定程度上减少了选择K的盲目性;其他方法如贝叶斯信息准则方法BIC可参看文献5;2初始质心的选取选择适当的初始质心是基本kmeans算法的关键步骤;常见的方法是随机的选取初始质心,但是这样簇的质量常常很差;处理选取初始质心问题的一种常用技术是:多次运行,每次使用一组不同的随机初始质心,然后选取具有最小SSE误差的平方和的簇集;这种策略简单,但是效果可能不好,这取决于数据集和寻找的簇的个数;第二种有效的方法是,取一个样本,并使用层次聚类技术对它聚类;从层次聚类中提取K个簇,并用这些簇的质心作为初始质心;该方法通常很有效,但仅对下列情况有效:1样本相对较小,例如数百到数千层次聚类开销较大;2K相对于样本大小较小第三种选择初始质心的方法,随机地选择第一个点,或取所有点的质心作为第一个点;然后,对于每个后继初始质心,选择离已经选取过的初始质心最远的点;使用这种方法,确保了选择的初始质心不仅是随机的,而且是散开的;但是,这种方法可能选中离群点;此外,求离当前初始质心集最远的点开销也非常大;为了克服这个问题,通常该方法用于点样本;由于离群点很少多了就不是离群点了,它们多半不会在随机样本中出现;计算量也大幅减少;第四种方法就是上面提到的canopy算法;3距离的度量常用的距离度量方法包括:欧几里得距离和余弦相似度;两者都是评定个体间差异的大小的;欧几里得距离度量会受指标不同单位刻度的影响,所以一般需要先进行标准化,同时距离越大,个体间差异越大;空间向量余弦夹角的相似度度量不会受指标刻度的影响,余弦值落于区间-1,1,值越大,差异越小;但是针对具体应用,什么情况下使用欧氏距离,什么情况下使用余弦相似度从几何意义上来说,n维向量空间的一条线段作为底边和原点组成的三角形,其顶角大小是不确定的;也就是说对于两条空间向量,即使两点距离一定,他们的夹角余弦值也可以随意变化;感性的认识,当两用户评分趋势一致时,但是评分值差距很大,余弦相似度倾向给出更优解;举个极端的例子,两用户只对两件商品评分,向量分别为3,3和5,5,这两位用户的认知其实是一样的,但是欧式距离给出的解显然没有余弦值合理;4质心的计算对于距离度量不管是采用欧式距离还是采用余弦相似度,簇的质心都是其均值,即向量各维取平均即可;5算法停止条件一般是目标函数达到最优或者达到最大的迭代次数即可终止;对于不同的距离度量,目标函数往往不同;当采用欧式距离时,目标函数一般为最小化对象到其簇质心的距离的平方和;当采用余弦相似度时,目标函数一般为最大化对象到其簇质心的余弦相似度和;6空聚类的处理如果所有的点在指派步骤都未分配到某个簇,就会得到空簇;如果这种情况发生,则需要某种策略来选择一个替补质心,否则的话,平方误差将会偏大;一种方法是选择一个距离当前任何质心最远的点;这将消除当前对总平方误差影响最大的点;另一种方法是从具有最大SSE的簇中选择一个替补的质心;这将分裂簇并降低聚类的总SSE;如果有多个空簇,则该过程重复多次;另外,编程实现时,要注意空簇可能导致的程序bug;三、基于密度的聚类基于密度的方法Density-based methods:k-means解决不了不规则形状的聚类;于是就有了Density-based methods来系统解决这个问题;该方法同时也对噪声数据的处理比较好;基于密度聚类的思想:思路就是定一个距离半径,最少有多少个点,然后把可以到达的点都连起来,判定为同类;其原理简单说画圈儿,其中要定义两个参数,一个是圈儿的最大半径,一个是一个圈儿里最少应容纳几个点;最后在一个圈里的,就是一个类;DBSCAN Density-Based Spatial Clustering of Applications with Noise就是其中的典型,可惜参数设置也是个问题,对这两个参数的设置非常敏感;DBSCAN的扩展叫OPTICSOrdering Points To Identify Clustering Structure通过优先对高密度high density进行搜索,然后根据高密度的特点设置参数,改善了DBSCAN的不足;1、DBSCAN的概念dbscan基于密度,对于集中区域效果较好,为了发现任意形状的簇,这类方法将簇看做是数据空间中被低密度区域分割开的稠密对象区域;一种基于高密度连通区域的基于密度的聚类方法,该算法将具有足够高密度的区域划分为簇,并在具有噪声的空间数据中发现任意形状的簇;DBSCAN中的几个定义:Ε邻域:给定对象半径为Ε内的区域称为该对象的Ε邻域;核心对象:如果给定对象Ε领域内的样本点数大于等于MinPts,则称该对象为核心对象;直接密度可达:对于样本集合D,如果样本点q在p的Ε领域内,并且p为核心对象,那么对象q从对象p直接密度可达;密度可达:对于样本集合D,给定一串样本点p1,p2….pn,p= p1,q= pn,假如对象pi从pi-1直接密度可达,那么对象q从对象p密度可达;注意:密度可达是单向的,密度可达即可容纳同一类;密度相连:存在样本集合D中的一点o,如果对象o到对象p和对象q都是密度可达的,那么p和q密度相联;密度可达是直接密度可达的传递闭包,并且这种关系是非对称的;密度相连是对称关系;DBSCAN目的是找到密度相连对象的最大集合;有了以上的概念接下来就是算法描述了:DBSCAN通过检查数据库中每点的r邻域来搜索簇;如果点p 的r邻域包含的点多于MinPts个,则创建一个以p为核心对象的新簇;然后,DBSCAN迭代的聚集从这些核心对象直接密度可达的对象,这个过程可能涉及一些密度可达簇的合并;当没有新的点可以添加到任何簇时,该过程结束;例如:Eg: 假设半径Ε=3,MinPts=3,点p的E领域中有点{m,p,p1,p2,o}, 点m的E领域中有点{m,q,p,m1,m2},点q的E领域中有点{q,m},点o的E领域中有点{o,p,s},点s的E领域中有点{o,s,s1}.那么核心对象有p,m,o,sq不是核心对象,因为它对应的E领域中点数量等于2,小于MinPts=3;点m从点p直接密度可达,因为m在p的E领域内,并且p为核心对象;点q从点p密度可达,因为点q从点m直接密度可达,并且点m从点p直接密度可达;点q到点s密度相连,因为点q从点p密度可达,并且s从点p密度可达;2、簇的生成原理及过程1DBSCAN聚类算法原理的基本要点:确定半径eps的值①DBSCAN算法需要选择一种距离度量,对于待聚类的数据集中,任意两个点之间的距离,反映了点之间的密度,说明了点与点是否能够聚到同一类中;由于DBSCAN算法对高维数据定义密度很困难,所以对于二维空间中的点,可以使用欧几里德距离来进行度量;②DBSCAN算法需要用户输入2个参数:一个参数是半径Eps,表示以给定点P为中心的圆形邻域的范围;另一个参数是以点P为中心的邻域内最少点的数量MinPts;如果满足:以点P为中心、半径为Eps 的邻域内的点的个数不少于MinPts,则称点P为核心点;③DBSCAN聚类使用到一个k-距离的概念,k-距离是指:给定数据集P={pi; i=0,1,…n},对于任意点Pi,计算点Pi到集合D的子集S={p1, p2, …, pi-1, pi+1, …, pn}中所有点之间的距离,距离按照从小到大的顺序排序,假设排序后的距离集合为D={d1, d2, …, dk-1, dk, dk+1, …,dn},则dk就被称为k-距离;也就是说,k-距离是点pi到所有点除了pi点之间距离第k近的距离;对待聚类集合中每个点pi都计算k-距离,最后得到所有点的k-距离集合E={e1, e2, …, en};④根据经验计算半径Eps:根据得到的所有点的k-距离集合E,对集合E进行升序排序后得到k-距离集合E’,需要拟合一条排序后的E’集合中k-距离的变化曲线图,然后绘出曲线,通过观察,将急剧发生变化的位置所对应的k-距离的值,确定为半径Eps的值;⑤根据经验计算最少点的数量MinPts:确定MinPts的大小,实际上也是确定k-距离中k的值,DBSCAN 算法取k=4,则MinPts=4;⑥另外,如果觉得经验值聚类的结果不满意,可以适当调整Eps和MinPts的值,经过多次迭代计算对比,选择最合适的参数值;可以看出,如果MinPts不变,Eps取得值过大,会导致大多数点都聚到同一个簇中,Eps过小,会导致一个簇的分裂;如果Eps不变,MinPts的值取得过大,会导致同一个簇中点被标记为噪声点,MinPts过小,会导致发现大量的核心点;我们需要知道的是,DBSCAN算法,需要输入2个参数,这两个参数的计算都来自经验知识;半径Eps的计算依赖于计算k-距离,DBSCAN取k=4,也就是设置MinPts=4,然后需要根据k-距离曲线,根据经验观察找到合适的半径Eps的值;2连通核心点生成簇核心点能够连通有些书籍中称为:“密度可达”,它们构成的以Eps长度为半径的圆形邻域相互连接或重叠,这些连通的核心点及其所处的邻域内的全部点构成一个簇;假设MinPts=4,则连通的核心点示例,如下图所示:计算连通的核心点的思路是,基于广度遍历与深度遍历集合的方式:从核心点集合S中取出一个点p,计算点p与S集合中每个点除了p点是否连通,可能会得到一个连通核心点的集合C1,然后从集合S中删除点p和C1集合中的点,得到核心点集合S1;再从S1中取出一个点p1,计算p1与核心点集合S1集中每个点除了p1点是否连通,可能得到一个连通核心点集合C2,再从集合S1中删除点p1和C2集合中所有点,得到核心点集合S2,……最后得到p、p1、p2、……,以及C1、C2、……就构成一个簇的核心点;最终将核心点集合S中的点都遍历完成,得到所有的簇;参数eps的设置,如果eps设置过大,则所有的点都会归为一个簇,如果设置过小,那么簇的数目会过多;如果MinPts设置过大的话,很多点将被视为噪声点;3、根据数据点的密度分为三类点:1核心点:该点在邻域内的密度超过给定的阀值MinPs;2边界点:该点不是核心点,但是其邻域内包含至少一个核心点;3噪音点:不是核心点,也不是边界点;有了以上对数据点的划分,聚合可以这样进行:各个核心点与其邻域内的所有核心点放在同一个簇中,把边界点跟其邻域内的某个核心点放在同一个簇中;聚类的效果如下图,黑色是噪音点:初识聚类算法:因为DBSCAN使用簇的基于密度的定义,因此它是相对抗噪音的,并且能处理任意形状和大小的簇;但是如果簇的密度变化很大,例如ABCD四个簇,AB的密度大大大于CD,而且AB附近噪音的密度与簇CD 的密度相当,这是当MinPs较大时,无法识别簇CD,簇CD和AB附近的噪音都被认为是噪音;当MinPs 较小时,能识别簇CD,但AB跟其周围的噪音被识别为一个簇;这个问题可以基于共享最近邻SNN的聚类结局;4、DBSCAN的优缺点:优点:1. 与K-means方法相比,DBSCAN不需要事先知道要形成的簇类的数量;2. 与K-means方法相比,DBSCAN可以发现任意形状的簇类;3. 同时,DBSCAN能够识别出噪声点;对于数据库中样本的顺序不敏感,即Pattern的输入顺序对结果的影响不大;但是,对于处于簇类之间边界样本,可能会根据哪个簇类优先被探测到而其归属有所摆动;缺点:1. DBScan不能很好反映高尺寸数据;2. DBScan不能很好反映数据集变化的密度;3.对于高维数据,点之间极为稀疏,密度就很难定义了;。
