算法

怎样为产品选择更为合适的推荐算法

房东的猫 提交于 2020-01-18 00:28:36
常见推荐机制/算法 基础推荐机制 机制 应用场景 原理概述 内容推荐 适用于冷启动 基于内容的协同过滤 数据量较大 判断内容相似度,相似度高的内容;播放内容A的用户,也会对内容B感兴趣 基于用户的协同过滤 数据量较大,但数据量越大可信度越低 把数据代入专门计算相似度的公式,获得不同用户(二者)口味的相似度;推测相似度高的用户,喜好的内容也类似,进而可以相互推荐 基于标签的推荐 适用于冷启动 协同过滤的风险 协同过滤技术在个性化推荐初期具有较好的效果,但随着产品结构、内容复杂度和用户人数的不断增加,协同过滤技术的缺点也一点一点的暴露出来了。 稀疏性(sparity) 大多数推荐系统中,每个用户涉及的信息量较为有限;用户数据最多不过评估到了百分分之一,造成评估矩阵数据相当稀疏,增加寻找相似用户集的难度,导致推荐效果大大降低 扩展性(scalability) “最近邻居”算法的计算量虽则用户和项的增加而大大增加,对于百万之巨的数目,通常的算法将遭遇严重的扩展性问题 精确性(accuracy) 寻找相近用户来产生推荐集,在数据量较大的情况下,推荐的可信度也会降低 经典算法 算法 应用机制 原理概述 topN 基础算法 1、直接用List的sort方法进行排序处理 2、使用排序二叉树进行排序,然后取出前N名 3、使用最大堆排序,然后取出前N名 矩阵算法 基础算法

高并发的场景下,不能不说的限流算法

旧巷老猫 提交于 2020-01-17 23:38:51
先举个例子,说明为什么要做“限流”。 旅游景点通常都会有最大的接待量,不可能无限制的放游客进入,比如故宫每天只卖八万张票,超过八万的游客,无法买票进入,因为如果超过八万人,景点的工作人员可能就忙不过来,过于拥挤的景点也会影响游客的体验和心情,并且还会有安全隐患; 只卖 N 张票,这就是一种限流的手段。 软件架构中的限流 软件架构中的限流也是类似,也是当系统资源不够的时候,已经不足以应对大量的请求,为了保证服务还能够正常运行,那么按照规则,系统会把多余的请求直接拒绝掉,以达到限流的效果; 对外限流:用户过多,或因为某个活动或热点问题引发的访问量的增加;恶意攻击,或被爬虫抓取数据等等。不知道大家注意过没有,比如双11,刚过12点有些顾客的网页或APP会显示下单失败的提示,有些就是被限流掉了。 对内限流:大部分公司,系统和系统之间都会相互调用,假如 A 系统 被 X、Y、Z 三个系统调用,当 X 系统的访问量徒增,导致 A 系统被调的挂掉了,那么会导致 Y、Z 系统也无法正常使用(依赖于 A 系统)。 计数器法 计数器法的原理就是限制单位时间内的处理请求数不超过阈值。 比如一个接口一分钟可以处理 1000 次请求,那么可以设置一个计数器,当有一次请求过来,计数器就加 1,如果一分钟以内计数器超过了 1000,那么后面再过来的请求就不再处理; 但是这个方法的缺点也很明显

2D地图擦除算法

你离开我真会死。 提交于 2020-01-17 22:43:00
.  关于2D地图擦除算法,去年我写过一个实现,勉强实现了地形擦除,但跟最终效果还相差甚远,这次我写了一个完整的实现,在此记录,留个印象。 .  去年的版本 <<算法 & 数据结构——裁剪多边形>> ,因为受限于当时框架用GDI实现的渲染器,只有擦除地形没有擦除地图,这次换了OpenGL渲染器,终于可以实现最终效果了。 这个算法看似简单,实际上就是很简单,大致可分为三个部分。 地图擦除:擦除地图的图像,产生视觉效果。 地形擦除:擦除地图的形状,用于物理计算。 橡皮擦:用于定义擦除的形状。 地图擦除 假设这是一副画在纸上的彩笔画,如果要擦除画上的一部分,有过生活经验的人立马就能想到用橡皮擦就好了,很多算法灵感来自生活,生活多姿多彩的人适合做程序员。这个实现过程大概就是:绑定地图到当前渲染目标,渲染“橡皮擦”让其覆盖范围内的像素,从而达到擦除效果。 橡皮擦 接着上一个环节,“橡皮擦”可以是从文件读取的一张图,也可以是程序生成的一张图。如果从文件读取,设置合适的BlendFunc,直接渲染覆盖像素颜色就行了,本例使用程序生成的图,因为这个灵活度更高。 这是一个正10边形的“橡皮擦”,从图中可看出,里面有几条线,把正10边形分割成了8个三角形,这8把三角形的面积和形状等于这个正10边形,如果你困惑为什么要切成三角形,你运气很好,有一个大佬刚好懂你的困惑,并为你量身定做了一篇答案 <<算法

LVS负载均衡工作模式和调度算法

给你一囗甜甜゛ 提交于 2020-01-17 21:36:01
原文链接: https://blog.csdn.net/weixin_40470303/article/details/80541639 一、LVS简介 LVS(Linux Virtual Server)即Linux虚拟服务器,是由章文嵩博士主导的开源负载均衡项目,目前LVS已经被集成到Linux内核模块中。该项目在Linux内核中实现了基于IP的数据请求负载均衡调度方案,其体系结构如图1所示,终端互联网用户从外部访问公司的外部负载均衡服务器,终端用户的Web请求会发送给LVS调度器,调度器根据自己预设的算法决定将该请求发送给后端的某台Web服务器,比如,轮询算法可以将外部的请求平均分发给后端的所有服务器,终端用户访问LVS调度器虽然会被转发到后端真实的服务器,但如果真实服务器连接的是相同的存储,提供的服务也是相同的服务,最终用户不管是访问哪台真实服务器,得到的服务内容都是一样的,整个集群对用户而言都是透明的。最后根据LVS工作模式的不同,真实服务器会选择不同的方式将用户需要的数据发送到终端用户,LVS工作模式分为NAT模式、TUN模式、以及DR模式。 二、三种工作模式的解析。 1、基于NAT的LVS模式负载均衡 NAT(Network Address Translation)即网络地址转换,其作用是通过数据报头的修改,使得位于企业内部的私有IP地址可以访问外网

mysql调优之索引——ORDER BY(GROUP BY)

别说谁变了你拦得住时间么 提交于 2020-01-17 19:03:45
order by 的排序优化 1、 ORDER BY 子句尽量使用index方式排序,避免使用filesort方式排序。 2、ORDER BY 满足两种方式会使用index方式排序: order by使用索引最左前列 使用where 子句与order by 子句条件列组合满足索引最左前列 3、如果不在索引列上,filesort有两种算法,mysql就要启动双路和单路排序. 双路排序 (1)mysql4.1之前是使用双路排序,两次扫描磁盘,最终得到数据,读取行指针和order by列,对他们进行排序,然后扫描已经排好序的列表,按照列表中的值重新从数据库列表中读取对应的数据输出。 (2)从磁盘读取字段,在buffer中进行排序,再从磁盘取其他字段。 (3)取一批数据,要扫描两次磁盘,进行两次I/O操作,由于I/O操作很耗时,索引在4.1之后采用另一种算法,单路排序。 单路排序 从磁盘中读取查询所需要的列,按照order by列在buffer进行排序,然后扫描排序后的列表进行输出,它的效率更高一点,避免了第二次读取数据。并且随机I/O变成了顺序I/O,但是它会使用更大的内存空间,因为它把数据都保存在内存当中。 注意 在sort buffer中,单路排序比双路排序使用了更多的内存空间,因为单路排序把所有字段都取出,所有有可能导致取出的数据总大小超出sort_buffer的容量

图解kubernetes scheduler基于map/reduce模式实现优选阶段

只愿长相守 提交于 2020-01-17 18:11:50
优选阶段通过分map/reduce模式来实现多个node和多种算法的并行计算,并且通过基于二级索引来设计最终的存储结果,从而达到整个计算过程中的无锁设计,同时为了保证分配的随机性,针对同等优先级的采用了随机的方式来进行最终节点的分配,如果大家后续有类似的需求,不妨可以借鉴借鉴 1. 设计基础 1.1 两阶段: 单点与聚合 在进行优选的时候,除了最后一次计算,在进行针对单个算法的计算的时候,会分为两个阶段:单点和聚合 在单点阶段,会根据当前算法针对单个node计算 在聚合阶段,则会根据当前单点阶段计算完成后,来进行聚合 1.2 并行: 节点与算法 单点和聚合两阶段在计算的时候,都是并行的,但是对象则不同,其中单点阶段并行是针对单个node的计算,而聚合阶段则是针对算法级别的计算,通过这种设计分离计算,从而避免多goroutine之间数据竞争,无锁加速优选的计算 1.3 map与reduce 而map与reduce则是针对一个上面并行的两种具体实现,其中map中负责单node打分,而reduce则是针对map阶段的打分进行聚合后,根据汇总的结果进行二次打分计算 1.4 weight map/reduce阶段都是通过算法计算,如果我们要进行自定义的调整,针对单个算法,我们可以调整其在预选流程中的权重,从而进行定制自己的预选流程 1.5 随机分布 当进行优先级判断的时候

AI初探

Deadly 提交于 2020-01-17 15:37:32
看东西应该记笔记,不然如过眼云烟,如只逛商场,不买东西,不留下带走什么,就是浪费时间,没有收获,仅此开始,定期梳理看过的东西。 人工智能的目的是什么呢? 答:让机器表现得更像人类,甚至在某些技能上超越人类。 为了达到这个目的,人工智能必须“会思考”,而它的思考便涵盖了以智能方式解决计算难题的技术和方法。听起来有点抽象。举几个例子:搜索--找出两城之间最快的往返,规划--让机器人自动导航并达成给定目标...... 当然,人工智能的能力到底强不强,得看两个条件: 算法和计算能力 。 算法到底多牛逼(你可以理解为机器思考问题的方式有多牛逼),计算能力有多高(你可以理解为为机器思考提供的供血、蛋白质等后勤保障),这两个条件直接决定了你所搞的人工智能到底有多强。 我们人类只要把算法和计算能力保证了,别的就不用管了,机器它自己就会学习。 机器是怎么自主学习呢? 答:通过学习已有的标注数据来解决问题,而并不需要把规则硬编码到算法中。 还是太抽象,让我举例来说明吧。 比如,开发一个系统,让这个系统来识别图片中的猫和狗。为了实现,我们只须往已设定好的算法中,放入大量猫和狗的图片,就可以睡觉去了。等机器看完这海量的图片,它自己就认得,什么是猫,什么狗。 那什么又是深度学习呢? 深度学习属于机器学习,不过更复杂。它类似给机器装了一个大脑,这个大脑里也有由大量的神经元组成的多层系统

算法工程师耗尽心血终成TensorFlow深度学习应用实践,值得一学!

a 夏天 提交于 2020-01-17 14:28:40
本篇总的指导思想是在掌握深度学习的基本知识和特性的基础上,培养使用TensorFlow进行实际编程以解决图像处理相关问题的能力。全篇力求深入浅出,通过通俗易懂的语言和详细的程序分析,介绍TensorFlow的基本用法、高级模型设计和对应的程序编写。 本篇强调理论联系实际,重点介绍TensorFlow编程解决图像识别的应用,提供了大量数据集,并以代码的形式实现了深度学习模型,以供读者参考。 本篇可作为学习人工神经网络、深度学习TensorFlow 程序设计以及图像处理等相关内容的程序设计人员学习。 **本篇共22章,内容包括Python类库的安装和使用、TensorFlow 基本数据结构和使用、TensorFlow 数据集的创建与读取、人工神经网络、反馈神经网络、全卷积神经网络的理论基础、深度学习模型的创建、模型的特性、算法、ResNet、 Slim、 GAN等。 由于细节内容实在是太多了,所以小编只把部分知识点截图出来粗略的介绍,每个小节都有更加细化的内容,希望大家能够从中得到真谛!** 第1章介绍深度学习的基本内容,初步介绍深度学习应用于计算机视觉和发展方向,介绍使用深度学习解决计算机视觉问题的应用前景,旨在说明使用深度学习和人工智能实现计算机视觉是未来的发展方向,也是必然趋势。 第2章介绍Python的安装和最常用的类库。Python语言是易用性非常强的语言

快速幂算法

ⅰ亾dé卋堺 提交于 2020-01-17 13:59:33
大数模幂运算的缺陷: 快速幂取模算法的引入是从大数的小数取模的朴素算法的局限性所提出的,在朴素的方法中我们计算一个数比如5 1003 %33是非常消耗我们的计算资源的,在整个计算过程中最麻烦的就是我们的5 1003 这个过程 **缺点1:**在我们之后计算指数的过程中,计算的数字不断增大,非常的占用我们的计算资源(主要是时间,其次是空间)。 **缺点2:**我们计算的中间过程数字过于大,现有的计算机是没有办法记录这么长的数据的。 朴素算法: 如上所述,在要求算出一个数字的n次幂时,我们最容易想到的便是循环累乘: int normalPower ( int base , int exponent ) { while ( exponent > 0 ) { base * = base ; -- exponent ; } return base ; } 这种方法的时间复杂度为O(N); 快速幂算法 根据二进制的性质以及编程语言中方便的 与运算符&和 移位运算符>>,有人提出了快速幂的算法,其时间复杂度为O(logN)。 1.快速幂思想 计算 a b 这样一个数,我们指数b以转换二进制的形式进行分解,将其写成二进制中每一位乘上该位的权重(从右往左,第i位的权为2i-1)。 例如:a 13 =a 2 ^ 0+2 ^ 2+2 ^ 3 =a 2 ^ 0 a 2 ^ 2 a 2 ^ 3 2

Console-算法[for]-简单画图

孤街浪徒 提交于 2020-01-17 05:25:15
ylbtech-Arithmetic:Console-算法[for]-简单画图 1.A,案例 -- ======================================================== -- ylb:算法 -- Type:算法[for] -- munu:简单画图 -- 20:32 2012/3/16 -- ======================================================== 1.B,解决方案 using System; namespace ConsoleApplication2 { class Program { static void Main(string[] args) { //画图 int i; //表示行 int j; //表示列 for (i = 0; i < 3; i++) { for (j = 0; j < 6; j++) { Console.Write("*"); } Console.Write("\n"); } } } } 1.C,运行结果 ****** ****** ****** 请按任意键继续. . . 作者: ylbtech 出处: http://ylbtech.cnblogs.com/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明