算法

第二章 利用用户数据

天涯浪子 提交于 2020-01-06 23:21:01
文章目录 第二章 利用用户数据 2.1 用户行为数据简介 2.2 用户行为分析 2.4 基于邻域的算法 基于用户的协同过滤 基于物品的协同过滤 2.5 隐语义模型(Latent factor model) 2.6 基于图的模型 第二章 利用用户数据 基于用户行为分析的推荐算法称作 协同过滤 算法 2.1 用户行为数据简介 用户行为数据最简单的存在形式是 日志 . 用户行为按反馈的明确性分为 显性反馈行为 和 隐性反馈行为 .如果按反馈的方向还可以分为 正反馈 和 负反馈 . 一个用户行为可以用6部分表示: 产生行为的用户,行为的对象,行为的种类,产生行为的上下文,行为的内容和权重. 按照反馈的明确性分,可分为显性反馈和隐性反馈 正反馈(用户喜欢该商品)和负反馈(用户不喜欢该商品) 2.2 用户行为分析 互联网上的很多数据分布都满足 长尾分布f(x)=ax^k ,也就是少部分物品占据了大多数出现次数 用户行为数据同时也满足长尾分布的规律,即物品流行度和用户活跃度均满足长尾分布。(物品流行度指对物品产生过行为的用户总数。用户活跃度指用户产生过行为的物品总数。)用公式表达即: fi(k)为被k个用户产生过行为的物品数;fu(k)为对k个物品产生过行为的用户数。 用户越活跃,越趋向于浏览冷门的物品. 学术界对协同过滤算法进入了深入研究,提出了很多方法,比如基于邻域的方法、隐含义模型

《基本图形反走样绘制算法的改进研究》笔记(简)

丶灬走出姿态 提交于 2020-01-06 21:00:30
关于反走样,这篇硕士论文进行了总结和创新。创新部分没有代码,我也没有验证这篇论文的创新点,因此摘录下其总结部分。 《绪论》 国内外研究现状中,包含了基本图形(直线、圆、椭圆)的反走样绘制现状和二维裁剪的现状。 论文的研究内容与创新点,点明文章将从以下3点创新: a、利用DDA和Wu算法测增量思路,以及Wu算法的思想利用距离进行颜色分配思想,根据计算机浮点数的内部格式,用整数补码表示平移后的斜率(增量)小数部分(32 位定点小数),将画点位置的计算与颜色分配比例的计算合为一体,将这两个参数的计算在绘制循环中减少到一个判断,和 0~1 个自增或自减计算。颜色分配的精度达到 2的32次幂。并用 32 位整数以向量运算方式计算颜色分量与背景合成的颜色值,加快了颜色计 算的速度。 b、(圆)求解坐标的时候利用级数展开,避免开放和实数运算,快并且误差小。(这块我验证了下计算误差,级数展开计算的结果与用浮点表示的变量直接开放的结果基本不会影响图形的绘制精度,误差没有明显的减小。如果可以提升速度,该方法还是可以借鉴的) c、矩形裁剪算法可快速绘制。 《图元反走样绘制与裁剪的相关理论知识》 1、经典直线绘制及反走样算法 DDA算法 目前最简单的直线扫描转换方法是数字微分算法 (digital different analyzer), 简称 DDA 算法。下图是斜率m大于0小于1时的绘制步骤

聊聊一致性hash算法的原理

纵饮孤独 提交于 2020-01-06 20:03:49
https://mp.weixin.qq.com/s/BnErT5xrPpq76A4qUEyQCw 工程师经常使用服务器的集群来设计和实现数据缓存,他们常见的策略是: 1:不管是添加,删除和查询数据,都是先将数据的id通过hash函数生成一个hash值,记为key。 2:如果有N台机器,则会计算key%N的值,这个值就是所属机器的编号,无论是添加,删除和查询数据,都是在这台机器上操作。 请分析上面的策略存在的问题,并提出解决的方案。 2 解答 1:首先来想下在什么情况下会产生问题。一般情况下,在不增加机器的情况下,产生的hash值相同,那么就会在某一台机器上操作,不会产生什么问题,但是如果增加或者删除了机器,即N变化的时候,代价就会比较高,所有的数据都需要根据id重新计算一次hash值,并通过hash值对新的机器进行重新取模操作,然后对数据进行大规模的迁移。 2:那么为了解决这些问题,我们就引入了一致性hash算法,这是一种很好的数据缓存解决方案。 假设通过id生成的hash值是0到(2^32)-1 的范围,那么我们可以想象成一个闭合的圆,一个数据id计算出的hash值就是对应圆中的某一个位置,如图所示 当采用一致性哈希算法,把分布式集群中新的机器加入。其原理是通过使用与对象存储一样的Hash算法将机器也映射到圈中

案例分析:设计模式与代码的结构特性

。_饼干妹妹 提交于 2020-01-06 01:04:00
策略模式 定义一系列的算法,并将每一种算法封装起来,之后让它们之间可以相互替换使用。让算法独立于使用它的用户而自我变化是策略模式的主要功能。使用策略模式的系统提供不同算法实现的接口以及对算法的增删改查等功能的实现,最重要的是对各种算法实现封装,此类系统多是算法决策系统,由用户决定使用哪个算法。以我家楼下新开的火锅店的开业大酬宾优惠活动为应用场景,该活动有三种优惠方法:85折,满300减50,满500减100。 一、实现要求 1)需要一个总体类保存当前选择的策略,之后调用对应的具体算法。 2)可以随时改变当前策略。 3)每一种条件分支作为一个策略对应的算法单独实现。 二、实现步骤 1)创建策略接口 2)创建具体策略 3)创建上下文环境 4)展示消费者的消费实例 三、设计原则 1)“开-闭”原则 类可以扩展但不能修改,即开放拓展关闭修改,一个好的软件系统应该能在不修改代码的情况下扩展它的功能。实现该原则的关键是抽象化。 2)单一职责原则 一个类应该只有一个引起它变化的原因,即不能把变化原因各不相同的职责放在一起,因为不同的变化会影响到不相干的职责。 四、Demo 1)抽象策略类 class Strategy(object): def get_cash(self, cash): pass 2)具体策略类 # 具体策略类之85折子类class Charge(Strategy): def _

【1】KNN(K-nearest neighbors algorithm)

隐身守侯 提交于 2020-01-05 15:09:08
基本原理 KNN算法又叫最近邻居法,是一种非常简单易于掌握的分类算法。 其基本原理是,存在一个已知标签的数据集合,也就是训练样本集。 这个样本集中的每一个数据所属的分类都是已知的。 当一个没有标签的新数据需要确定自己属于哪个分类的时候, 只需要把新数据的每个特征和训练集中的每个数据的特征进行比较, 找出其中和新数据最相似(最近邻)的k个数据, 算法取这k个数据中出现次数最多的标签作为新数据的类别。 通常k不大于20。 代码实现 假如现在又四个已知点 , [ 1.0 , 1.1 ], [ 1.0 , 1.0 ], [ 0 , 0 ], [ 0 , 0.1 ], 类别标签分别是A、A、B、B 如果给定一个新的点[0, 0],那么怎么判断它属于A还是B呢? 按照KNN算法原理,需要执行以下操作: 计算训练集中各点与当前点之间的距离(本文采用最经典的欧式距离) 计算训练集中各点与当前点之间的距离(本文采用最经典的欧式距离) 按照距离递增次序对各点排序 选取与当前点距离最小的k个点 确定前k个点所在类别的出现频率 返回前k个点出现频率最高的类别,即为分类结果。 以下代码实现了KNN算法的分类过程 # 创建训练数据集def creatDataSet(): group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]]) labels = ['A

快速排序(递归及非递归算法源码)

隐身守侯 提交于 2020-01-05 05:38:38
1、 递归算法: quicksort.cpp #include <iostream> using namespace std; void Swap(int a[],int i,int j) { int temp=a[i]; a[i] = a[j]; a[j] = temp; } int Partition(int a[],int low, int high) { int pivot=a[low]; while(low<high) { while(low<high && a[high]>pivot) high--; Swap(a,low,high); while(low<high&& a[low]<=pivot) low++; Swap(a,low,high); } return low; } int QuickSort(int a[],int low, int high) { int pivot; if (low<high) { pivot =Partition(a,low,high); QuickSort(a,low,pivot-1); QuickSort(a,pivot+1,high); } return 0; } int main() { int a[]={4,3,6,9,7,5,1,10,2,15,8,7,6}; QuickSort(a,0,sizeof(a)/sizeof

rmq算法,利用倍增思想

非 Y 不嫁゛ 提交于 2020-01-05 04:00:36
RMQ问题ST算法 /* RMQ(Range Minimum/Maximum Query)问题: RMQ问题是求给定区间中的最值问题。当然,最简单的算法是O(n)的,但是对于查询次数很多(设置多大100万次),O(n)的算法效率不够。可以用线段树将算法优化到O(logn)(在线段树中保存线段的最值)。不过,Sparse_Table算法才是最好的:它可以在O(nlogn)的预处理以后实现O(1)的查询效率。下面把Sparse Table算法分成预处理和查询两部分来说明(以求最小值为例)。 预处理 : 预处理使用DP的思想,f(i, j)表示[i, i+2^j - 1]区间中的最小值,我们可以开辟一个数组专门来保存f(i, j)的值。 例如,f(0, 0)表示[0,0]之间的最小值,就是num[0], f(0, 2)表示[0, 3]之间的最小值, f(2, 4)表示[2, 17]之间的最小值 注意, 因为f(i, j)可以由f(i, j - 1)和f(i+2^(j-1), j-1)导出, 而递推的初值(所有的f(i, 0) = i)都是已知的 所以我们可以采用自底向上的算法递推地给出所有符合条件的f(i, j)的值。 查询 : 假设要查询从m到n这一段的最小值, 那么我们先求出一个最大的k, 使得k满足 2^k <= (n - m + 1). 于是我们就可以把[m, n]分成两个

算法笔记 26045 Problem E 习题6-13 字符串比较

萝らか妹 提交于 2020-01-04 20:40:54
问题 E: 习题6-13 字符串比较 时间限制: 1 Sec 内存限制: 12 MB 题目描述 比较两个字符串s1和s2的大小,如果s1>s2,则输出一个正数;若s1=s2,则输出0;若s1<s2,则输出一个负数。 要求:不用strcpy函数;两个字符串用gets函数读入。 例如:“A"与"C"相比,由于"A”<“C”,应输出负数,同时由于"A"与"C"的ASCII码差值为2,因此应输出"-2"。 同理:"And"和"Aid"比较,根据第2个字符比较的结果,“n"比"i"大5,因此应该输出"5” 输入 输入2行字符串 输出 一个整数,表示这两个字符串 比较的差值,单独占一行。 样例输入 And Aid 样例输出 5 # include <stdio.h> # include <string.h> int main ( ) { char a [ 20 ] , b [ 20 ] ; gets ( a ) ; gets ( b ) ; int c = strcmp ( a , b ) ; printf ( "%d" , c ) ; return 0 ; } 来源: CSDN 作者: ZOE_ZHU 链接: https://blog.csdn.net/qq_41913876/article/details/103836920

操作系统-处理机调度与死锁

五迷三道 提交于 2020-01-04 14:47:15
第三章 处理机调度与死锁 summary:In a multiprogramming environment,there are more processes in memory than there are processors.This requires the system to be able to dynamically assign processors to a process in a ready state to execute according to some algorithm.The task of assigning a processor is done by the processor scheduler. *调度层次算法目标 高级调度, 作业 调度,决定外存上处于后备队列中的哪几个队列中的哪几个作业调入内存;低级调度, 进程 调度,决定就绪队列中的哪几个进程获得处理机;中级调度, 内存 调度,存储器中管理的对换功能;资源利用率(处理机和资源处于忙碌状态),公平性(时间相对公平,无进程饥饿),平衡性(进程种类,计算型与I/O型),策略强制执行;相应时间快,均衡性,截至时间的保证(开始执行的最迟时间,完成的最迟时间),可预测性(连续,实时) *作业与作业调度 作业(程序,数据,作业说明书),作业步(每一个对作业加工步骤);作业控制块PCB