您现在的位置是: 首页 > 网站建设 网站建设

搜索优化算法_搜索优化算法有哪些

zmhk 2024-05-01 人已围观

简介搜索优化算法_搜索优化算法有哪些       对于搜索优化算法的话题,我可以从不同的角度进行分析和讨论,并提供相关的资讯和建议。1.ML模型超参数调节:网格搜索、随机搜索与贝叶斯优化

搜索优化算法_搜索优化算法有哪些

       对于搜索优化算法的话题,我可以从不同的角度进行分析和讨论,并提供相关的资讯和建议。

1.ML模型超参数调节:网格搜索、随机搜索与贝叶斯优化

2.大数据最常用的算法有哪些

3.搜索引擎关键字如何优化

4.KNN算法-4-算法优化-KD树

搜索优化算法_搜索优化算法有哪些

ML模型超参数调节:网格搜索、随机搜索与贝叶斯优化

        之前一直在阿里实习,最近终于闲了下来参加了一个Kaggle的比赛,记录一下比赛过程中对模型调参的一些经验。

        在进行机器学习的过程中,最为核心的一个概念就是参数,而参数又分为模型参数与超参数。模型参数,顾名思义就是我们使用的模型根据训练数据的分布学习到的参数,这一部分不需要我们人为的先验经验。超参数是在开始学习过程之前设置值的参数,而不是通过训练得到的参数数据。通常情况下,需要对超参数进行优化,给模型选择一组最优超参数,以提高学习的性能和效果。通常情况下,常用的超参数调参的方法有:网格搜索,随机搜索与贝叶斯优化。

        在下文我们以Kaggle 中最常用的模型LightGBMGoogle Analytics Customer Revenue Prediction 比赛数据为例对这三种方法进行探索,最终我在比赛中采用的是贝叶斯优化。

        网格搜索是应用最广泛的超参数搜索算法,网格搜索通过查找搜索范围内的所有的点,来确定最优值。一般通过给出较大的搜索范围以及较小的步长,网格搜索是一定可以找到全局最大值或最小值的。但是,网格搜索一个比较大的问题是,它十分消耗计算资源,特别是需要调优的超参数比较多的时候。在比赛中,需要调参的模型数量与对应的超参数比较多,而涉及的数据量又比较大,因此相当的耗费时间。此外,由于给出的超参数组合比较多,因此一般都会固定多数参数,分步对1~2个超参数进行调解,这样能够减少时间但是缺难以自动化进行,而且由于目标参数一般是非凸的,因此容易陷入局部最小值。

        网格搜索的方法如下:

        根据我们设定的超参数分布范围来看,对所有的参数组合进行一一尝试是不现实的,这可能会消耗数天甚至数星期的时间,尤其是在大样本训练集上。

        与网格搜索相比,随机搜索并未尝试所有参数值,而是从指定的分布中采样固定数量的参数设置。它的理论依据是,如果随即样本点集足够大,那么也可以找到全局的最大或最小值,或它们的近似值。通过对搜索范围的随机取样,随机搜索一般会比网格搜索要快一些。但是和网格搜索的快速版(非自动版)相似,结果也是没法保证的。

        随机搜索的过程如下,使用方法与网格搜索完全一致:

        贝叶斯优化用于机器学习调参由J. Snoek(2012)提出,主要思想是,给定优化的目标函数(广义的函数,只需指定输入和输出即可,无需知道内部结构以及数学性质),通过不断地添加样本点来更新目标函数的后验分布(高斯过程,直到后验分布基本贴合于真实分布。简单的说,就是考虑了上一次参数的信息,从而更好的调整当前的参数。

        贝叶斯优化与常规的网格搜索或者随机搜索的区别是:

        1 .贝叶斯调参采用高斯过程,考虑之前的参数信息,不断地更新先验;网格搜索未考虑之前的参数信息。

2 .贝叶斯调参迭代次数少,速度快;网格搜索速度慢,参数多时易导致维度爆炸。

3 .贝叶斯调参针对非凸问题依然稳健;网格搜索针对非凸问题易得到局部优最。

        贝叶斯优化调参的具体原理可以参考: 拟合目标函数后验分布的调参利器:贝叶斯优化

        我们使用BayesOpt包来进行贝叶斯优化调参,安装命令如下所示:

        BayesOpt包主要使用BayesianOptimization 函数来创建一个优化对象,该函数接受一个模型评估函数function ,这个function 的输入应该是xgboost(或者其他ML模型)的超参数,输出是模型在测试集上的效果(可以是Accuracy,也可以是RMSE,取决于具体的任务,一般返回K-Fold的均值)。

        基于5-Fold的LightGBM贝叶斯优化的过程如下所示:

        迭代25次的优化结果如下所示:

        首先BayesianOptimization进行多次随机采样进行初始化,得到一个超参数与误差的分布结果,然后在这个结果的基础上使用贝叶斯优化来逼近最优超参数的分布。可以看出在所有的迭代结果中,第25次的结果最好,5-fold的MSE为2.64087。

大数据最常用的算法有哪些

       背景:禁忌搜索算法(Tabu Search)是由美国科罗拉多州大学的Fred Glover教授在1986年左右提出来的,是一个用来跳出局部最优的搜寻方法。在解决最优问题上,一般区分为两种方式:一种是传统的方法,另一种方法则是一些启发式搜索算法。

       使用传统的方法,我们必须对每一个问题都去设计一套算法,相当不方便,缺乏广泛性,优点在于我们可以证明算法的正确性,我们可以保证找到的答案是最优的;而对于启发式算法,针对不同的问题,我们可以套用同一个架构来寻找答案,在这个过程中,我们只需要设计评价函数以及如何找到下一个可能解的函数等,所以启发式算法的广泛性比较高,但相对在准确度上就不一定能够达到最优,但是在实际问题中启发式算法那有着更广泛的应用

搜索引擎关键字如何优化

       奥地利符号计算研究所(Research Institute for Symbolic Computation,简称RISC)的Christoph Koutschan博士在自己的页面上发布了一篇文章,提到他做了一个调查,参与者大多数是计算机科学家,他请这些科学家投票选出最重要的算法,以下是这次调查的结果,按照英文名称字母顺序排序。

       大数据等最核心的关键技术:32个算法

       1、A* 搜索算法——图形搜索算法,从给定起点到给定终点计算出路径。其中使用了一种启发式的估算,为每个节点估算通过该节点的最佳路径,并以之为各个地点排定次序。算法以得到的次序访问这些节点。因此,A*搜索算法是最佳优先搜索的范例。

       2、集束搜索(又名定向搜索,Beam Search)——最佳优先搜索算法的优化。使用启发式函数评估它检查的每个节点的能力。不过,集束搜索只能在每个深度中发现最前面的m个最符合条件的节点,m是固定数字——集束的宽度。

       3、二分查找(Binary Search)——在线性数组中找特定值的算法,每个步骤去掉一半不符合要求的数据。

       4、分支界定算法(Branch and Bound)——在多种最优化问题中寻找特定最优化解决方案的算法,特别是针对离散、组合的最优化。

       5、Buchberger算法——一种数学算法,可将其视为针对单变量最大公约数求解的欧几里得算法和线性系统中高斯消元法的泛化。

       6、数据压缩——采取特定编码方案,使用更少的字节数(或是其他信息承载单元)对信息编码的过程,又叫来源编码。

       7、Diffie-Hellman密钥交换算法——一种加密协议,允许双方在事先不了解对方的情况下,在不安全的通信信道中,共同建立共享密钥。该密钥以后可与一个对称密码一起,加密后续通讯。

       8、Dijkstra算法——针对没有负值权重边的有向图,计算其中的单一起点最短算法。

       9、离散微分算法(Discrete differentiation)。

       10、动态规划算法(Dynamic Programming)——展示互相覆盖的子问题和最优子架构算法

       11、欧几里得算法(Euclidean algorithm)——计算两个整数的最大公约数。最古老的算法之一,出现在公元前300前欧几里得的《几何原本》。

       12、期望-最大算法(Expectation-maximization algorithm,又名EM-Training)——在统计计算中,期望-最大算法在概率模型中寻找可能性最大的参数估算值,其中模型依赖于未发现的潜在变量。EM在两个步骤中交替计算,第一步是计算期望,利用对隐藏变量的现有估计值,计算其最大可能估计值;第二步是最大化,最大化在第一步上求得的最大可能值来计算参数的值。

       13、快速傅里叶变换(Fast Fourier transform,FFT)——计算离散的傅里叶变换(DFT)及其反转。该算法应用范围很广,从数字信号处理到解决偏微分方程,到快速计算大整数乘积。

       14、梯度下降(Gradient descent)——一种数学上的最优化算法。

       15、哈希算法(Hashing)。

       16、堆排序(Heaps)。

       17、Karatsuba乘法——需要完成上千位整数的乘法的系统中使用,比如计算机代数系统和大数程序库,如果使用长乘法,速度太慢。该算法发现于1962年。

       18、LLL算法(Lenstra-Lenstra-Lovasz lattice reduction)——以格规约(lattice)基数为输入,输出短正交向量基数。LLL算法在以下公共密钥加密方法中有大量使用:背包加密系统(knapsack)、有特定设置的RSA加密等等。

       19、最大流量算法(Maximum flow)——该算法试图从一个流量网络中找到最大的流。它优势被定义为找到这样一个流的值。最大流问题可以看作更复杂的网络流问题的特定情况。最大流与网络中的界面有关,这就是最大流-最小截定理(Max-flow min-cut theorem)。Ford-Fulkerson 能找到一个流网络中的最大流。

       20、合并排序(Merge Sort)。

       21、牛顿法(Newton’s method)——求非线性方程(组)零点的一种重要的迭代法。

       22、Q-learning学习算法——这是一种通过学习动作值函数(action-value function)完成的强化学习算法,函数采取在给定状态的给定动作,并计算出期望的效用价值,在此后遵循固定的策略。Q-leanring的优势是,在不需要环境模型的情况下,可以对比可采纳行动的期望效用。

       23、两次筛法(Quadratic Sieve)——现代整数因子分解算法,在实践中,是目前已知第二快的此类算法(仅次于数域筛法Number Field Sieve)。对于110位以下的十位整数,它仍是最快的,而且都认为它比数域筛法更简单。

       24、RANSAC——是“RANdom SAmple Consensus”的缩写。该算法根据一系列观察得到的数据,数据中包含异常值,估算一个数学模型的参数值。其基本假设是:数据包含非异化值,也就是能够通过某些模型参数解释的值,异化值就是那些不符合模型的数据点。

       25、RSA——公钥加密算法。首个适用于以签名作为加密的算法。RSA在电商行业中仍大规模使用,大家也相信它有足够安全长度的公钥。

       26、Sch?nhage-Strassen算法——在数学中,Sch?nhage-Strassen算法是用来完成大整数的乘法的快速渐近算法。其算法复杂度为:O(N log(N) log(log(N))),该算法使用了傅里叶变换。

       27、单纯型算法(Simplex Algorithm)——在数学的优化理论中,单纯型算法是常用的技术,用来找到线性规划问题的数值解。线性规划问题包括在一组实变量上的一系列线性不等式组,以及一个等待最大化(或最小化)的固定线性函数。

       28、奇异值分解(Singular value decomposition,简称SVD)——在线性代数中,SVD是重要的实数或复数矩阵的分解方法,在信号处理和统计中有多种应用,比如计算矩阵的伪逆矩阵(以求解最小二乘法问题)、解决超定线性系统(overdetermined linear systems)、矩阵逼近、数值天气预报等等。

       29、求解线性方程组(Solving a system of linear equations)——线性方程组是数学中最古老的问题,它们有很多应用,比如在数字信号处理、线性规划中的估算和预测、数值分析中的非线性问题逼近等等。求解线性方程组,可以使用高斯—约当消去法(Gauss-Jordan elimination),或是柯列斯基分解( Cholesky decomposition)。

       30、Strukturtensor算法——应用于模式识别领域,为所有像素找出一种计算方法,看看该像素是否处于同质区域( homogenous region),看看它是否属于边缘,还是是一个顶点。

       31、合并查找算法(Union-find)——给定一组元素,该算法常常用来把这些元素分为多个分离的、彼此不重合的组。不相交集(disjoint-set)的数据结构可以跟踪这样的切分方法。合并查找算法可以在此种数据结构上完成两个有用的操作:

       查找:判断某特定元素属于哪个组。

       合并:联合或合并两个组为一个组。

       32、维特比算法(Viterbi algorithm)——寻找隐藏状态最有可能序列的动态规划算法,这种序列被称为维特比路径,其结果是一系列可以观察到的事件,特别是在隐藏的Markov模型中。

       以上就是Christoph博士对于最重要的算法的调查结果。你们熟悉哪些算法?又有哪些算法是你们经常使用的?

KNN算法-4-算法优化-KD树

       1. 搜索引擎营销 (SEM)

       搜索引擎营销(SEM)英文全称为Search Engine Marketing,意指通过搜索引擎进行服务和产品的营销。搜索引擎营销又主要分为两种:搜索引擎优化(SEO)和付费点击(PPC,Pay-Per- Click)。搜索引擎优化(SEO)指通过优化网站和页面并让它们在搜索结果的页面中展示,而付费点击(PPC)指通过购买搜索引擎的点击将用户带到自 己的网站。(通常)这些点击来自搜索结果页面中的“赞助商链接”(译注:显然不适用于百度)。

       2. 反向链接(Backlink)

       反向链接(Backlink)又称为“回指链接”“入链”和“简易链接”,指从其他网站指向你的网站的一个超级链接。反向链接之所以对SEO异常重要,是因为它们直接影响一个网页的页面等级(PageRank),以及这个页面在搜索结果中的排名。

       3. 页面等级(PageRank)

       页面等级( PageRank) 是Goolgle用来评估一个页面相对于其他页面的重要性的一个算法规则。这个算法规则最基本的意思就是说,如果A页面有一个链接指向B页面,那就可以看 作是A页面对B页面的一种信任或推荐。所以,如果一个页面的反向链接越多,再根据这些链接的价值加权越高,那搜索引擎就会判断这样的页面更为重要,页面等 级(PageRank)也就越高。

       4. 链接诱饵(饵链)(Linkbait)

       链接诱饵(Linkbait),顾名思义这是一个网站或一个博客上为了尽可能多地吸引反向链接(目的是提高网站的PR值)而存在的一段内容。通常,这些做 为诱饵的内容为文字内容,但也可以是一段视频、一张、一个测验或其他的热门的内容。最经典的诱饵内容的例子是“十大(Top 10)”,因为这样的内容在一些社交网站很容易流行起来成为热门话题(译注:这个话题貌似已经臭街了)。

       5. 互链车间或互链作坊(Link farm)

       互链工厂或互链作坊(Link farm)是指很多网站(通常数量很大)为了提高组成一个类似车间或作坊式的团体,通过彼此的互相链接来提高团体每一个的网站的页面评级的手段。早期,这种方法很有用,但现在已经成为一种不耻的作弊手段(并可能会收到惩罚)。

       6. 锚文本(Anchor text)

       锚文本(Anchor text)在反向链接中是指一个页面中可点击的文本,而其中的关键词对搜索引擎优化(SEO)有很大的帮助,因为Google会将这些关键词和你的内容关联起来。

       7. 链接属性-NoFollow

       Nofollow是网站管理员使用的一个链接属性,其目的是告诉搜索引擎他们并不是为该链接所指向的网站投票。这种链接也可能是网站用户自己创造的内容 (比如博客评论中的链接),或者是一个付费交易的链接(比如广告或赞助商的链接)。当Google识别到这些反向链接的NoFollow属性后,基本就不 会在页面评级和搜索结果排名的算法中将这些链接的贡献计算在内了。

       8. 链接修饰(Link Sculpting)

       链接修饰(Link Sculpting)是指网站管理员对网站上其他网站的反向链接进行属性设置。比如,管理员给链接添加Nofollow属性,这可以让管理员决定利用自己 的网站为具体某个网站提高页面评级,或者不帮助具体某个网站提高网页评级。不过,现在这种做法的作用已经微乎其微,因为Google已经决定要用自己的算 法来决定怎么处理链接的Nofollow属性。

       9. 页面标题(Title Tag)

       页面标题(Title Tag),顾名思义是指一个页面的标题中,这也是Google搜索算法中最重要的一个参考。理论上,你的页面标题要独一无二并尽可能多地包括页面内容中的关键词。你在浏览网页时可以从浏览器最上方看到一个网页的标题。

       10. 元标签(Meta Tags)

       元标签(Meta Tags)和页面标题一般,主要用于为搜索引擎提供更多关于你页面内容的信息。元标签位于HTML代码的头部,还有就是对长眼睛的访客是不可见的。

       11. 搜索算法(Search Algorithm)

       Google的搜索算法是为了给每一次搜索请求找到最为相关的网站和页面而设定。这个算法考量的因素超过200种(谷歌自称),其中包括页面等级、标题、元标签、网站内容,以及域名的年龄等。

       12. 搜索结果页面(SERP)

       搜索结果页面(SERP)的英文全称为Search Engine Results Page.基本上,这就是你平时在Google键入关键词回车后的页面了。你的网站从这个页面得到的流量取决于你的网站在搜索结果中的排名等级。

       13. 沙盒(Sandbox)

       Google除了所有网站的索引之外,还有一个单独的索引沙盒,那里面是新近发现和收录的网站。当你的网站存在这个沙盒之中时,它就不会在一般的搜索结果中出现,而只有当Google确认了你的网站是合法的,这才会将其从沙盒中移出进入所有网站的索引。

       14. 关键词密度(Keyword Density)

       如何判断一个特定页面的关键词密度?你只要将一个关键词使用的次数除以页面的总词数就可以了。关键词密度过去是搜索引擎优化中非常重要的一个因素,因为早期的搜索算法对此十分看重,但现在已经时过境迁了。

       15.关键词堆积(Keyword Stuffing)

       因为早期搜索算法对关键词密度非常看重,站长们便通过使用人工堆积关键词的手法来作弊和蒙骗搜索引擎。这种手法就叫做关键词堆积,当然现在已经没用了,而且你还可能会因此受到惩罚。

       16. 障眼法(Cloaking)

       障眼法(Cloaking)是指利用代码在同一个页面上让机器人和真人看到不一样的内容。其目的是为了让页面通过关键词而提升页面评级,而真正的目的是推销和出售各种不相关的产品或服务。当然,这也是一种作弊的手段,有很大可能会受到搜索引擎惩罚,甚至剔除。

       17. 网络爬虫或网络蜘蛛(Web Crawler)

       网络爬虫或网络蜘蛛(Web Crawler)也简称为爬虫或蜘蛛,代表搜索引擎在网路上进行浏览,目的是发现新的链接和页面,这是进行索引的第一个环节。

       18. 复制内容(Duplicate Content)

       复制内容(Duplicate Content)也叫“重复内容”,通常是指一个页面在引用了站内或站外的大段实质内容,或者是存在完全相同和极其相似的情况,而这也是一个网站应该尽量避免发生的情况,否则很容易让你的网站受到惩罚。

       19. 标准链接(Canonical URL)

       标准链接(Canonical URL)是指一个网页的链接要符合规范和标准。

       20. 机器人协议(Robots.txt)

       机器人协议(Robots.txt)不过是一个TXT文本文件,存在于你域名根目录之下,作用是将网站的目录结构信息告诉爬虫和蜘蛛,并限制其对特定文件夹和内容的访问,或者是完全将它们关在门外。

       KNN算法的重要步骤是对所有的实例点进行快速k近邻搜索。如果采用线性扫描(linear scan),要计算输入点与每一个点的距离,时间复杂度非常高。因此在查询操作时,可以使用kd树对查询操作进行优化。

        Kd-树是K-dimension tree的缩写,是对数据点在k维空间(如二维(x,y),三维(x,y,z),k维(x1,y,z..))中划分的一种数据结构,主要应用于多维空间关键数据的搜索(如:范围搜索和最近邻搜索)。本质上说,Kd-树就是一种平衡二叉树。

        k-d tree是每个节点均为k维样本点的二叉树,其上的每个样本点代表一个超平面,该超平面垂直于当前划分维度的坐标轴,并在该维度上将空间划分为两部分,一部分在其左子树,另一部分在其右子树。即若当前节点的划分维度为d,其左子树上所有点在d维的坐标值均小于当前值,右子树上所有点在d维的坐标值均大于等于当前值,本定义对其任意子节点均成立。

        必须搞清楚的是,k-d树是一种空间划分树,说白了,就是把整个空间划分为特定的几个部分,然后在特定空间的部分内进行相关搜索操作。想像一个三维(多维有点为难你的想象力了)空间,kd树按照一定的划分规则把这个三维空间划分了多个空间,如下图所示:

        首先,边框为红色的竖直平面将整个空间划分为两部分,此两部分又分别被边框为绿色的水平平面划分为上下两部分。最后此4个子空间又分别被边框为蓝色的竖直平面分割为两部分,变为8个子空间,此8个子空间即为叶子节点。

        常规的k-d tree的构建过程为:

        对于构建过程,有两个优化点:

        例子:采用常规的构建方式,以二维平面点(x,y)的集合(2,3),(5,4),(9,6),(4,7),(8,1),(7,2) 为例结合下图来说明k-d tree的构建过程:

        如上算法所述,kd树的构建是一个递归过程,我们对左子空间和右子空间内的数据重复根节点的过程就可以得到一级子节点(5,4)和(9,6),同时将空间和数据集进一步细分,如此往复直到空间中只包含一个数据点。

        如之前所述,kd树中,kd代表k-dimension,每个节点即为一个k维的点。每个非叶节点可以想象为一个分割超平面,用垂直于坐标轴的超平面将空间分为两个部分,这样递归的从根节点不停的划分,直到没有实例为止。经典的构造k-d tree的规则如下:

        kd树的检索是KNN算法至关重要的一步,给定点p,查询数据集中与其距离最近点的过程即为最近邻搜索。

        如在构建好的k-d tree上搜索(3,5)的最近邻时,对二维空间的最近邻搜索过程作分析。

        首先从根节点(7,2)出发,将当前最近邻设为(7,2),对该k-d tree作深度优先遍历。

        以(3,5)为圆心,其到(7,2)的距离为半径画圆(多维空间为超球面),可以看出(8,1)右侧的区域与该圆不相交,所以(8,1)的右子树全部忽略。

        接着走到(7,2)左子树根节点(5,4),与原最近邻对比距离后,更新当前最近邻为(5,4)。

        以(3,5)为圆心,其到(5,4)的距离为半径画圆,发现(7,2)右侧的区域与该圆不相交,忽略该侧所有节点,这样(7,2)的整个右子树被标记为已忽略。

        遍历完(5,4)的左右叶子节点,发现与当前最优距离相等,不更新最近邻。所以(3,5)的最近邻为(5,4)。

        举例:查询点(2.1,3.1)

        星号表示要查询的点(2.1,3.1)。通过二叉搜索,顺着搜索路径很快就能找到最邻近的近似点,也就是叶子节点(2,3)。而找到的叶子节点并不一定就是最邻近的,最邻近肯定距离查询点更近,应该位于以查询点为圆心且通过叶子节点的圆域内。为了找到真正的最近邻,还需要进行相关的‘回溯'操作。也就是说,算法首先沿搜索路径反向查找是否有距离查询点更近的数据点。

        举例:查询点(2,4.5)

        一个复杂点了例子如查找点为(2,4.5),具体步骤依次如下:

        上述两次实例表明,当查询点的邻域与分割超平面两侧空间交割时,需要查找另一侧子空间,导致检索过程复杂,效率下降。

        一般来讲,最临近搜索只需要检测几个叶子结点即可,如下图所示: 

        但是,如果当实例点的分布比较糟糕时,几乎要遍历所有的结点,如下所示:

        研究表明N个节点的K维k-d树搜索过程时间复杂度为: 。

        同时,以上为了介绍方便,讨论的是二维或三维情形。但在实际的应用中,如SIFT特征矢量128维,SURF特征矢量64维,维度都比较大,直接利用k-d树快速检索(维数不超过20)的性能急剧下降,几乎接近贪婪线性扫描。假设数据集的维数为D,一般来说要求数据的规模N满足N?2D,才能达到高效的搜索。

        Sklearn中有KDTree的实现,仅构建了一个二维空间的k-d tree,然后对其作k近邻搜索及指定半径的范围搜索。多维空间的检索,调用方式与此例相差无多。

       好了,关于“搜索优化算法”的话题就讲到这里了。希望大家能够通过我的讲解对“搜索优化算法”有更全面、深入的了解,并且能够在今后的工作中更好地运用所学知识。