关于算法:机器学习算法系列十一线性判别分析算法二Linear-Discriminant-Analysis-Algorithm

浏览本文须要的背景知识点:正态分布、线性判别分析、一丢丢编程常识 一、引言 后面一节介绍了根本的线性判别分析算法,最初留下了一个问题,咱们在应用sklearn失去的后果与上一节中本人实现的后果不同,这一节就来看看sklearn中通过概率分布的角度是如何实现线性判别分析的。 二、模型介绍一元正态分布 在介绍模型之前先来回顾一下一个在统计学中特地常见的散布——正态分布1(Normal distribution),同时也被称为高斯分布(Gaussian distribution),该散布是上面介绍模型的根底。 $$f(x ; \mu ; \sigma)=\frac{1}{\sigma \sqrt{2 \pi}} \exp \left(-\frac{(x-\mu)^{2}}{2 \sigma^{2}}\right)$$ 下面为一元正态分布的概率密度函数,其中 x 为一元随机变量, 为地位参数, 为尺度参数。 不同尺度参数的正态分布图示 多元正态分布 在机器学习中咱们的输出特色个别是多维的,多元正态分布的概率密度函数能够从一元正态分布的概率密度函数失去的。为了简略起见,假如随机变量之间是独立的,即相互之间不存在线性相关性。(1)随机变量之间互相独立,则联结概率密度函数为每一个随机变量的概率密度函数的乘积,其中x为p维(2)别离带入各个一元概率密度函数(3)将e的指数用z的平方来示意(4)z的平方能够写成向量矩阵的模式(5)察看两头的对角矩阵,用来示意该对角矩阵的逆矩阵(6)则z的平方能够简写成该式,x为特征向量,为均值向量。该表达式被称为马哈拉诺比斯间隔2(Mahalanobis distance),用于示意数据的协方差间隔(7)察看,的行列式为对角线上的元素相乘,开根号后为各的乘积,||示意的行列式(8)带入回多元正态分布的概率密度函数中,失去最终的模式 $$\begin{aligned}f(x) &=f\left(x_{1}\right) f\left(x_{2}\right) \ldots f\left(x_{p}\right) & (1)\\&=\frac{1}{\sigma_{1} \sigma_{2} \ldots \sigma_{p}(\sqrt{2 \pi})^{p}} \exp \left(-\frac{\left(x_{1}-\mu_{1}\right)^{2}}{2 \sigma_{1}^{2}}-\frac{\left(x_{2}-\mu_{2}\right)^{2}}{2 \sigma_{2}^{2}}-\cdots-\frac{\left(x_{p}-\mu_{p}\right)^{2}}{2 \sigma_{p}^{2}}\right) & (2)\\z^{2}&=\frac{\left(x_{1}-\mu_{1}\right)^{2}}{\sigma_{1}^{2}}+\frac{\left(x_{2}-\mu_{2}\right)^{2}}{\sigma_{2}^{2}}+\cdots+\frac{\left(x_{p}-\mu_{p}\right)^{2}}{\sigma_{p}^{2}} & (3)\\&=\left[\begin{array}{c}x_{1}-\mu_{1} \\x_{2}-\mu_{2} \\\cdots \\x_{p}-\mu_{p}\end{array}\right]^{T}\left[\begin{array}{cccc}\frac{1}{\sigma_{1}^{2}} & 0 & \cdots & 0 \\0 & \frac{1}{\sigma_{2}^{2}} & \cdots & 0 \\\vdots & \vdots & \ddots & \vdots \\0 & 0 & \cdots & \frac{1}{\sigma_{p}^{2}}\end{array}\right]\left[\begin{array}{c}x_{1}-\mu_{1} \\x_{2}-\mu_{2} \\\cdots \\x_{p}-\mu_{p}\end{array}\right] & (4)\\\Sigma&=\left[\begin{array}{cccc}\sigma_{1}^{2} & 0 & \cdots & 0 \\0 & \sigma_{2}^{2} & \cdots & 0 \\\vdots & \vdots & \ddots & \vdots \\0 & 0 & \cdots & \sigma_{p}^{2}\end{array}\right] & (5)\\z^{2}&=(x-\mu)^{T} \Sigma^{-1}(x-\mu) & (6)\\|\Sigma|^{\frac{1}{2}} &=\sigma_{1} \sigma_{2} \ldots \sigma_{p} & (7)\\f(x) &=\frac{1}{|\Sigma|^{\frac{1}{2}}(2 \pi)^{\frac{p}{2}}} \exp \left(-\frac{(x-\mu)^{T} \Sigma^{-1}(x-\mu)}{2}\right) & (8)\end{aligned}$$ ...

January 18, 2022 · 3 min · jiezi

关于算法:归并排序的扩展问题

归并排序的扩大:(左神算法笔记) 小和问题在一组数组中,每一个数右边比以后数小的数累加起来,叫作这个数组的小和。求一个数组的小和。例子:[1,3,4,2,5], 1右边比1小的数,没有; 3右边比3小的数,1; 4右边比4小的数,1,3; 2右边比2小的数,1; 5右边比5小的数,1,3,4,2; 所以该数组的小和是 1 + 1 + 3 + 1 + 1 + 3 + 4 + 2 = 16.public class SmallSum { static int smallSum(int[] arr) { if (arr == null || arr.length < 2) return 0; return process(arr, 0, arr.length - 1); } // 在arr[left,right]上既要排好序,又要求小和 private static int process(int[] arr, int left, int right) { if (left >= right) return 0; int mid = left + (right - left) / 2; return process(arr, left, mid) + process(arr, mid + 1, right) + merge(arr, left, mid, right); } private static int merge(int[] arr, int left, int mid, int right) { int[] help = new int[right - left + 1]; int i = 0, a = left, b = mid + 1; int res = 0; while (a <= mid && b <= right) { if (arr[a] < arr[b]) res += (right - b + 1) * arr[a]; help[i++] = arr[a] < arr[b] ? arr[a++] : arr[b++]; } while (b <= right) { help[i++] = arr[b++]; } while (a <= mid) { help[i++] = arr[a++]; } for (i = 0; i < help.length; i++) { arr[left + i] = help[i]; } return res; } public static void main(String[] args) { int[] arr = {1, 3, 4, 2, 5}; System.out.println(smallSum(arr)); }}逆序对问题在一个数组中,右边的数如果比左边的数大,则这两个数形成一个逆序对,输入数组中逆序对的总个数。 ...

January 18, 2022 · 2 min · jiezi

关于算法:二叉树递归套路判断二叉树是否是完全二叉树判断二叉树是否是平衡二叉树

二叉树的根本套路咱们曾经很相熟了,接下来咱们聊聊二叉树的递归套路,能够解决面试中绝大多数的二叉树问题,尤其是树型dp问题,其本质是利用递归遍历二叉树的便利性。 判断二叉树是否是齐全二叉树1、经典写法思路(1)某个节点有右孩子无左孩子,则肯定不是齐全二叉树 (2)当第一次遇到左右孩子不双全的节点时,当前遇到的节点都是叶节点 2、递归套路思路对于任意一颗子树,判断是否是齐全二叉树的条件(列出所有可能性) (1)左树是满的,右树是满的,左树高度 = 右树高度 (2)左树是齐全二叉树,右树是满的,左树高度 = 右树高度 + 1 (3)左树是满的,右树是满的,左树高度 = 右树高度 + 1 (4)左树是满的,右树是齐全二叉树,左树高度 = 右树高度 只有这4种状况二叉树才可能是齐全二叉树(当然也可能是满二叉树,满二叉树自身也是齐全二叉树) 也就是每次从左子树和右子树中咱们都须要 是否满二叉树、是否齐全二叉树、高度 三个数据,只管咱们最初只返回是否齐全二叉树,然而咱们须要高度、是否满来辅助咱们判断是否齐全二叉树,所以能够定义如下的Info类 public static class Info {    public boolean isFull;    public boolean isComplete;    public int height;    public Info(boolean isFull, boolean isComplete, int height) {        this.isFull = isFull;        this.isComplete = isComplete;        this.height = height;    }}3、递归套路代码(1)首先判断为空时好不好设置,此时是好设置的,节点为空时new Info(true, true, 0),即认为空节点是满二叉树、是齐全二叉树、高度为0。 (2)而后依据列出的所有可能性,编写递归套路的代码,因为要整个造成递归,所以每一步都要返回Info类,不然咋递归上来呢? 此步的外围套路就以下三步: 1)无脑获取左右子树的Info信息 2)依据左右子树拼凑本人的Info信息 3)返回本人的Info信息 /** * @author Java和算法学习:周一 */public static Info process(Node x) {    if (x == null) {        return new Info(true, true, 0);    }    // 获取左右子树    Info leftInfo = process(x.left);    Info rightInfo = process(x.right);    // 拼凑本人的信息    boolean isFull = leftInfo.isFull && rightInfo.isFull && leftInfo.height == rightInfo.height;    boolean isComplete = false;    if (leftInfo.isFull && rightInfo.isFull && leftInfo.height == rightInfo.height) {        // 左满,右满,高度相等        isComplete = true;    } else if (leftInfo.isComplete && rightInfo.isFull && leftInfo.height == rightInfo.height + 1) {        // 左齐全,右满,高度差1        isComplete = true;    } else if (leftInfo.isFull && rightInfo.isFull && leftInfo.height == rightInfo.height + 1) {        // 左满、右满,高度差为1        isComplete = true;    } else if (leftInfo.isFull && rightInfo.isComplete && leftInfo.height == rightInfo.height) {        // 左满、右齐全,高度相等        isComplete = true;    }    // 左右子树高度最大的加上本人的高度1,即是此节点的高度    int height = Math.max(leftInfo.height, rightInfo.height) + 1;    return new Info(isFull, isComplete, height);}(3)主函数调用递归办法获取后果 /** * 递归套路解法 * * @author Java和算法学习:周一 */public static boolean isCompleteBinaryTree2(Node head) {    if (head == null) {        return true;    }    return process(head).isComplete;}所有代码地址: https://github.com/monday-pro... 判断二叉树是否是均衡二叉树均衡二叉树定义:二叉树每个子树中,左树最大高度和右树最大高度差小于等于1。 1、递归套路思路剖析对于任意一个节点,满足以此节点为头的子树是均衡二叉树的条件(列出所有可能性) (1)左树是均衡二叉树 (2)右树是均衡二叉树 (3)左树高度、右树高度 差值小于等于1 满足这三个条件能力说以此节点为头的子树是均衡二叉树。 也就是每次从左子树和右子树中咱们都须要 是否均衡、高度 两个数据,只管咱们最初只返回是否均衡,然而咱们须要高度来辅助咱们判断是否均衡,所以能够定义如下的Info类 public static class Info{    public boolean isBalanced;    public int height;    public Info(boolean b, int h) {        this.isBalanced = b;        this.height = h;    }}2、递归套路代码(1)首先判断为空时好不好设置,此时也是好设置的,节点为空时new Info(true, 0),即认为空节点是均衡二叉树、高度为0。 (2)而后依据列出的所有可能性,编写递归套路的代码,因为要整个造成递归,所以每一步都要返回Info类。(拿到左右子树的Info、拼凑本人的Info、返回本人的Info) /** * 判断以某个节点为头的子树是否是均衡二叉树 * * @author Java和算法学习:周一 */public static Info process(Node x) {    if (x == null) {        return new Info(true, 0);    }    // 1.拿到左右子树的信息    Info leftInfo = process(x.left);    Info rightInfo = process(x.right);    // 2.拼凑我本人的信息    // 默认是均衡的    boolean isBalanced = true;    // 哪些状况会造成不均衡:1.左树不均衡 2.右树不均衡 3.左右子树的高度差大于1    if (!leftInfo.isBalanced || !rightInfo.isBalanced || Math.abs(leftInfo.height - rightInfo.height) > 1) {        isBalanced = false;    }    // 左右子树中最大高度,加上到本人的高度    int height = Math.max(leftInfo.height, rightInfo.height) + 1;    // 3.返回本人的信息    return new Info(isBalanced, height);}(3)主函数调用递归办法获取后果 /** * @author Java和算法学习:周一 */public static boolean isBalancedBinaryTree(Node head) {    if (head == null) {        return true;    }    return process(head).isBalanced;}所有代码地址: https://github.com/monday-pro... 是不是发现用递归套路来解霎时难度升高了许多,别急,二叉树的递归套路远不止这点,这才套路入门呢,前面还有好几篇介绍递归套路技巧的。

January 17, 2022 · 1 min · jiezi

关于算法:算法之使用Master-Theorem估算时间复杂度

遇到递归算法,通常有两个问题: 分析递归行为估算递归行为的工夫复杂度应用树状剖析图能够帮忙咱们分析递归行为。应用Master Theorem及其推论(也称主定理)能够不便的估算某些递归的工夫复杂度。这里次要针对第二个问题,如何针对某类递归,应用master公式估算工夫复杂度。 主定理先来看下公式以及论断:先了解公式外面每一项代表的意义:等号右边T(N)是母问题的数据量,规模为N。等号左边的T(N/b)是子问题的规模,子问题的规模是等量的,规模为N/b;系数a是子问题被调用的次数;O(N^d)是指除了子问题的递归调用之外,剩下的运算的工夫复杂度。满足以上形容的递归,能够应用主定理来估算工夫复杂度。 上面应用两个例子来训练一下。 例1写一个递归办法,来找到数组中的最大值。 static int findMax(int[] arr) throws IllegalArgumentException{ if (arr == null || arr.length == 0) throw new IllegalArgumentException("invalid."); if (arr.length == 1) return arr[0]; return recursion(arr, 0, arr.length - 1); } private static int recursion(int[] arr, int from, int to) { if (from == to) return arr[from]; int mid = from + (to - from) / 2; int left = recursion(arr, from, mid); int right = recursion(arr, mid + 1, to); return Math.max(left, right); }在下面的问题中,母问题总量是N,也就是数组的长度;递归函数中,子问题被调用了两次,也就是系数a=2,别离用来计算左半子数组和右半子数组的最大值,规模是等量的,都是是N/2;剩下的操作就是if判断,计算mid值,返回left和right较大值,这些操作的工夫复杂度是常数O(1)。齐全满足主定理的场景。T(N) = 2 * T(N/2) + O(N^0): a=2, b=2, d=0.log(b,a) = log(2,2) = 1 > d = 0, 所以用推论间接得出复杂度是T(N)=O(N). ...

January 17, 2022 · 2 min · jiezi

关于算法:明天开始好好学习E语言

今天开始好好学习E语言

January 16, 2022 · 1 min · jiezi

关于算法:算法之异或操作

异或操作0 ^ 0 = 00 ^ 1 = 11 ^ 0 = 11 ^ 1 = 0 异或操作能够看做无进位相加操作也就是两个数相加,然而只做加法,不进位。 1110101 ^1011011 ---------- 0101110运算定律0^a = a, a^a = 0满足交换律 a^b = b^a满足结合律 (a^b)^c = a^(b^c)一堆数异或,无论程序如何,后果雷同,其实就是下面的结合律。上面来看两道题: 例1数组中有一列数字,其中有一个数字a呈现了奇数次,其余的数字呈现的次数都是偶数次,求出数字a,要求工夫复杂度是O(n),空间复杂度是O(1)。 剖析:假如这列数字是aaabbccdddd,程序无所谓,把这些数字进行异或操作,依据第一个定律,两个雷同的数字进行异或后是0,反复呈现次数为偶数次的数进行异或后都是0,剩下的3个a,其中两个异或后也是0,剩下的就是a,所以也就是说把数组遍历一遍,进行异或操作,最终后果就是要求的数字a。 public static int getOddTimesNumber(int[] arr) { int res = 0; for (int i: arr) { res ^= i; } return res; }例2数组中有一列数字,其中有两个数字a和b呈现了奇数次(a≠b),其余的数字呈现的次数都是偶数次,求出数字a和b,要求工夫复杂度是O(n),空间复杂度是O(1)。剖析:1.把数组遍历一遍进行异或操作后,失去的后果记为eor,这个eor最终肯定是a^b。2.如果能找到一种办法把a或者b找进去,记为x,(假如x是a);那么eor^x就是b。 利用O(1)的空间,咱们是没法找的,记录频率必定空间不够哈。那么是否将两者辨别开呢?因为a和b不相等,所以eor不等于0,那么其二进制必定有某些地位是1,或者说至多有一位是1。那么a和b的二进制在这个地位处必定不一样(也就是说一个是1,一个是0),否则异或后eor的该地位肯定是0。利用这个察看到的法则,能够把数组中的数分成两组,a在一组数中,b在另外一组数中。这里设置为一个未解决的标记,咱们等会儿来解决。 咱们先来看一个位运算的例子:eor & (~eor + 1)eor取反加一,而后和本身进行与运算。来看看失去的后果是什么: 假如eor = 1001110001000eor: 1001110001000~eor=0110001110111+1 =0110001111000&eor:1001110001000= 0000000001000 失去的是最左边的1保留,其余位数变为0,这个后果记为rightZero,1的地位记为index.如何利用这个数字的个性来吧a和b辨别开来呢?看这个操作if ((x & rightZero) == rightZero) {...}数值x和rightZero进行与操作,就会把x的第index处保留,其余地位上革除为0。在判断语句中判断后果是否==rightZero就会查看x的index处是否为1。 ...

January 16, 2022 · 1 min · jiezi

关于算法:2133检查是否每一行每一列都包含全部整数-算法leetode附思维导图-全部解法300题

零 题目:算法(leetode,附思维导图 + 全副解法)300题之(2133)查看是否每一行每一列都蕴含全副整数一 题目形容 二 解法总览(思维导图) 三 全副解法1 计划11)代码: // 计划1 “哈希法(JS里的 Map数据结构 )”// 技巧:“波及数量、唯一性的,优先思考 哈希(JS里的Map数据结构)”。// 思路:// 1)状态初始化:map = new Map() 。// 2)外围1:遍历所有 行 ,看其是否 “蕴含从 1到n 的全副整数” 。// 2.1)每次遍历,均先 清空map 。// 2.2)遍历以后行的每一个元素。// 2.2.1)若 以后元素 已存在于 map ,则 阐明存在反复了、间接返回 false 。// 2.2.2)若 以后元素 不存在于 map ,则 将该元素放入 map 中。// 3)外围2:遍历所有 列 ,看其是否 “蕴含从 1到n 的全副整数” 。// 3.1)每次遍历,均先 清空map 。// 3.2)遍历当前列的每一个元素。// 3.2.1)若 以后元素 已存在于 map ,则 阐明存在反复了、间接返回 false 。// 3.2.2)若 以后元素 不存在于 map ,则 将该元素放入 map 中。// 4)行、列均满足条件,返回 true 。var checkValid = function(matrix) { // 1)状态初始化:map = new Map() 。 const l = matrix.length; let map = new Map(); // 2)外围1:遍历所有 行 ,看其是否 “蕴含从 1到n 的全副整数” 。 for (let i = 0; i < l; i++) { // 2.1)每次遍历,均先 清空map 。 map.clear(); // 2.2)遍历以后行的每一个元素。 for (let j = 0; j < l; j++) { const tempVal = matrix[i][j]; // 2.2.1)若 以后元素 已存在于 map ,则 阐明存在反复了、间接返回 false 。 if (map.has(tempVal)) { return false; } // 2.2.2)若 以后元素 不存在于 map ,则 将该元素放入 map 中。 else { map.set(tempVal, 1); } } } // 3)外围2:遍历所有 列 ,看其是否 “蕴含从 1到n 的全副整数” 。 for (let i = 0; i < l; i++) { // 3.1)每次遍历,均先 清空map 。 map.clear(); // 3.2)遍历当前列的每一个元素。 for (let j = 0; j < l; j++) { const tempVal = matrix[j][i]; // 3.2.1)若 以后元素 已存在于 map ,则 阐明存在反复了、间接返回 false 。 if (map.has(tempVal)) { return false; } // 3.2.2)若 以后元素 不存在于 map ,则 将该元素放入 map 中。 else { map.set(tempVal, 1); } } } // 4)行、列均满足条件,返回 true 。 return true;};四 资源分享 & 更多1 历史文章 - 总览 ...

January 16, 2022 · 2 min · jiezi

关于算法:cs61b-week7-Asymptotics

Example 1 For循环思考以下代码的工夫复杂度是多少,应用Big Theta示意 public static void printParty(int N) { for (int i = 1; i <= N; i = i * 2) { for (int j = 0; j < i; j += 1) { System.out.println("hello"); int ZUG = 1 + 1; } }}选取一项最具代表性的操作 System.out.println("hello);记其执行次数为 c(N) ,枚举N从1 到 N,C(N)的值,用以下表格示意:察看高低两个图可知当N = 1时, i = 1, j = 0;当N = 2时, i = 1 , 2, j = 0, 1;N = 2,已知i = 1的后果,只需再求i = 2的后果再将后面算得的i = 1的后果相加,即 3 = 1 + 2当N = 3时, 因为i的变动是每次变为 2i,即当N = 2时, 2i = 4,3比4小,循环依然终止在N = 2,也就是说N = 3与N = 2的打印次数雷同......因而察看得悉,当N位于相邻的2的某指数幂之间时,打印次数与前一次雷同,且等于后面所有2的指数幂时的打印次数相加,即 ...

January 15, 2022 · 3 min · jiezi

关于算法:查询后继节点纸条折痕问题

一、查问后继节点后继节点:中序遍历时,某个节点的后一个节点即是该节点的后继节点。 规定二叉树的构造如下: public static class Node {    public int value;    public Node left;    public Node right;    // 父节点    public Node parent;    public Node (int v) {        value = v;    }}如何疾速的找到某个节点的后继节点 1、思路1、依照后继节点的定义来查找某个节点的后继节点 即按中序遍历此二叉树,再查找指定节点的后继节点。工夫复杂度是O(N)。显然此办法不是最优解。 2、依据二叉树的构造,以及多的这个parent指针来查找 (1)指定节点X有右树,则X的后继节点就是X右树上最左的孩子。依据后继节点的定义得出的。 (2)X无右树,则依据parent指针往上找,直到找到某个节点是它父节点Y的左孩子为止,则Y就是X的后继节点;如果始终往上都没有找到某个节点是它父节点的左孩子,则该节点是最右的孩子,无后继节点。 Why:因为X是Y左树上的最右孩子,依照中序遍历的程序,遍历完X就是Y了。 工夫复杂度是O(K)(K是指定节点到后继节点的最短节点数) 很显然第二种办法更优。 2、代码/** * 查找后继节点 *      * @author Java和算法学习:周一 */public static Node successorNode(Node node) {    if (node == null) {        return null;    }    // 有右孩子    if (node.right != null) {        // 找到右树上最左的孩子        return getMaxLeft(node.right);    } else {        // 无右孩子        // 依据parent指针往上找        Node parent = node.parent;        // 没有找到最顶上,且以后节点是父节点的右孩子则始终往上找        while (parent != null && parent.right == node) {            node = parent;            parent = node.parent;        }        // parent蕴含两种状况        // 1)找到最顶上了,即parent是null        // 2)找到某个节点是父节点的左孩子了        return parent;    }}/** * 失去某个节点最左的孩子 */private static Node getMaxLeft(Node right) {    if (right == null) {        return null;    }    while (right.left != null) {        right = right.left;    }    return right;}二、纸条折痕问题这是微软已经的一道面试题,这题真的很考查一个人的能力,并不是说它很难,而是考查对算法的一种死记硬背的能力。 1、题目形容请把一段纸条竖着放在桌子上,而后从纸条的下边向上方对折1次,压出折痕后开展。此时折痕是凹下去的(下折痕),即折痕突起的方向指向纸条的反面。如果从纸条的下边向上方间断对折2次,压出折痕后开展,此时有三条折痕,从上到下顺次是下折痕、下折痕和上折痕。 给定一个输出参数N,代表纸条从下边向上方间断对折N次。请从上到下打印所有折痕的方向。 例如: N=1时,打印: down(凹); N=2时,打印: down(凹)、down(凹)、up(凸) 2、思路 通过屡次对折会发现:下一次的折痕对于上一次而言,总是上凹下凸的。 也就是第二次的折痕,在第一次的凹(1凹)下面是凹(2凹)、上面是凸(2凸); 第三次的折痕,在2凹的下面是3凹、上面是3凸,在2凸的下面是3凹、上面是3凸;以此类推。 而后顺次开展,放到一个二叉树上,惊奇的发现,从上到下打印所有折痕的方向,就是二叉树的中序遍历。 3、代码/** * @author Java和算法学习:周一 */public static void paperFolding(int n) {    // 二叉树头节点是凹的    process(1, n, true);}/** * @param i 节点的层数 * @param n 一共多少层 * @param down true=凹,false=凸 */private static void process(int i, int n, boolean down) {    if (i > n) {        return;    }    // 上边是凹    process(i + 1, n, true);    System.out.print(down ? "凹 " : "凸 ");    // 下边是凸    process(i + 1, n, false);}是不是发现,思路对了一下就恍然大悟了,死记硬背也是一种能力。 本文代码地址:https://github.com/monday-pro/algorithm-study/blob/master/src/basic/binarytree/SuccessorNode.java

January 15, 2022 · 1 min · jiezi

关于算法:求二叉树最宽的层有多少个节点

一、思路:在按层遍历的根底上进行改写。 (1)筹备currentLevelEnd(示意以后层的完结节点)、nextLevelEnd(示意下一层的完结节点)、currentWeight(示意以后层的宽度)、maxWeight(示意最大宽度)四个变量。 (2)currentLevelEnd批改为二叉树的头节点(其余均为默认值),头节点入队列。 (3)从队列中弹出一个节点,每出队一个节点则currentWeight加一,出队节点有左孩子则左孩子入队,有右孩子则右孩子入队,有节点入队则将nextLevelEnd批改为以后入队的节点(为下一层查找做筹备)。 (4)判断第3步出队的节点是否等于currentLevelEnd。 是,则批改maxWeight为以后最大宽度,currentWeight重置,currentLevelEnd批改为nextLevelEnd,nextLevelEnd重置; 否,则继续执行第3步。 (5)始终执行第3、4步,直到队列为空。 /** * @author Java和算法学习:周一 */public static int treeMaxWidth(Node head) {    if (head == null) {        return 0;    }    Queue<Node> queue = new LinkedList<>();    Node currentLevelEnd = head;    Node nextLevelEnd = null;    int currentWidth = 0;    int maxWidth = 0;    queue.offer(head);    while (!queue.isEmpty()) {        Node current = queue.poll();        // 每次从队列中弹出节点时,以后层的宽度都加一        currentWidth++;        // 有孩子节点入队时就批改下一层的完结节点        if (current.left != null) {            queue.offer(current.left);            nextLevelEnd = current.left;        }        if (current.right != null) {            queue.offer(current.right);            nextLevelEnd = current.right;        }        // 如果以后出队的节点是以后层的完结节点        if (current == currentLevelEnd) {            // 批改最大宽度            maxWidth = Math.max(maxWidth, currentWidth);            // 以后层宽度重置            currentWidth = 0;            // 以后层的完结节点批改,表明下一次循环时开始统计下一层的宽度            currentLevelEnd = nextLevelEnd;            // 下一层完结节点重置            nextLevelEnd = null;        }    }    return maxWidth;}二、对数器源码/** * 对数器办法 *      * @author Java和算法学习:周一 */public static int treeMaxWidth1(Node head) {    if (head == null) {        return 0;    }    Queue<Node> queue = new LinkedList<>();    queue.add(head);    // key:节点,value:节点在哪一层    HashMap<Node, Integer> levelMap = new HashMap<>(16);    levelMap.put(head, 1);    // 以后来到哪一层    int curLevel = 1;    // 以后层的宽度    int curLevelWidth = 0;    // 最大宽度    int max = 0;    while (!queue.isEmpty()) {        Node cur = queue.poll();        int curNodeLevel = levelMap.get(cur);        if (cur.left != null) {            levelMap.put(cur.left, curNodeLevel + 1);            queue.add(cur.left);        }        if (cur.right != null) {            levelMap.put(cur.right, curNodeLevel + 1);            queue.add(cur.right);        }        // 以后节点还是在以后层        if (curNodeLevel == curLevel) {            curLevelWidth++;        } else {            // 以后层曾经遍历结束            max = Math.max(max, curLevelWidth);            // 来到下一层            curLevel++;            // 以后节点曾经是下一层的了,也就是下一层曾经有一个节点了,宽度天然是1            curLevelWidth = 1;        }    }    // 最初一层的宽度没有和max比拟,所以这里要再比拟一次    max = Math.max(max, curLevelWidth);    return max;}本文全副代码:https://github.com/monday-pro/algorithm-study/blob/master/src/basic/binarytree/TreeMaxWidth.java

January 14, 2022 · 1 min · jiezi

关于算法:DSTC10开放领域对话评估比赛冠军方法总结

本文介绍了国内比赛DSTC10凋谢畛域对话评估赛道的冠军办法MME-CRS,该办法设计了多种评估指标,并利用相关性重归一化算法来集成不同指标的打分,为对话评估畛域设计更无效的评估指标提供了参考。相干办法已同步发表在AAAI 2022 Workshop上。心愿能给从事该技术畛域工作的同学一些启发或帮忙。1 背景对话零碎技术挑战赛DSTC(The Dialog System Technology Challenge)由微软、卡内基梅隆大学的科学家于2013年发动,旨在带动学术与工业界在对话技术上的晋升,在对话畛域具备极高的权威性和知名度。对话零碎挑战赛往年已举办至第十届(DSTC10),吸引了微软、亚马逊、卡内基梅隆大学、Facebook、三菱电子钻研实验室、美团、百度等寰球知名企业、顶尖大学和机构同台竞技。 DSTC10共蕴含5个Track,每个Track蕴含某一对话畛域的数个子工作。其中Track5 Task1 Automatic Open-domain Dialogue Evaluation较为零碎全面地将凋谢畛域对话的主动评估工作引入DSTC10较量中。凋谢畛域对话主动评估是对话零碎的重要组成部分,致力于自动化地给出合乎人类直觉的对话品质评估后果。相比于速度慢、老本高的人工标注,自动化评估办法能够高效率、低成本地对不同对话零碎进行打分,无力促成了对话零碎的倒退。 不同于工作型对话有一个固定的优化指标,凋谢畛域对话更靠近人类实在的对话,评估难度更大,因此吸引了宽泛的关注。DSTC10 Track5 Task1较量共蕴含14个验证数据集(共蕴含37种不同的对话评估维度)和5个测试数据集(共蕴含11个评估维度)。美团语音团队最终以均匀0.3104的相关性获得了该较量的第一名,该局部工作已实现一篇论文MME-CRS: Multi-Metric Evaluation Based on Correlation Re-Scaling for Evaluating Open-Domain Dialogue,并收录在AAAI2022 Workshop。 2 赛题简介凋谢畛域对话评估较量收集了对话畛域论文中的经典数据集,包含14个验证数据集(12个Turn-Level级别数据集和2个Dialog-Level级别数据集)和5个测试数据集。 数据集中的每个对话次要蕴含以下信息: Context:对话中的发问,或者说对话的上下文。Response:针对Context的回复,也即评估的具体对象;对话数据集中的Response个别由不同对话生成模型产生,如GPT-2和T5。Reference:人工给出的针对Context的参考答复,个别为5条左右。每个对话蕴含多个评估维度,如Context和Response的相关性,Response自身的晦涩度等。每个数据集的评估维度不同,14个验证集总共蕴含37种不同的评估维度,具体蕴含Overall、Grammar、Relevance、Appropriateness、Interesting等。每个评估维度都有人工标注的打分,打分从1到5,分数越高示意以后评估维度的品质越高。 验证集和测试集的统计信息如图2和图3所示: 其中Turns示意对应数据集中的对话轮数;Qualities示意数据集中每个对话的评估维度,每个评估维度都有对应的人工标注打分;Annos示意每个数据集的标注量。 在该较量中,每个数据集每个对话每个评估维度都有人工标注的打分,打分范畴个别为1到5,个别求均值用于相关性计算。参赛队伍须要设计评估指标用于预测每个对话不同评估维度的打分。每个数据集的每个评估维度的预测打分会和人工标注的打分计算Spearman相关性,最初的比赛结果基于全副测试数据集的评估维度求均值。 3 现有办法和问题3.1 现有办法凋谢畛域对话的主动评估办法次要分为三类。 Overlap-based办法 晚期钻研人员将对话零碎中Reference和Response类比于机器翻译中的原句和翻译句,借鉴机器翻译的评估指标来评估对话品质。Overlap-based办法计算对话中Response和Reference之间的词重叠状况,词重叠越高打分越高。经典办法包含BLEU[1]和ROUGE[2]等,其中BLEU依据准确率掂量评估品质,而ROUGE依据召回率掂量品质。Response的评估依赖于给定的Reference,而凋谢畛域下适合的Response是有限的,因而,Overlap-based办法并不适用于凋谢畛域对话评估。 Embedding-based办法 随着词向量和预训练语言模型的疾速倒退,Embedding-based评估办法获得了不错的性能。基于深度模型别离编码Response和Reference,并基于二者的编码计算相关性打分。次要办法包含Greedy Matching[3]、Embedding Averaging[4]和BERTScore[5-6]等。Embedding-based办法相比Overlap-Based办法有较大的晋升,然而同样依赖于Reference,依然存在较大的优化空间。 Learning-based办法 基于Reference的凋谢畛域对话评估存在一个One-To-Many[7]窘境:即凋谢畛域对话适合的Response是有限的,但人为设计的Reference是无限的(个别为5条左右)。因而,基于比照Reference和Response的相似性(字面重叠或者语义类似)设计凋谢畛域评估办法存在较大局限性。相比已有的Overlap-based办法和Embedding-based办法,ADEM办法[8]首次应用层次化的编码器来编码Context和Reference,并对输出的Response进行打分。ADEM办法基于模型打分和人工打分的均方误差来优化模型参数,冀望迫近人类的打分。ADEM模型相比Overlap-based办法和Embedding-based办法获得了很大的胜利,Learning-based办法也逐步成为了凋谢畛域自动化评估的支流办法。 为了一直进步对话评估的精确和全面性,各种不同的评估维度层出不穷。为了应答越来越多评估维度带来的挑战,USL-H[9]将评估维度分为Understandability、Sensibleness和Likeability三类,如图4所示。USL-H针对性提出了VUP(Valid Utterance Prediction)、NUP(Next Utterance Prediction)和MLM(Mask Language Model)3种指标,别离掂量对话中: Response是否通顺晦涩。Context和Respose的相干水平。Response自身是否具体,更像人类等。 3.2 问题现有的评估办法次要有以下问题: 设计的对话指标不够全面,难以综合掂量对话的品质 现有的主动评估办法次要聚焦在个别数据集的局部评估维度上。以以后较为全面的USL-H为例,该办法思考了Response的晦涩度、丰盛度以及Context-Response句子对的相关性,然而USL-H疏忽了: 更细粒度的Context-Response句子对的主题一致性。回复者对以后对话的参与度。试验证实,这些指标的脱漏重大影响了评估办法的性能。为了更全面稳固地评估多个对话数据集,设计思考更多评估维度的指标势在必行。 不足无效的指标集成办法 现有办法大多偏向于为每种评估维度设计一种评估指标,这种思路面对越来越多的评估维度显得力不从心(思考下较量测试集共蕴含37种不同的评估维度)。每种对话维度的评估可能依赖数种评估指标,如Logical评估维度须要对话:1)Response晦涩;2)Response和Context是相干的。设计根本的评估子指标,再通过适合的集成办法集成多个子指标打分,能够更全面无效示意不同的对话评估维度。 4 咱们的办法针对评估指标不够全面,本文设计了5类共7种评估指标(Multi-Metric Evaluation,MME)用于全面掂量对话的品质。基于设计的5类7种根底指标,咱们进一步提出了相关性重归一化办法(Correlation Re-Scaling Method,CRS)来集成不同评估指标的打分。咱们将提出的模型称为MME-CRS,模型整体架构图5所示: ...

January 14, 2022 · 3 min · jiezi

关于算法:二叉树的序列化和反序列化

序列化的定义: 序列化(serialization)是指将数据结构或对象状态转换成可取用格局(例如存成文件,存于缓冲,或经由网络中发送),以留待后续在雷同或另一台计算机环境中,能复原原先状态的过程。按照序列化格局从新获取字节的后果时,能够利用它来产生与原始对象雷同语义的正本。 从一系列字节提取数据结构的反向操作,是反序列化。 先序形式序列化和反序列化1、先序形式序列化按先序遍历的形式,挨个将二叉树的各个节点,存储为一个以指定分隔符分隔的字符串,为空的节点也须要存储。 /** * 先序形式序列化 * * @author Java和算法学习:周一 */public static Queue<String> preSerial(Node head) {    Queue<String> ans = new LinkedList<>();    pre(head, ans);    return ans;}private static void pre(Node head, Queue<String> ans) {    if (head == null) {        ans.add(null);    } else {        ans.add(String.valueOf(head.value));        pre(head.left, ans);        pre(head.right, ans);    }}2、先序形式反序列化按先序遍历的形式,挨个以指定分隔符切分之前的字符串,还原为原始二叉树。 /** * 先序形式反序列化 * * @author Java和算法学习:周一 */public static Node buildByPre(Queue<String> queue) {    if (queue == null || queue.size() == 0) {        return null;    }    return preB(queue);}private static Node preB(Queue<String> queue) {    String value = queue.poll();    if (value == null) {        return null;    }    Node head = new Node(Integer.parseInt(value));    head.left = preB(queue);    head.right = preB(queue);    return head;}后序形式序列化和反序列化1、后序形式序列化和反序列化和先序形式的思路和过程是一样的。须要留神的是在反序列化时,得先把原始序列化的程序颠倒一下(颠倒后的程序即是头右左),再以头右左的形式进行反序列化,因为要先有头才有孩子(先结构头能力结构孩子),这样反序列化的后果才是对的。 /** * 后序形式序列化 * * @author Java和算法学习:周一 */public static Queue<String> posSerial(Node head) {    Queue<String> ans = new LinkedList<>();    pos(head, ans);    return ans;}public static void pos(Node head, Queue<String> ans) {    if (head == null) {        ans.add(null);    } else {        pos(head.left, ans);        pos(head.right, ans);        ans.add(String.valueOf(head.value));    }}/** * 后序形式反序列化 * * @author Java和算法学习:周一 */public static Node buildByPos(Queue<String> queue) {    if (queue == null || queue.size() == 0) {        return null;    }    Stack<String> stack = new Stack<>();    while (!queue.isEmpty()) {        stack.push(queue.poll());    }    return posB(stack);}public static Node posB(Stack<String> posStack) {    String value = posStack.pop();    if (value == null) {        return null;    }    Node head = new Node(Integer.parseInt(value));    head.right = posB(posStack);    head.left = posB(posStack);    return head;}2、为啥没有中序形式的序列化?二叉树无奈通过中序遍历的形式实现序列化和反序列化,因为不同的两棵树,可能失去同样的中序序列,这时候就无奈确定此中序序列代表哪个二叉树了。 按层形式序列化和反序列化1、序列化(1)筹备一个放后果的队列(放的是节点的字符串值),筹备一个辅助队列(放的是节点) (2)往后果队列放入头节点的值,往辅助队列放入头节点 (3)弹出辅助队列的头节点, 1)此节点左孩子不为空,往后果队列放入左孩子节点的值,往辅助队列放入左孩子;如果此节点左孩子为空,往后果队列放入null值,辅助队列不变。 2)此节点右孩子不为空,往后果队列放入右孩子节点的值,往辅助队列放入右孩子;如果此节点右孩子为空,往后果队列放入null值,辅助队列不变。 (4)始终执行第3步,直到辅助队列为空。 /** * 按层形式序列化 * * @author Java和算法学习:周一 */public static Queue<String> levelSerial(Node head) {    Queue<String> ans = new LinkedList<>();    if (head == null) {        ans.offer(null);    } else {        // 往后果队列放入头节点的值        ans.add(String.valueOf(head.value));        // 筹备一个辅助队列        Queue<Node> help = new LinkedList<>();        // 辅助队列放入头节点        help.offer(head);        while (!help.isEmpty()) {            Node current = help.poll();            // 辅助队列头节点的左孩子不为空            if (current.left != null) {                // 往后果队列放左孩子的值                ans.offer(String.valueOf(current.left.value));                // 往辅助队列放左孩子                help.offer(current.left);            } else {                // 往后果队列放null,辅助队列不变                ans.offer(null);            }            // 右孩子同理            if (current.right != null) {                ans.offer(String.valueOf(current.right.value));                help.offer(current.right);            } else {                ans.offer(null);            }        }    }    return ans;}2、反序列化(1)从原队列弹出第一个值,反序列化生成头节点 (2)筹备一个辅助队列(放的是节点),放入头节点 (3)弹出辅助队列的第一个节点current,从原队列里弹出一个值,反序列化做为current的左孩子;再从原队列里弹出一个值,反序列化做为current的右孩子 (4)current的左孩子不是空,则放入辅助队列;current的右孩子不是空,则放入辅助队列 (5)始终循环执行3、4步,直到辅助队列为空 /** * 按层形式反序列化 * * @author Java和算法学习:周一 */public static Node buildByLevel(Queue<String> queue) {    if (queue == null || queue.size() == 0) {        return null;    }    // 反序列化构建头节点    Node head = generateNode(queue.poll());    // 筹备一个辅助队列    Queue<Node> help = new LinkedList<>();    // 避免队列里就只有一个null,如果队列里就只有一个null,则整个办法就间接完结了    if (head != null) {        // 辅助队列放入头节点        help.offer(head);    }    Node current;    while (!help.isEmpty()) {        // 弹出辅助队列的第一个节点        current = help.poll();        // 反序列化构建左孩子        current.left = generateNode(queue.poll());        // 反序列化构建右孩子        current.right = generateNode(queue.poll());        if (current.left != null) {            // 左孩子不为空,往辅助队列放入左孩子            help.offer(current.left);        }        if (current.right != null) {            // 右孩子不为空,往辅助队列放入右孩子            help.offer(current.right);        }    }    return head;}本文所有代码地址:https://github.com/monday-pro/algorithm-study/blob/master/src/basic/binarytree/SerializeAndDeserializeTree.java

January 13, 2022 · 1 min · jiezi

关于算法:算法学习篇滑动窗口算法javascript

滑动窗口算法:字面意思,大家都见过窗户吧,开关窗户也都会吧(废话×)这里的滑动窗口算法的窗口分为固定的和不固定的,固定的就是生存中见到的那种窗口,设想一下有个大窗口,而后滑动的是纱窗,此处的纱窗就是固定的滑动窗口,要是不固定的呢就须要本人设想了这个纱窗是可伸缩的。网上轻易找的一张图,能够感受一下:其中前面的大窗口就是要遍历的对象,纱窗分左边框和左边框,用来在大窗口寻找符合条件的指标对象。留神:对于固定窗口的话就没必要应用左边框了,因为固定窗口的话固定大小若为k,间接用左边框减去k就等于左边框了。 看一下一道滑动窗口的算法题来感受一下(固定窗口):语言:JavaScript1、借鉴题(很简略,能够做着玩玩):给定一组数组,遍历数组,每三个算作一个子串,算出每个组合的子串的和,进阶:算出每个组合的子串的和后找到其中的最大值。输出:[-3,3,5,1,3,7,4]输入:[5,9,9,11,14]进阶输入:14解释:①-3+3+5=5 ②3+5+1=9 ③5+1+3=9 ④1+3+7=11 ⑤3+7+4=14上面展现最笨的办法hhh(后续再想优化计划): function temp(s) { let left = 0,right = 2; // 定义滑动窗口的左右边框 let sumArr = []; // 每滑动一次求到的和放到新的数组里 let n = s.length; // 数组的长度赋值给一个新的变量 if (n <= 2) { //因为固定窗口是3,若数组里值的数量小于3则没必要持续做 return s; // 间接返回数组 } while (right < n) { //遍历条件,当左边框大于n时进行遍历,管制次数 let sum = 0; // sum用于记录每组子串的和,因为要反复利用所以要置0 for (let i = left; i <= right; i++) { // 二层循环用于遍历每个[left,right]子串 sum += s[i]; //每三个一组的子串的和 } sumArr.push(sum); // 失去一组的和就放到新的数组里 right++; // 算完一组子串后,窗口开始往右滑动 left++; } const max = Math.max(...sumArr); // 获取一组数组的最大值 return sumArr; //进阶:求数组里数字的最大值:Math.max(…sumArr); }}知识点: ...

January 13, 2022 · 2 min · jiezi

关于算法:数智国企-中建五局全面开启数字化转型-持续攻坚高质量发展

编者荐语:中建五局通过数字化转型降级,打造“数字五局”。基于用友iuap云平台,搭建了五局业务、技术与数据中台,满足了企业由信息化向数字化转型的技术撑持。 作为中建团体的外围企业,1965年成立至今,中国修建第五工程局(简称“中建五局”)一直冲破翻新,已倒退成投资商、建造商、运营商“三商一体、品质一流”的现代化投资建设团体。“十三五”以来,中建五局造成了包含投资、设计、基建、装置、钢结构、装璜、园林、物业在内的全产业特色。 “十四五”新期间,中建五局明确“一最两创、三强三优”的战略目标。其中,“一最”指成为最具继续价值创造力的一流投资建设团体;“两创”即创倒退品质一流企业、创文化品牌一流企业;“三强”即世界500强、中建三强、湖南首强;“三优”指继续打造投资业务、基建业务、海内业务的比拟劣势。 新期间,中建五局保持用新倒退理念引领企业的高质量降级。在国有企业数字化、智能化转型火烧眉毛的明天,中建五局将信息化建设新要求与本身倒退相交融,启动信息化4.0工程,全面开启数字化转型降级之路,打造行业当先的数字化翻新利用企业。 数字化转型撑持企业高质量倒退我国建筑业经验近十年总产值年均20%以上的高速增长,之后行业规模扩张逐步趋于平缓,倒退速度由高速转向中高速,倒退形式由规模转向粗放,并朝着高质量的方向转变,须要企业通过踊跃利用新兴技术,经营和治理向数字化转型,从而实现品质改革、效率改革、能源改革。 以后,数字化降级曾经成为中建五局新期间的战略性工作,通过“信息技术翻新”和“业务管理翻新”双轮驱动,推动生产经营与数字化同步转型降级,从而助推企业的高质量倒退。同时,通过数字化转型降级,打造“数字五局”,最终实现“企业管控集约化、资源配置高效化、业务管理精益化、生态互联协同化”。 在企业治理上,建设一个平台,实现“三个降级”。中建五局信息化治理集成系统升级为中建五局数字化管控经营平台。 “三个降级”,即业务管理体系降级、数据经营体系降级、IT技术体系降级。其中,业务管理体系降级着力晋升决策数据化与危险主动预警能力、企业经营治理与资源配置能力、我的项目综合治理与精细化治理能力,促成产业链协同治理;数据经营体系降级欠缺数据治理体系,夯实生产经营数据根底,做好数据品质及合规治理,积攒外围数据,设计经营治理及危险管控模型,实现企业经营在线剖析、在线查看、在线考核、危险线上预警;IT技术保障体系降级IT技术架构、IT基础设施和信息安全体系。 在施工生产上,打造工程建造全过程的我的项目智慧综合管理系统,实现“三个买通”。 一是基于工程全生命周期的数字孪生,生产经营物理场景与数字场景实时双向同步。 二是基于业务全场景,设施与治理在线化、数据集约化、危险预控自动化,买通建造与经营。 三是基于资源全数据链,岗位、线条、相干方在线协同,实现工程建造相干方在线协同。 从信息化到数字化中建五局始终在引领以2008年12月12日启动与用友单干为标记,中建五局保持信息化建设超过10年,公认为走在行业前列。多年来,中建五局以“服务策略、粗放管控、集成利用、务求实效”为指标,依照“治理标准化、规范表单化、表单信息化、信息集约化”的施行门路,通过“三化交融”,建成了五局治理信息化集成系统,实现了组织全笼罩、业务全集成,造成了“零碎平台化、数据标准化、施行规范化、业务在线化”的“四化”特色,奠定了数字化转型降级的根底。 中建五局的信息化利用体系分成了三大平台,别离是协同办公平台、经营治理平台和综合项目管理平台。1.协同办公平台包含企业门户、协同办公零碎与常识文档零碎。通过协同平台的建设,实现了各审批流程在线审批,同时利用信息化一直优化流程,彻底改变了人跑腿的景象。 2.经营治理平台包含人力资源管理、财务管理、资金治理、洽购治理、经营治理、档案管理等内容。实现了中建五局“人、财、物”各项核算资源及“营销、施工、供给”等全业务的闭环治理,从而标准了业务解决、精细化了老本管控、躲避企业经营风险。 3.综合项目管理平台实现了进度、品质、平安、环境、老本、合同、分包、劳务、人员、资料、设施、技术、材料、财务、资金、现场治理等我的项目具体业务零碎的搭建,满足了我的项目综合治理业务利用,使其成为中建五局业务管理的经营载体和晋升工作效率的平台。 新期间,中建五局基于用友iuap云平台,搭建了五局业务、技术与数据中台,满足了企业由信息化向数字化转型的技术撑持。 通过技术中台,实现了原有平台的整合,同时构建了生态协同技术底座; 通过业务中台逐渐将原有业务轻量化、挪动化,进步用户体验,实现零碎好用、有用; 通过数据中台,实现了对各项经营数据及治理数据的采集,从而实现了数字决策。 基于平台定制的个性化智慧工地利用,实现了对五局现场治理的数字化、可视化,通过品质、平安、劳务、视频、IOT设施、BIM等的接入,实现了现场实时监控,提前预警,过程治理。 今年以来,中建五局各我的项目迅速掀起建设热潮,跑出了高质量倒退的“加速度”。其中,河南公司商丘市睢阳区大棚户革新西部安置区我的项目,一季度产值4.15亿元。我的项目是局在建规模最大、性能最全的安置房EPC我的项目;投资公司、中建隧道重庆市快速路二横线西段PPP我的项目,一季度产值2.18亿元。我的项目含世界首例五桥同转、全国首例上承式梁拱组合预应力体系钢构桥…… 数字化转型的一直冲破、翻新,也助力中建五局在“加速度”的路线上越跑越稳、越跑越快,实现了继续高质量倒退。

January 12, 2022 · 1 min · jiezi

关于算法:不会一致性hash算法劝你简历别写搞过负载均衡

大家好,我是小富~ 集体公众号:程序员内点事,欢送学习交换这两天看到技术群里,有小伙伴在探讨一致性hash算法的问题,正愁没啥写的题目就来了,那就简略介绍下它的原理。下边咱们以分布式缓存中经典场景举例,面试中也是常常提及的一些话题,看看什么是一致性hash算法以及它有那些过人之处。 构建场景如果咱们有三台缓存服务器编号node0、node1、node2,当初有3000万个key,心愿能够将这些个key平均的缓存到三台机器上,你会想到什么计划呢? 咱们可能首先想到的计划,是取模算法hash(key)% N,对key进行hash运算后取模,N是机器的数量。key进行hash后的后果对3取模,失去的后果肯定是0、1或者2,正好对应服务器node0、node1、node2,存取数据间接找对应的服务器即可,简略粗犷,齐全能够解决上述的问题。 hash的问题取模算法尽管应用简略,但对机器数量取模,在集群扩容和膨胀时却有肯定的局限性,因为在生产环境中依据业务量的大小,调整服务器数量是常有的事;而服务器数量N发生变化后hash(key)% N计算的后果也会随之变动。 比方:一个服务器节点挂了,计算公式从hash(key)% 3变成了hash(key)% 2,后果会发生变化,此时想要拜访一个key,这个key的缓存地位大概率会产生扭转,那么之前缓存key的数据也会失去作用与意义。 大量缓存在同一时间生效,造成缓存的雪崩,进而导致整个缓存零碎的不可用,这基本上是不能承受的,为了解决优化上述情况,一致性hash算法应运而生~ 那么,一致性哈希算法又是如何解决上述问题的? 一致性hash一致性hash算法实质上也是一种取模算法,不过,不同于上边按服务器数量取模,一致性hash是对固定值2^32取模。 IPv4的地址是4组8位2进制数组成,所以用2^32能够保障每个IP地址会有惟一的映射hash环 咱们能够将这2^32个值形象成一个圆环⭕️(不得意圆的,本人想个形态,好了解就行),圆环的正上方的点代表0,顺时针排列,以此类推,1、2、3、4、5、6……直到2^32-1,而这个由2的32次方个点组成的圆环统称为hash环。 那么这个hash环和一致性hash算法又有什么关系嘞?咱们还是以上边的场景为例,三台缓存服务器编号node0、node1、node2,3000万个key。 服务器映射到hash环 这个时候计算公式就从hash(key)% N 变成了hash(服务器ip)% 2^32,应用服务器IP地址进行hash计算,用哈希后的后果对2^32取模,后果肯定是一个0到2^32-1之间的整数,而这个整数映射在hash环上的地位代表了一个服务器,顺次将node0、node1、node2三个缓存服务器映射到hash环上。 对象key映射到hash环 接着在将须要缓存的key对象也映射到hash环上,hash(key)% 2^32,服务器节点和要缓存的key对象都映射到了hash环,那对象key具体应该缓存到哪个服务器上呢? 对象key映射到服务器 从缓存对象key的地位开始,沿顺时针方向遇到的第一个服务器,便是以后对象将要缓存到的服务器。因为被缓存对象与服务器hash后的值是固定的,所以,在服务器不变的条件下,对象key必定会被缓存到固定的服务器上。依据上边的规定,下图中的映射关系: key-1 -> node-1key-3 -> node-2key-4 -> node-2key-5 -> node-2key-2 -> node-0 如果想要拜访某个key,只有应用雷同的计算形式,即可得悉这个key被缓存在哪个服务器上了。 一致性hash的劣势咱们简略理解了一致性hash的原理,那它又是如何优化集群中增加节点和缩减节点,一般取模算法导致的缓存服务,大面积不可用的问题呢? 先来看看扩容的场景,如果业务量激增,零碎须要进行扩容减少一台服务器node-4,刚好node-4被映射到node-1和node-2之间,沿顺时针方向对象映射节点,发现本来缓存在node-2上的对象key-4、key-5被从新映射到了node-4上,而整个扩容过程中受影响的只有node-4和node-1节点之间的一小部分数据。 反之,如果node-1节点宕机,沿顺时针方向对象映射节点,缓存在node-1上的对象key-1被从新映射到了node-4上,此时受影响的数据只有node-0和node-1之间的一小部分数据。 从上边的两种状况发现,当集群中服务器的数量产生扭转时,一致性hash算只会影响少部分的数据,保障了缓存零碎整体还能够对外提供服务的。 数据偏斜问题前边为了便于了解原理,画图中的node节点都很理想化的绝对均匀分布,但现实和理论的场景往往差异很大,就比方办了个健身年卡的我,只去过健身房两次,还只是洗了个澡。 在服务器节点数量太少的状况下,很容易因为节点散布不平均而造成数据歪斜问题,如下图被缓存的对象大部分缓存在node-4服务器上,导致其余节点资源节约,零碎压力大部分集中在node-4节点上,这样的集群是十分不衰弱的。 解决数据歪斜的方法也简略,咱们就要想方法让节点映射到hash环上时,绝对散布平均一点。 一致性Hash算法引入了一个虚构节点机制,即对每个服务器节点计算出多个hash值,它们都会映射到hash环上,映射到这些虚构节点的对象key,最终会缓存在实在的节点上。 虚构节点的hash计算通常能够采纳,对应节点的IP地址加数字编号后缀 hash(10.24.23.227#1) 的形式,举个例子,node-1节点IP为10.24.23.227,失常计算node-1的hash值。 hash(10.24.23.227#1)% 2^32假如咱们给node-1设置三个虚构节点,node-1#1、node-1#2、node-1#3,对它们进行hash后取模。 hash(10.24.23.227#1)% 2^32hash(10.24.23.227#2)% 2^32hash(10.24.23.227#3)% 2^32下图退出虚构节点后,原有节点在hash环上散布的就绝对平均了,其余节点压力失去了摊派。 但须要留神一点,调配的虚构节点个数越多,映射在hash环上才会越趋于平均,节点太少的话很难看出成果引入虚构节点的同时也减少了新的问题,要做虚构节点和实在节点间的映射,对象key->虚构节点->理论节点之间的转换。 一致性hash的利用场景一致性hash在分布式系统中应该是实现负载平衡的首选算法,它的实现比拟灵便,既能够在客户端实现,也能够在中间件上实现,比方日常应用较多的缓存中间件memcached和redis集群都有用到它。 ...

January 12, 2022 · 1 min · jiezi

关于算法:算法初级数组删除排序数组中的重复项多语言版实现

【算法-高级-数组】删除排序数组中的反复项(多语言版实现) 博客阐明与致谢 文章所波及的局部材料来自互联网整顿,其中蕴含本人集体的总结和认识,分享的目标在于共建社区和坚固本人。 援用的材料如有侵权,请分割自己删除! ❤️❤️❤️ 感激万能的网络! 以及勤奋的本人,集体博客,GitHub学习,GitHub 公众号【归子莫】,小程序【子莫说】 如果你感觉对你有帮忙的话,无妨给我点赞激励一下,好文记得珍藏哟!关注我一起成长! 幸好我在,感激你来! 算法阐明语言只是实现算法的一种伎俩,思路才是最为重要的。 如果有多种解法的话,只选一种语言作为解答比照。 如果独自将某一种算法的话,会以多种语言实现,比照语言的个性。 因为多对多的话,篇幅会拉的比拟大,影响观看体验! 题目地址26. 删除有序数组中的反复项 给你一个有序数组 nums ,请你 原地 删除反复呈现的元素,使每个元素 只呈现一次 ,返回删除后数组的新长度。 题目阐明不要应用额定的数组空间,你必须在 原地 批改输出数组 并在应用 O(1) 额定空间的条件下实现。 阐明为什么返回数值是整数,但输入的答案是数组呢? 请留神,输出数组是以「援用」形式传递的,这意味着在函数里批改输出数组对于调用者是可见的。 你能够设想外部操作如下: // nums 是以“援用”形式传递的。也就是说,不对实参做任何拷贝int len = removeDuplicates(nums);// 在函数里批改输出数组对于调用者是可见的。// 依据你的函数返回的长度, 它会打印出数组中 该长度范畴内 的所有元素。for (int i = 0; i < len; i++) { print(nums[i]);}示例 1输出:nums = [1,1,2]输入:2, nums = [1,2]解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被批改为 1, 2 。不须要思考数组中超出新长度前面的元素。示例 2输出:nums = [0,0,1,1,1,2,2,3,3,4]输入:5, nums = [0,1,2,3,4]解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被批改为 0, 1, 2, 3, 4 。不须要思考数组中超出新长度前面的元素。提醒0 <= nums.length <= 3 * 104-104 <= nums[i] <= 104nums 已按升序排列 思路暴力想法(留神是暴力想法,不是暴力解法!) ...

January 12, 2022 · 3 min · jiezi

关于算法:40组合总和-II-算法leetode附思维导图-全部解法300题

零 题目 & 简介1 题目算法(leetode,附思维导图 + 全副解法)300题之(40)组合总和 II 2 简介码农三少 ,一个致力于编写 极简、但齐全题解(算法) 的博主。专一于 一题多解、结构化思维 ,一起刷穿 LeetCode ~ 一 题目形容 二 解法总览(思维导图) 三 全副解法1 计划11)代码: // 计划1 ”回溯法(递归版)“// 通过:172 / 175。 输出 [1, 1, ... , 1, 1] 时会超时!!// 技巧:“有序胜过无序”。// 通过sort办法(工夫复杂度仅为 O(nlogn))将无序的数组变有序是一件很划算的事件。// 思路:// 1)状态初始化// 2)调用 dfs // 3)后果去重// 4)返回后果 resList var combinationSum2 = function(candidates, target) { const dfs = (curIndex, l, curSum, target, curArr, resList) => { // 1)递归进口 if (curSum === target) { // 注:应用 slice ,获得其正本值 !! resList.push(curArr.slice()); return; } if (curIndex >= l || curSum > target) { return; } // 2)递归主体(回溯 = 选 + 不选) // 2.1)选 curArr.push(candidates[curIndex]); curSum += candidates[curIndex]; dfs(curIndex + 1, l, curSum, target, curArr, resList); // 2.1)不选(注:可能须要复原环境,如上面的2行代码 —— pop、-= ) curArr.pop(); curSum -= candidates[curIndex]; dfs(curIndex + 1, l, curSum, target, curArr, resList); }; // 1)状态初始化 const l = candidates.length; candidates = candidates.sort((a, b) => a - b); let curIndex = 0, curSum = 0, curArr = [], resList = []; // 2)调用 dfs dfs(curIndex, l, curSum, target, curArr, resList); // 3)后果去重 resList = [...new Set(resList.map(item => item.join('#')))].map(item => item.split('#')); // 4)返回后果 resList return resList;};2 计划21)代码: ...

January 10, 2022 · 2 min · jiezi

关于算法:38外观数列-算法leetode附思维导图-全部解法300题

零 题目:算法(leetode,附思维导图 + 全副解法)300题之(38)外观数列码农三少 ,一个致力于编写极简、但齐全题解(算法)的博主一 题目形容 二 解法总览(思维导图) 三 全副解法1 计划11)代码: // 计划1 “相似斐波那切数列,应用2个变量”// 思路:// 1)状态初始化// 2)循环解决 n-1 次,一直解决 pre、now 值// 2.1)依据 pre 值,计算出 now 值// 2.2)将 now值 赋值给 pre 值,now 置为 '',接着进行下一次循环解决 ——> 依据 pre 值,计算出 now 值// 3)返回后果 pre值 var countAndSay = function(n) { // 1)状态初始化 let pre = '1', now = ''; // 2)循环解决 n-1 次,一直解决 pre、now 值 for (let i = 0; i < n - 1; i++) { // 2.1)依据 pre 值,计算出 now 值 const preLength = pre.length; let count = 1; for (let j = 0; j < preLength; j++) { if (pre[j] === pre[j + 1]) { count++; } else { now += count + '' + pre[j]; count = 1; } } // 2.2)将 now值 赋值给 pre 值,now 置为 '',接着进行下一次循环解决 ——> 依据 pre 值,计算出 now 值 pre = now; now = ''; } // 3)返回后果 pre值 return pre;}2 计划21)代码: ...

January 8, 2022 · 2 min · jiezi

关于算法:天池数据集|精品数据集推荐工业篇

数据是人工智能时代重要的生产因素,高质量训练数据对深度学习模型的建设和优化有关键性的作用,建设大规模、高水准的标注数据集,是推动AI科研和技术后退的驱动力。制造业是我国国民经济的主体,推动数字化转型,降本增质提速是当今制造业的倒退方向。天池通过举办大数据比赛,心愿通过技术创新的形式来推动了产业的翻新倒退。AI模型的落地离不开高质量数据集的撑持,天池平台凋谢出一批高标准严要求下实在业务场景的数据,涵盖纺织、食品饮料、非金属制品等行业,小萌喵明天就带大家一起来看看天池上凋谢的工业数据集。 布匹瑕疵检测数据集钻研方向:工业质检/指标检测2016年我国布匹产量超过700亿米且产量始终处于回升趋势。布料与人们日常生活接触亲密,纺织行业在我国国民经济中所占的位置显而易见。工厂生产时,对大量布匹的质检通常都是工人肉眼实现的,这种模式检测速度慢、劳动强度大,而且受到工人主观因素影响,将人工智能和计算机视觉技术利用于纺织行业,能够进一步助力纺织行业的自动化,升高对人工的依赖,晋升布匹疵点测验的准确度,晋升布样疵点质检的成果和效率。 天池凋谢布匹疵点数据集,蕴含瑕疵各异的布匹照片,每张照片含素色布的一个或多种瑕疵。 理解更多详情/下载应用数据集请戳:https://tianchi.aliyun.com/da... 瓶装白酒疵品检测数据集钻研方向:工业质检/指标检测与布匹生产流程相似,在瓶装酒的生产过程中,受到原材料品质(酒瓶)以及加工工艺(灌装)等因素的影响,产品中可能存在各类瑕疵影响产品质量。但跟布匹不同的是,酒瓶上的瑕疵面积较小不容易被发现,并且瑕疵品种多,通常一条产线个别须要有三到五个质检环节别离检测不同类型的瑕疵。目前瓶装酒厂家只能抉择投入大量人力用于产品质检。如果能够引进高效、牢靠的自动化质检能够升高大量人工成本同时进步质检效,是十分有意义的工作。 天池提供白酒疵品数据集,数据集中白酒瓶身存在的各种瑕疵,包含:瓶盖瑕疵、标贴瑕疵、喷码瑕疵。 如需查看数据集更多具体内容请戳:https://tianchi.aliyun.com/da... 瓷砖外表暇疵检测数据集钻研方向:工业质检/指标检测以抛釉砖为例的瓷砖生产环节个别通过原材料混合研磨、脱水、压胚、喷墨印花、淋釉、烧制、抛光,最初进行品质检测和包装。得益于产业自动化的倒退,目前生产环节已根本实现无人化。而品质检测环节仍大量依赖人工实现。一般来说,一条产线须要配2~6名质检工,这样的质检形式效率低下、质检品质档次不齐、老本又居高不下。瓷砖的外表是用户掂量瓷砖品质的最直观规范,是瓷砖行业生产和品质治理的重要环节,也是困扰行业多年的技术瓶颈,同时长时间肉眼在强光下察看瓷砖外表寻找瑕疵也对工人的视力也会产生影响。如果能在技术上解决上述问题,无疑是有很大的经济价值和社会意义。 为了推动AI技术利用到传统的行业,天池推出瓷砖数据集,该数据集内含的数据笼罩到了瓷砖产线所有常见瑕疵,包含粉团、角裂、滴釉、断墨、滴墨、B孔、落脏、边裂、缺角、 砖渣、白边等。还有一些缺点只能在特定视角才能够察看,包含低角度光照黑白图、高角度光照黑白图、黑白图,保障笼罩到生产环境中产生的所有瑕疵能被辨认,是国内首个聚焦在瓷砖瑕疵质检的数据集。数据集下载请戳:https://tianchi.aliyun.com/da... 以上所有数据都是在业余人员领导下,通过产线上架设业余拍摄设施、实地采集生产过程实在的数据,保障了数据起源的可靠性和科学性。 在数据标注过程中,达摩院的算法专家们对数据品质进行了全程把关,保障了天池数据集的品质。 对于天池数据集天池数据集是阿里团体的科研数据集开放平台,数据集笼罩了新批发、娱乐、医疗衰弱、交通、平安、能源、自然科学等十多个行业,涵盖了数据挖掘、机器学习、自然语言解决、计算机视觉、决策优化等前沿的技术畛域。小伙伴们能够点击下方浏览原文进入官网进行查看,还有更多宝藏数据等你发现。

January 7, 2022 · 1 min · jiezi

关于算法:7次KDD-CupKaggle冠军的经验分享从多领域优化到AutoML框架

反馈疾速,竞争强烈的算法较量是算法从业者晋升技术水平的重要形式,从若干行业外围问题形象出的算法较量具备很强的实际意义。本文联合笔者在7次Kaggle/KDD Cup中的冠军教训,对于多领域建模优化,AutoML技术框架,以及面对新问题如何剖析建模三个方面进行了介绍。心愿可能让读者播种较量中的通用高效建模办法与问题了解思路。1 背景与简介反馈疾速、竞争强烈的算法较量是算法从业者晋升技术水平的重要形式。从若干行业外围问题中形象出的算法较量题目具备很强的实际意义,而较量的实时积分榜促使参加者不断改进,以试图超过以后的最佳实际,而且获胜计划对于工业界与学术界也有很强的推动作用,例如KDD Cup较量产出的Field-Aware Factorization Machine(FFM)算法[1]、ImageNet较量产出的ResNet模型[2]在业界都有着宽泛的利用。 美团到店广告品质预估团队在美团外部算法大赛MDD Cup中取得了第一名,受大赛组委会的邀请,心愿分享一些比拟通用的较量教训。本文是笔者7次Kaggle/KDD Cup冠军教训(如下图1所示)的分享,心愿能帮忙到更多的同学。 大家都晓得,Kaggle/KDD Cup的较量均为国内顶级赛事,在较量圈与工业界有着很大的影响力。具体而言,Kaggle是国内上最大的顶级数据挖掘平台,领有寰球几十万用户,通过高额奖金与分享气氛产出了大量优良算法计划,例如Heritage Health奖金高达三百万美元。目前,Kaggle较量在艾滋病钻研、棋牌评级和交通预测等方面均获得了突出成绩,得益于此,Kaggle平台起初被Google公司收买。 ACM SIGKDD (国内数据挖掘与常识发现大会,简称 KDD)是数据挖掘畛域的国内顶级会议。KDD Cup较量是由SIGKDD主办的数据挖掘钻研畛域的国内顶级赛事。从1997年开始,每年举办一次,是目前数据挖掘畛域最具影响力的赛事。该较量同时面向企业界和学术界,星散了世界数据挖掘界的顶尖专家、学者、工程师、学生等加入,为数据挖掘从业者们提供了一个学术交流和研究成果展现的平台。 通过剖析不难发现,KDD Cup举办20年来,始终紧密结合工业界前沿与热点问题,演进次要分为三个阶段。第一阶段从2002年左右开始,专一于互联网的热点举荐零碎方面问题,包含举荐、广告,行为预测等;第二阶段聚焦在传统行业问题,比拟关注教育、环境、医疗等畛域;而在第三阶段,自2019年以来,重点关注非监督问题,例如AutoML、Debiasing、强化学习等问题,这类较量的独特特点是通过以前办法难以解决现有的新问题。这三个阶段趋势也肯定水平反馈着以后工业界与学术界的难点与重点,无论从形式、办法,还是从问题维度,都呈现出从窄到宽,从规范向非标准演进的趋势。 本文会先介绍笔者的7次KDD Cup/Kaggle较量冠军的计划与了解,问题波及举荐、广告、交通、环境、人工智能公平性等多个畛域问题。接着会介绍在以上较量中施展关键作用的AutoML技术框架,包含自动化特色工程,自动化模型优化,自动化模型交融等,以及如何通过该技术框架系统性建模不同的问题。最初再介绍以上较量造成的通用办法,即面对一个新问题,如何进行剖析、了解、建模、与挑战解决、从而实现问题的深度优化。 本文次要面向以下两类读者,其余感兴趣的同学也欢送理解。 算法较量爱好者,心愿了解国内数据挖掘顶级较量冠军计划的办法与逻辑,获得更好的名次。工业界工程师与研究员,借鉴较量办法,利用于理论工作,获得更优的后果。2 多领域建模优化本局部将咱们将以上较量分为三个局部进行计划介绍,第一部分为举荐零碎问题;第二局部为工夫序列问题,跟第一局部的重要差异在于预测的是将来的多点序列,而非举荐零碎的单点预估;第三局部为自动化机器学习问题,该问题较量输出不为繁多数据集,而是多问题的多数据集,并且在最终评估的b榜数据集问题也是未知的。因而,对于计划的鲁棒性要求十分高。如表1所示,后续将具体介绍七个较量赛道的获胜计划,但会合并为五个外围解决方案进行具体的介绍。 2.1 举荐零碎问题本节次要介绍Kaggle Outbrain Ads Click Prediction和KDD Cup 2020 Debiasing较量。二者工作都是面向用户下一次点击预估问题,但因为利用场景与背景的不同,存在着不同的挑战:前者的数据规模宏大,波及到数亿个用户在千级别数量异构站点上的数十亿条浏览记录,对模型优化、交融有着严格的要求;后者则尤为关注举荐零碎中的偏差问题,要求参赛选手提出无效的解决方案,来缓解选择性偏差以及风行度偏差,从而进步举荐零碎的公平性。本节将别离介绍这两场较量。 Kaggle Outbrain Ads Click Prediction:基于多层级多因子的模型交融计划比赛问题与挑战:比赛要求在Outbrain网页内容发现平台上,预估用户下一次点击网页广告,具体参考:Kaggle Outbrain较量介绍详情[26]。参赛选手会面对以下两个重要挑战: 异构性:平台提供需求方平台(DSP)广告投放服务,波及到用户在数千个异质站点上的行为刻画。超高维稠密性:特色高维稠密,数据规模宏大,蕴含了7亿个用户、20亿次浏览记录。基于多层级多因子的模型交融计划:针对本次赛题的挑战,咱们队采纳了基于多层级多因子的模型交融计划来进行建模。一方面对于异构站点行为,繁多模型不易于全面刻画,另一方面,亿级别的数据规模给多模型的别离优化带来了较大的空间。因为FFM具备弱小的特色穿插能力以及较强的泛化能力,能更好地解决高维稠密特色。因而,咱们抉择该模型作为交融基模型的主模型。模型交融通过不同模型学习到有差异性的内容,从而无效开掘用户在不同站点上的异质行为。模型交融的要害是产生并联合“好而不同”的模型3。基于多层级多因子的模型交融计划首先通过模型差异性、特色差异性多个角度来结构模型之间的差异性,而后通过多层级以及应用基学习器的多特色因子(模型pCTR预估值、隐层表征)进行交融: 具体地,如上图3所示。第一层级的目标是构建出有差异性的单个模型,次要通过不同类型的模型在用户最近行为、全副行为数据以及不同特色汇合上别离进行训练,来产生差异性。第二层级则通过不同单个模型的组合进一步产生差异性,差异性的晋升来源于两个方面,别离是模型组合形式的不同(用不同模型,依据单模型特色进行打分)以及用于模型组合的特色因子的不同,这里特色因子包含模型的打分以及模型中的隐层参数。第三层级则是思考如何将不同交融后果组合在一起。因为划分进去的验证数据集较小,如果应用简单非线性模型往往容易过拟合。所以这里应用了一个基于束缚的线性模型来取得第二层级模型的交融权重。 上述计划同咱们业务中模型相比,采纳更多的模型交融,在获得高精度的同时产生了更高的开销,而在理论业务中要更加重视成果与效率的均衡。 KDD Cup 2020 Debasing:基于i2i多跳游走的Debiasing计划比赛问题与挑战:比赛是以电子商务平台为背景,预估用户下一次点击的商品。并围绕着如何缓解举荐零碎中的选择性偏差以及风行度偏差进行开展,具体参考:KDD Cup 2020 Debiasing较量介绍详情[27]。举荐零碎中的偏差问题有很多,除了上述两种偏差,还有曝光偏差、位次偏差等等5。咱们团队之前也对位次偏差进行了相干钻研[7]。而本次比赛为了更好地掂量举荐系统对历史低热度商品的举荐成果,选手的问题次要采纳NDCG@50_half指标进行排名。该指标是从整个评测数据集中取出一半历史曝光少的点击商品,因为是低热度且有被点击的商品,能够跟更好的评估偏差问题。本次较量蕴含了以下挑战: 赛题只提供点击数据,结构候选集时须要思考选择性偏差问题。不同商品热度差别大,商品历史点击次数出现一个长尾散布,数据存在重大的风行度偏差问题,并且评估指标 NDCG@50_half 用于考查低热度商品的排序品质。基于i2i游走的Debiasing排序计划:咱们的计划为基于i2i建模的排序框架。如图所示,整体流程蕴含四个阶段:i2i构图与多跳游走、i2i样本构建、i2i建模以及u2i排序。前两个阶段解决了选择性偏差问题,后两个阶段则侧重于解决风行度偏差问题。 第一个阶段是基于用户行为数据和商品多模态数据构建i2i图,并在该图上多跳游走生成候选样本。这种形式扩充了商品候选集,更好地近似零碎实在候选集,缓解了选择性偏差。 第二个阶段是依据不同i2i关系计算i2i候选样本的类似度,从而决定每种i2i关系下候选样本的数量,最终造成候选集。通过不同候选的构造方法,摸索出更多有差别的候选商品,能够进一步缓解选择性偏差问题。 第三个阶段包含基于i2i样本集的自动化特色工程,以及应用风行度加权的损失函数进行打消风行度偏差的建模。自动化特色工程中蕴含了商品多模态信息的刻画,这类信息可能反馈商品在热度信息以外的竞争关系,可能肯定水平上缓解风行度偏差问题。而风行度加权的损失函数定义如下: 其中,参数与风行度成反比,来减弱风行商品的权重,从而打消风行度偏差。参数是正样本权重,用于解决样本不均衡问题。 第四个阶段首先将i2i打分通过Max操作进行聚合,突出打分汇合中低热度商品的高分信号,从而缓解风行度偏差问题。而后对商品列表的打分联合商品热度进行调整解决,进而缓解风行度偏差问题。 对于该较量的更多细节,大家能够参考《KDD Cup 2020 Debiasing较量冠军技术计划及在美团的实际》一文。 2.2 工夫序列问题时序系列问题:工夫序列问题相比于举荐零碎问题的有较大差别。在工作上,举荐零碎预测的是将来单个点,而工夫序列预测将来多个点;在数据上,举荐零碎通常蕴含用户、商品、上下文等多维信息,工夫序列通常蕴含工夫空间上变动的数值序列信息。 ...

January 7, 2022 · 4 min · jiezi

关于算法:QConOPPO大规模CV预训模型技术及实践

1 什么是预训练模型?为什么咱们须要预训练模型?预训练模型是晋升深度学习算法性能的一种罕用伎俩。所谓预训练模型,能够概括为是某种深度学习的网络架构,并且蕴含这个网络架构在海量数据上训练好的一组权重。有了网络架构和权重后,咱们就能够用它作为某一具体视觉工作的骨干网络,并提供初始化参数。这样一来,具体的上游工作就有了一个较好的训练终点,在缩小摸索空间的同时,还可能实现更好的算法性能。 那么咱们为什么须要预训练模型呢?在这里做一个比喻,如果把深度学习算法比作武侠的话,那预训练模型就是他的内功,有了扎实的内功根底,就可能更容易、更疾速的把握各种文治招式,并施展其最大效用。预训练模型的过程就是深度学习算法修炼内功的过程。 2 OPPO自研大规模cv预训练模型2.1 概述之所以要自研预训练模型次要是两点起因:首先,以后数据科学家们应用的预训练模型都是网上开源的,每年都有变动,最新的一些钻研往往不开源,无奈保障成果最优;其次就是网上开源的预训练模型,都是基于开源数据集数据集训练失去的,比方大家熟知的imagenet。没有充分利用公司自有数据的劣势。因而,自研预训练模型是非常有意义的。 OPPO自研大规模cv预训练模型技术计划次要包含以下三大部分: 网络架构翻新:次要是钻研以后cv界支流模型架构如CNN,Transformer和MLP等,对不同构造以后SOTA的网络架构进行组合、优化的摸索,尽可能的失去性能最优的网络架构作为预训练模型的骨干网络。自监督学习训练:次要是心愿可能充分利用oppo自有的海量无标注数据,在海量无标注数据下进行预训练,从而失去更加通用的特色表白,让模型可能更好地克服OOD(与训练集散布不同)状况,失去更加鲁棒的预训练模型。有监督微调训练:当利用具体的工作数据集(标注样本)对预训练模型的网络参数进行微调训练时,应用适合的训练方法及正则办法,能够使模型在具体上游工作达到最优成果。2.2 关键技术2.2.1 网络架构设计在网络架构方面,咱们的指标是设计适合的网络架构,放大特色摸索空间,晋升网络性能。为了可能更适宜接入不同的浓密场景视觉工作,咱们的网络架构须要设计成一种多阶段的层次结构来提供多尺度的特色图,并且咱们的网络要易于拓展成不同参数量级的变体模型,以满足不同业务场景的需要同时要在参数量和浮点数计算量更低的条件下尽可能的晋升网络的性能。 以后计算机视觉畛域三大支流模型架构包含卷积神经网络CNN,Transfomer以及多层感知机MLP。其中CNN多年来始终是计算机视觉工作中占据主导地位的网络架构,CNN善于提取部分细节特色,并且具备形变、平移及缩放不变性等长处。Transformer在NLP畛域获得了微小的胜利,去年首次在CV界亮相开始引领新的趋势,Transformer的长处是善于捕捉全局信息, 具备更大的模型容量,且其运作机制更靠近人类。在Transformer崛起的同时,一部分钻研聚焦于MLP代替Transformer组件构建网络的钻研,开拓了另一个钻研方向,MLP 在小的模型规模下能够实现靠近Transformer的性能,但当规模扩充时,它就会受到重大的过拟合影响。 通过对这三种支流模型架构进行钻研剖析后,咱们失去了以下一些论断:对于MLP 来说,它的钻研聚焦在替换 Transformer组件来取得绝对有竞争力的后果,然而实际效果并没有超过基于transformer的办法,这系列工作只是肯定水平上开辟了一个新的思路。CNN中的卷积操作善于提取图片的部分信息,而Transformer通过结构图像tokens提取到图片的全局示意,因而CNN和Transformer在肯定水平上能够造成良好的互补。还有就是Transformer 在三种架构中具备最大的模型容量,更适宜做大规模预训练模型。因而,Transformer 加 CNN的架构或者是最优的解决方案。 既然咱们要聚焦于Transformer办法,咱们就先要对Transformer的基本原理有肯定的理解,以便对其进行改良。所以接下来我先对Transformer进行简略介绍。Transformer构造是google在17年的Attention Is All You Need论文中提出的,在NLP的多个工作上获得了十分好的成果。它最大特点是整个网络结构齐全是由Self-Attention机制组成。如图一所示,Transformer采纳Encoder-Decoder构造,输出通过 embedding后,要做地位编码,而后是多头自注意力机制,再通过Feed Forward,每个子层有残差连贯,最初要通过Linear和softmax输入概率。 其中: 残差构造是为了解决梯度隐没问题,能够减少模型的复杂性。其中的Norm指的是LayerNorm操作,LayerNorm是为了对attention层的输入进行散布归一化。计算机视觉中常常会用的batchNorm是对一个batchsize中的样本进行一次归一化,而LayerNorm则是对一层进行一次归一化,二者的作用是一样的,只是针对的维度不同。Feed Forward是两层全连贯加激活函数的构造。是为了应用非线性函数来拟合数据。其中第一层全连贯用来进行非线性性函数拟合,第二层全连贯用于调整输入维度。退出地位编码(Positional Encoding)次要是因为self-attention机制没法捕获地位信息,因而须要通过地位编码来改善。Transformer构造中咱们最须要关注的是self Attention机制的原理,所谓Self Attention就是句子中的某个词对于句子自身的所有词做一次Attention。当以一个词为核心进行Self Attention时,每个词都要通过三个矩阵Wq, Wk, Wv进行一次线性变换,一分为三,生成每个词本人的query, key, value三个向量,也就是公式中的大Q,K,V,而后通过如下公式进行计算,作为这个词的输入。最终每个Self Attention承受n个词向量的输出,输入n个聚合的向量。这么做的目标是保留关注词的value值,减弱非相干词的value值。 而Multi-Head self- Attention就是将上述的Attention做h遍,而后将h个输入进行concat失去最终的输入。Transformer的工程实现中,为了进步Multi-Head的效率,将W扩充了h倍,而后通过reshape和transpose操作将雷同词的不同head的Q、K、V排列在一起进行同时计算,实现计算后再次通过reshape和transpose实现拼接,相当于对于所有的head进行了一个并行处理。到此为止咱们对Transformer构造有了初步的理解。 在20年,提出的ViT是首个基于纯Transformer的构造来做图像分类工作的网络,算是transformer在图像上利用的开山之作,后续所有基于Transformer的网络架构都是基于此模型进行的革新。 ViT的构造如图二所示,它就是后面讲到的一个典型的Transformer构造: 首先将一张的图像,分成互不交叠相等大小图像块,而后将每个图块进行展平并对每一个展平后的图块向量做一个线性变换进行降维,作为Transformer的输出。这里的每一个图块就是一个Token,也就是NLP中句子中的一个词。 ViT给输出的Token追加了一个分类向量,用于Transformer训练过程中的类别信息学习,与其余图块向量一起输出到Transformer编码器中,最初取第一个向量作为类别预测后果。 为了放弃输出图像块之间的空间地位信息,对图像块中增加一个地位编码向量,这种在进行self-attention之前就退出了地位信息的形式叫做相对地位编码,前面还会对地位编码进行一些介绍,此处不再赘述。 因为ViT是一个非层次结构的网络,不适宜用于浓密场景的视觉工作,并且计算复杂度绝对较高。在后续的钻研中,研究者们用各种方法去从不同的角度对他进行改良。 那么咱们是如何做的呢? 第一点,咱们心愿失去一种更通用的骨干网络架构,而不是针对不同的视觉工作设计不同的网络,因而要设计一种层次结构的网络,能够提供多尺度的特色图。实现层次结构的形式能够采纳pixelShuffle, 卷积降采样等伎俩,来调整特色图尺度与输入维度,从而失去多个阶段的层次结构网络; 第二点,咱们要对对注意力机制进行革新。原始的Transformer在计算注意力机制时须要计算一个Token与其余所有Token之间的关系,计算复杂度为Token数量的二次型。为了能更高效的建模,局部钻研对注意力机制的计算进行了革新,次要包含:halo,shifted window,CrossShape等; 第三点就是将Transformer与CNN进行无效的交融。视觉工作中部分特色建模是十分无效且至关重要的,而部分特色建模是CNN所善于的。已有钻研证实,以适当的形式叠加卷积层和Transformer层,能够无效地晋升网络的整体性能。也有钻研将卷积融入到Transformer中,用卷积代替线性变换来计算Q,K,V矩阵,能够使Transformer对部分特色的建模能力失去晋升。最初是对地位编码的改良。因为自注意力机制具备排列不变性,即不同排列的输入后果是一样的。为了补救这个缺点。如图三(a)所示,相对地位编码是在进行Self-attention之前就退出了地位信息。图三(b)所示为绝对地位编码,是在计算权重矩阵的过程中退出绝对地位信息。图三(c)所示为地位加强编码,它间接将地位信息退出到Value中,具体实现是用一个Depth-wise Conv对value进行卷积,而后将后果退出到了self attention的后果中。 对于咱们的网络架构,能够看做是一个四个阶段的体系结构: 首先通过一组卷积序列对图像进行分块操作生成Tokens,为了产生档次示意,相邻的两个阶段之间咱们采纳另一组卷积序列是Tokens数量减半,通道维数加倍。这样就产生了多阶段的层次结构,可提供多尺度特色图,不便作为骨干网络接入到浓密场景视觉工作中。 从与CNNs联合的角度去看,能够看做是一个多阶段Transformer模块与一个EfficientNetV2-like的构造嵌套组合而成,实现了卷积与Transfomer的无效交融,在模型参数量和浮点数计算量更低的状况了大幅晋升了网络性能。 在计算多头自注意力时,咱们应用改良的计算机制,shifted-window + conv 和CrossShape两种办法,晋升Trasnformer计算效率的同时,网络性能也失去了进一步晋升。 对于地位编码局部咱们应用了绝对地位编码和部分加强地位编码两种形式,经试验验证这两种地位编码方式在分类工作上根本无差别,但在浓密场景工作(如检测、宰割等)时,部分加强地位编码性能更优。 ...

January 7, 2022 · 2 min · jiezi

关于算法:开课吧AI算法落地与工程部署实战

开课吧-AI算法落地与工程部署实战如果你是Maven开发者,使用起来非常便利,我的项目的保护人员已经将依赖推送至地方仓库。只需要引入依赖就实现了90%的工作量。接下来只需要在登录接口中进行二次考据就可能了。 我的项目集成了包含html、vue、flutter、uni-app、Android Kotlin、IOS、php等多种前端语言,可能轻松将AJ_Captcha集成到我的项目中。 接下来咱们以Spring Boot+html为例看看如何疾速集成AJ_Captcha实现行为考据码的交互流程。 第一步、Spring Boot中引入AJ_Captcha依赖 com.anji-plusspring-boot-starter-captcha1.2.9复制代码AJ_Captcha默认实现了考据码生成和考据接口,考据码生成接口的默认请求地址是/captcha/get,考据接口的默认请求地址为/captcha/check。也就是说实现以上步骤,就可能提供应前端获取和考据考据码的接口了。如果你还想让你的考据码生成的共性一点,可能配置以下属性: 滑动考据,底图路径,不配置将使用默认图片反对全路径反对我的项目路径,以classpath:结尾,取resource目录下路径,例:classpath:images/jigsawaj.captcha.jigsaw=classpath:images/jigsaw 滑动考据,底图路径,不配置将使用默认图片反对全路径反对我的项目路径,以classpath:结尾,取resource目录下路径,例:classpath:images/pic-clickaj.captcha.pic-click=classpath:images/pic-click 对于分布式部署的利用,咱们倡导利用自己实现CaptchaCacheService,比如用Redis或者memcache,参考CaptchaCacheServiceRedisImpl.java如果利用是单点的,也没有使用redis,那默认使用内存。内存缓存只适合单节点部署的利用,否则考据码生产与考据在节点之间信息不同步,导致失败。!!! 注意啦,如果利用有使用spring-boot-starter-data-redis,请打开CaptchaCacheServiceRedisImpl.java正文。redis -----> SPI: 在resources目录新建META-INF.services文件夹(两层),参考以后服务resources。缓存local/redis...aj.captcha.cache-type=local local缓存的阈值,达到这个值,清除缓存aj.captcha.cache-number=1000local定时清除过期缓存(单位秒),设置为0代表不执行aj.captcha.timing-clear=180spring.redis.host=10.108.11.46spring.redis.port=6379spring.redis.password=spring.redis.database=2spring.redis.timeout=6000考据码类型default两种都实例化。aj.captcha.type=default 汉字对立使用Unicode,保障程序通过@value读取到是中文,可通过这个在线转换;yml格局不需要转换https://tool.chinaz.com/tools... 中文转Unicode右下角水印文字(我的水印)aj.captcha.water-mark=\u6211\u7684\u6c34\u5370 右下角水印字体(不配置时,默认使用文泉驿正黑)因为宋体等涉及到版权,咱们jar中内置了开源字体【文泉驿正黑】形式一:间接配置OS层的现有的字体名称,比如:宋体形式二:自定义特定字体,请将字体放到工程resources下fonts文件夹,反对ttf\ttc\otf字体aj.captcha.water-font=WenQuanZhengHei.ttf点选文字考据码的文字字体(文泉驿正黑)aj.captcha.font-type=WenQuanZhengHei.ttf校验滑动拼图容许误差偏移量(默认5像素)aj.captcha.slip-offset=5 aes加密坐标开启或者禁用(true|false)aj.captcha.aes-status=true 滑动烦扰项(0/1/2)aj.captcha.interference-options=2 aj.captcha.history-data-clear-enable=false 接口请求次数一分钟限度是否开启 true|falseaj.captcha.req-frequency-limit-enable=false 考据失败5次,get接口锁定aj.captcha.req-get-lock-limit=5 考据失败后,锁定工夫间隔,saj.captcha.req-get-lock-seconds=360 get接口一分钟内请求数限度aj.captcha.req-get-minute-limit=30 check接口一分钟内请求数限度aj.captcha.req-check-minute-limit=60 verify接口一分钟内请求数限度aj.captcha.req-verify-minute-limit=60复制代码第二步、前端伪代码调用接口 引入考据码的样式以及考据等文件考据码获取及考据 复制代码考据码考据胜利之后,会返回一个用于二次考据的串码。 第三步,用户登录,二次考据客户端登录的时候携带考据胜利后返回的串码,在登录接口中进行二次考据,考据流程完毕。 @Autowiredprivate CaptchaService captchaService;/** 页面获取token大屏数据校验@param user@return */@PostMapping("getWebToken")public ResultBean getWebToken(@RequestBody LoginUser user,String captchaVerification){ ResultBean resultBean = new ResultBean();CaptchaVO captchaVO = new CaptchaVO();captchaVO.setCaptchaVerification(captchaVerification);ResponseModel responseModel = captchaService.verification(captchaVO);if(!responseModel.isSuccess()){ resultBean.fillCode(0,responseModel.getRepMsg()); return resultBean;}// 考据通过后,持续登录流程}复制代码明天的内容就介绍到这里了,趁这个机会,试着使用这款高颜值的行为考据码来替换我的项目中的图形考据码吧。 download

January 5, 2022 · 1 min · jiezi

关于算法:左神算法与数据结构全阶班

download:左神-算法与数据结构全阶班为什么要对SpringBoot返回对立的标准格局在默认情况下,SpringBoot的返回格局常见的有三种: 第一种:返回 String @GetMapping("/hello")public String getStr(){ return "hello,javadaily";}复制代码此时调用接口获取到的返回值是这样: hello,javadaily复制代码第二种:返回自定义对象 @GetMapping("/aniaml")public Aniaml getAniaml(){ Aniaml aniaml = new Aniaml(1,"pig"); return aniaml;}复制代码此时调用接口获取到的返回值是这样: { "id": 1, "name": "pig"}复制代码第三种:接口异样 @GetMapping("/error")public int error(){ int i = 9/0;return i;}复制代码此时调用接口获取到的返回值是这样: { "timestamp": "2021-07-08T08:05:15.423+00:00", "status": 500, "error": "Internal Server Error", "path": "/wrong"}复制代码基于以上种种情况,如果你和前端开发人员联调接口她们就会很懵逼,因为咱们没有给他一个对立的格局,前端人员不知道如何处理返回值。 还有甚者,有的同学比如小张喜爱对后果进行封装,他使用了Result对象,小王也喜爱对后果进行包装,然而他却使用的是Response对象,当出现这种情况时我相信前端人员肯定会抓狂的。 所以咱们我的项目中是需要定义一个对立的标准返回格局的。 定义返回标准格局一个标准的返回格局至多蕴含3部分: status 状态值:由后端对立定义各种返回后果的状态码message 描述:本次接口调用的后果描述data 数据:本次返回的数据。{ "status":"100", "message":"操作胜利", "data":"hello,javadaily"}复制代码当然也可能按需加入其余扩大值,比如咱们就在返回对象中增加了接口调用工夫 timestamp: 接口调用工夫定义返回对象@Datapublic class ResultData<T> { /* 后果状态 ,具体状态码参见ResultData.java/ private int status; private String message; private T data; private long timestamp ; public ResultData (){ ...

January 5, 2022 · 1 min · jiezi

关于算法:恒源云字节跳动的mRASP预训练模型真香

文章起源 | 一个专一 AI 行业的共享算力平台:恒源云 原文地址 | mRASP预训练模型 原文作者 | 角灰 预计大佬们最近不是在考试,就是在放假,所以都不在社区发文章了没方法,只能在茫茫帖子里深挖,哎嘿,这不就是巧了嘛,还真的有一篇漏网之鱼! 废话少说,正片开始: 1.引言最近在看机器翻译文献时,经常望卡兴叹,尤其是facebook是真的壕,训练25种语言的mBart就用256张卡训练了20天,更不用说是mBart50。偶尔发现这篇字节的mRASP( Random Aligned Substitution Pre-training )模型号称只须要8卡一周,几乎太香了!(还是跑不起啊orz)论文为:Pre-training Multilingual Neural Machine Translation by Leveraging Alignment Information,内容如下: 2.摘要:本文想构建一个对立的机器翻译模型,在提供任意语言对的状况下,能够疾速适应新语言。于是提出一种通用的多语言机器翻译预训练模型:mRASP(多语言随机对齐预训练) ,在32种语言上进行预训练(双语数据),而后在42个翻译方向上进行微调,后果证实在低、中、高乃至零资源翻译上都有十分大的晋升。本文首次验证多语言模型能晋升富资源语言的成果。 3.论断:mRASP能够使跨语言的同义词在嵌入空间上靠近,在低、中、高和零资源数据上证实了模型效性。通过剖析试验,发现对齐信息的确能不同语言语义上的鸿沟,并晋升性能。将来工作是摸索更多词对齐的办法,并在大规模数据上预训练进一步晋升性能。 4.介绍:1.本文认为预训练模型在nmt工作上的限度在于:(1)预训练的bert不能间接微调到nmt,除非用些简单的方法。(2)预训练指标和上游工作(nmt)的训练指标有差别:如mass、mbart应用自编码器(降噪),和翻译工作不同,因而微调之后收益无限。(3)现有的多语言预训练方法仅能晋升中、低资源翻译,而非任意语料对,尤其是对富资源上成果没有显著晋升。(想想看人类学会多种语言后再学其余语言应该会很快) 2.本文应用随机对齐替换使模型能弥合跨语言的鸿沟(见下),充分利用多语言常识,使得雷同语义的语言在表征空间靠近。mRASP在极其短少平行语料(<10w),能达到22bleu。 3.提出了异国翻译的四种分类法:(1)Exotic Pair:微调时的源语言和目标语言在预训练时各自独自呈现过,然而没有成对训练;(2)Exotic Source:微调时的源语言没有在预训练时呈现,只预训练过目标语言;(3)Exotic Target:微调时的目标语言没有在预训练时呈现,只预训练过源语言;(4)Exotic Full:微调的两端语言在预训练中都没呈现过(巨难); 4.奉献(1)应用上亿对双语语料进行预训练,而不像其余模型一样用大量单语预训练。本文认为预训练和微调有统一的指标有利于nmt晋升;(2)提出RAS,可能弥合跨语言的语义空间;(3)在42个方向上获得微小晋升,在预训练中源、目标语言都没有的极其状况(Exotic Full)获得14的bleu,在富语言en-fr上能进一步获得晋升44.3bleu。 5.模型:5.1.构造 采纳transformer-large,编码器解码器各6层,嵌入维度1024,14个head,激活函数换为GeLU,并应用可学习的地位嵌入。 5.2.随机对齐替换 不多说,先上图: 源句是:“ I like singing and dancing”,指标句是:“J’adore chanter et danser <EOS>”随机对齐替换就是无监督MUSE办法构建词典,而后随机替换掉源句种的“singing ”和“dancing”,编码器输出变为:“I like chanter and danser”,解码器的生成指标不变。咱们晓得一个词的词义是由其上下文决定的,因而把“chanter ”放到和“singing”同样的语境下,他们在嵌入空间的间隔就拉近了,从而达到跨语言语义相近的目标。换成公式就是如下: L={L1,…Lm}为预训练的语言汇合,xi代表语言Li中的某个句子。Dij是平行语料,N是平行语料数。C是对齐函数,用于把源句中的单词替换为随机语言对应的词。在翻译方向为(xj,xi)时,指标函数使源语句xj在经随机替换后C(xj)条件下,失去翻译后果xi的概率最大,即最小化化负对数似然。 5.3.语言标识为辨别不同翻译对,在源和指标语句之前简略增加语言标识: 5.4.灵感起源: 最近的工作证实,跨语言模型预训练可能是一种更无效的办法来进行表征学习。然而在预训练时,跨语言信息是从共享子词表取得的,有如下局限:(1)共享词汇表十分系数,尤其是在不同的语言对上(状态上齐全不一样,如英汉)(2)即便是雷同的子词,在不同语言中也可能示意不同意思。(3)参数共享的办法不足明确的监督信号,来疏导跨语言中雷同意思词共享雷同的语义空间因而本文为了弥合跨语言语义的鸿沟,提出了RAS随机对齐替换的办法。 5.5 PC32(PARALLEL CORPUS 32) 收集了32个英文为核心的语言,64个翻译方向,统称为PC32,共蕴含197m平行语料 5.6 预训练细节 ...

January 5, 2022 · 1 min · jiezi

关于算法:cs61b-week7-Asymptotics-I

1.问题引入从本周起正式进入cs61b的后半局部课程,数据结构,思考一个问题: 现有一个有序数组,查找数组中是否有反复项 算法1:逐项比拟,比方A[0]别离与A[1],A[2],A[3]......A[n]比拟,之后再从A[1]开始,与A[2],A[3]....A[n]比拟,A[2]与A[3],A[4]....比拟,以此类推。 显然算法1并未充分利用数组有序性的特点,因而算法2:因为数组是有序的,因而咱们只须要比拟相邻两项即可,反复的元素肯定位于相邻两项。即A[0]与A[1]比拟,A[1]与A[2]比拟,A[2]与A[3]比拟....A[n-1]与A[n]比拟。 应用Java实现以上两种算法,别离是 //算法1public static boolean dup1(int[] A) { for (int i = 0; i < A.length; i += 1) { for (int j = i + 1; j < A.length; j += 1) { if (A[i] == A[j]) { return true; } } } return false;}//算法2public static boolean dup2(int[] A) { for (int i = 0; i < A.length - 1; i += 1) { if (A[i] == A[i + 1]) { return true; } } return false;}那么当初的问题是:算法1与算法2哪个更好?判断规范是什么? ...

January 4, 2022 · 2 min · jiezi

关于算法:QConoCPX多目标多场景联合建模在OPPO的实践

1 背景自从 2012 年 Facebook 产品化 oCPX 以来,业内 oCPX 产品和能力的倒退曾经十分的成熟。OPPO 数智工程零碎算法平台部商业化算法也在 oCPX 能力建设上积攒了一些实践经验。 2 oCPX 是什么从某投放平台的定义来看,oCPX 是一种针对成果广告的智能出价投放形式,广告主抉择明确的优化指标(如下载、激活、注册、付费),并给出冀望的转化老本,零碎通过机器学习预估每一次投放机会的转化概率,并联合冀望老本,主动出价,保障老本成果稳固。 o 是 optimize 优化的意思。CPX 是一种扣费形式 ,CPC 是依照点击扣费,CPD 是依照下载扣费,CPM 是依照曝光扣费。所以 oCPC 是一种优化 过的 CPC。oCPC 是按转化出价,按点击扣费;oCPD 是按转化出价,按下载扣费;oCPM 是按转化出价,按展现扣费。 oCPX 有一套出价控制系统,该零碎实时、智能调节广告出价,以保障广告主的转化老本诉求。零碎的控制目标是老本偏差位于 1.0 左近,具体伎俩是通过出价因子 alpha 干涉 eCPM 排序公式从而影响计费金额。其中: 老本偏差 = 广告实际成本 / 广告预期老本eCPM = pctr pcvr TCPA * alpha 如下图所示,CPC 与 oCPC 的出价点和计费点是拆散的,CPC 的出价点在点击上,而oCPC的出价点在点击之后的激活、注册和付费上,两者的相同点是计费点都是点击。 从零碎视角来说 ,CPC 广告须要广告主频繁调价,调整定向,本人保障老本。对平台来说,流量不依照深层价值售卖收益不高。oCPC 广告,对广告主来说,操作简略,只须要设定老本。对平台来说,oCPC 能让流量依照深层价值售卖收益更大 ,然而平台须要做 pcvr 预估和老本保障,对平台要求更高。 3 oCPX 广告在 OPPO 利用商店变现地位介绍OPPO 利用商店有十分多地位,次要的场景有举荐和搜寻。其中举荐场景次要是首页 、相干举荐和热搜, 热搜包含热搜软件和热搜游戏。搜寻场景次要有搜寻联想页和搜寻后果页。联想页其实是 sug,输出 query 然而不点搜寻,上面举荐的 app 算联想页,点击搜寻之后的后果是后果页。 ...

December 30, 2021 · 2 min · jiezi

关于算法:从-RocksDB-看-LSMTree-算法设计

原创不易,转载请注明出处前言目前笔者自己正在基于 Pulsar 搭建公司外部的音讯平台,天然也对其底层存储做了一些钻研。Pulsar 应用 BookKeeper 作为存储层,BookKeeper 底层应用到了 RocksDB 来保留 Entry (BookKeeper 中的数据存储单元) 对应的地位索引。RocksDB 是我始终关注的存储引擎技术,因为之前在调研长久型 KV 存储的时候,发现支流开源的 pika/kvrocks,以及最终选用的云厂商的长久型 KV 存储服务,底层都是基于 RocksDB。还有赫赫有名的 TiDB,其存储引擎也是 RocksDB。 怀着好奇,我开始了对于 RocksDB 的学习,因为 RocksDB 个别用于底层开发,如果不是开发数据存储中间件,日常很难接触到,所以我决定先去学习 RocksDB 的数据结构设计:LSM 树。 本文先是介绍了 RocksDB 对于LSM 树的实现,再总结了 LSM 树的设计思维,也类比了 Elasticsearch Lucene 的存储设计思维,最初将 LSM 树和常见的 B+ 树做了比照。 LSM 树 简介LSM 树,全称 Log-Structured-Merge Tree。初看名字你可能认为它会是一个树,但其实不是,LSM 树实际上是一个简单的算法设计。这个算法设计源自 Google 的 Bigtable 论文 (引入了术语 SSTable 和 memtable )。 基于 LSM 树算法设计实现的存储引擎,咱们称之为 LSM 存储引擎。在 LevelDB、RocksDB、Cassandra、HBase 都基于 LSM 树算法实现了对应的存储引擎。 上面咱们通过 RocksDB 的 LSM 树实现,来具体理解一下 LSM 树的设计思维。如果只想看 LSM 树的设计思维总结,能够跳转到最初的总结局部,私认为总结的还是不错的。 ...

December 29, 2021 · 4 min · jiezi

关于算法:恒源云有关图像平滑的论文小记

文章起源 | 恒源云社区(一个专一 AI 行业的共享算力平台: 恒源智享云) 原文地址 | 图像平滑 原文作者 | instter 学习指标理解图像中的噪声类型理解均匀滤波,高斯滤波,中值滤波等的内容可能应用滤波器对图像进行解决 1 图像噪声因为图像采集、解决、传输等过程不可避免的会受到噪声的净化,障碍人们对图像了解及剖析解决。常见的图像噪声有高斯噪声、椒盐噪声等。 1.1 椒盐噪声椒盐噪声也称为脉冲噪声,是图像中常常见到的一种噪声,它是一种随机呈现的白点或者黑点,可能是亮的区域有彩色像素或是在暗的区域有红色像素(或是两者皆有)。椒盐噪声的成因可能是影像讯号受到从天而降的强烈烦扰而产生、类比数位转换器或位元传输谬误等。例如生效的感应器导致像素值为最小值,饱和的感应器导致像素值为最大值。 1.2 高斯噪声高斯噪声是指噪声密度函数遵从高斯分布的一类噪声。因为高斯噪声在空间和频域中数学上的易解决性,这种噪声(也称为正态噪声)模型常常被用于实际中。高斯随机变量z的概率密度函数由下式给出: \( p(z)=\frac{1}{\sqrt{2 \pi} \sigma} e^{\frac{-(z-\mu)^{2}}{2 \sigma^{2}}}2 \) 其中z示意灰度值,示意z的平均值或期望值,示意z的标准差。标准差的平方\( \sigma^{2} \)称为z的方差。高斯函数的曲线如图所示。 2 图像平滑简介图像平滑从信号处理的角度看就是去除其中的高频信息,保留低频信息。因而咱们能够对图像施行低通滤波。低通滤波能够去除图像中的噪声,对图像进行平滑。 依据滤波器的不同可分为均值滤波,高斯滤波,中值滤波, 双边滤波。 2.1 均值滤波采纳均值滤波模板对图像噪声进行滤除。令\( S_{x y} \) 示意核心在(x, y)点,尺寸为m×n 的矩形子图像窗口的坐标组。 均值滤波器可示意为:\( \hat{f}(x, y)=\frac{1}{m n} \sum_{(s, t) \in S_{x y}} \) 由一个归一化卷积框实现的。它只是用卷积框笼罩区域所有像素的平均值来代替核心元素。 例如,3x3标准化的均匀过滤器如下所示:\( K=\frac{1}{9}\begin{bmatrix} \ 1 \ \ 1\ \ 1\ \ 1 \ \ 1\ \ 1\ \ 1 \ \ 1\ \ 1 \end{bmatrix} \)均值滤波的长处是算法简略,计算速度较快,毛病是在去噪的同时去除了很多细节局部,将图像变得含糊。API: ...

December 28, 2021 · 1 min · jiezi

关于算法:OPPO小布助手算法系统探索实践与思考

1 前言对话交互是继传统PC、PC互联网及挪动互联网之后,下一个时代十分有想象力的关键技术方向,无论是学术界还是工业界都有极高的关注度,同时作为OPPO万物互融策略的要害节点之一,承载着平凡而艰巨的使命。 算法是对话交互的外围能力之一,决定了语音助手能达到的智能化程度,具备极高的技术价值。本文将次要从对话交互的指标、算法要解决的关键问题,行业现状与趋势、小布次要实际与停顿,以及挑战与将来几个方面做个介绍。 2 对话交互指标与关键问题艰深来说,对话交互的指标就是通过语音或文字以天然对话的形式,实现工作执行、信息获取、情感交换等人机交互过程。比方像科幻电影外面的贾维斯、大白等智能助理,代表了人们对于对话交互能力现实状态的期待。 对话交互近年来受到越来越多的关注,其背地的起因到底是什么呢?其实回顾下近40年来信息科技倒退的历程,就不难理解。咱们晓得,信息科技先后经验了传统PC、PC互联网、挪动互联网几个大时代,其中每一个时代都与设施密切相关,进而催生入口和交互方式的反动。而今咱们正迈向被寄予厚望的AIoT时代,对话交互因其在新一代搜索引擎、超级服务散发核心、新型交互方式等方面的微小想象力,恰好承载了这一新时代下一入口级交互改革的使命愿景。 然而,想要达到现实的对话交互成果是十分艰难的,次要是因为它须要逾越目前成熟的感知智能技术,迈向认知智能,当下在认知智能畛域还存在很多尚未基本解决甚至未能清晰定义的问题。典型的认知难题包含如何示意和了解常识,如何使机器具备推理和布局能力,如何使机器有像人一样的想象力和自主性等。在某种程度上,能够说解决了认知智能的问题,基本上就等同于实现了强人工智能,足见对话交互的难度之高。 对话交互的骨干流程如下图所示,从中不难发现简直所有要害节点都与算法相干,算法是获得较好对话交互成果的外围能力。 对于OPPO自研的小布助手,其算法能力现状如下表所示,语音唤醒次要由三方和软件工程零碎反对,目前在新机成果上对齐行业Top竞品,然而存在老机型技术升级老本高、局部低端机型无奈反对语音唤醒等问题;语音辨认同时应用了三方和OPPO研究院的能力,因为语音辨认技术相干成熟,整体成果较好,字错率能管制在6%以下,目前的次要问题在于音频品质;语音合成与语音辨认相似,也是由三方和OPPO研究院独特反对,在准确性和晦涩度上成果较好,然而天然度、情感化等维度评测十分主观,目前也暂不反对用户个性化;语义了解和对话能力次要有业务技术团队提供,在语义了解方面准确率和召回率都能达到90%以上,存在凋谢域长尾query了解难度大的问题;在对话能力方面目前反对沉迷式强多轮、自在切换弱多轮、上文推理多轮等,多轮的难点次要是难评测,用户习惯弱、线上渗透率低。 语义了解和对话能力是本文的重点,次要工作是在拿到用户Query后,通过先了解用户要什么,再决定给用户什么,最终组装适合资源失当满足用户。由语义了解和对话能力组成语义算法零碎就是为了达成以上指标的,该零碎的波及次要会面临系统性问题和技术类问题两大类,如下图所示。 系统性问题包含面向须要反对全畛域query、数百项技能、多设施多渠道的简单零碎,如何解耦拆解;面向产品需要多、模块多流程长、算法不确定性大等问题,如何高效迭代;面向无奈穷举的多样化书面语Query,如何通过成果监控保障体验;如何躲避低级缺点、答非所问、适度兜底等“智障”体验。 技术类问题则包含算法的选型、关键问题的建模求解、多轮对话的管制、性能方面的保障等。 3 行业现状与算法趋势 首先,对话交互在利用场景方面已日趋成熟,涵盖智能家居、车载、生存出行、业余服务等泛滥畛域,方便快捷是自然语言对话交互方式的人造劣势,被越来越多的用户承受,据预估2020年将有超过70亿部设施搭载语音助手。 另外,发展趋势来看,近十年来顶级科技公司从未放弃在此方向上的投入,国外以苹果、亚马逊、谷歌三家公司作为代表,无一不把对话交互作为他们十分重要的方向;国内状况也相似,百度、小米、阿里巴巴都踊跃布局,旨在抢占对话交互这一将来流量入口。 一个值得关注的趋势是,面向第三方设施的对话交互智能助理逐步淡出,各家次要集中在自有设施上大力发展,除了相干技术与设施耦合严密的起因外,还有一个更重要的起因是这一入口太重要了,没有任何一个头部设施厂商违心将其齐全交给第三方技术方。 对话交互也是学术界钻研的热点,从ACL论文的趋势剖析能够看出,近5年来对话交互方向异军突起,在2019和2020年成为以后最热门的钻研方向。 参考:Trends of ACL: https://public.flourish.studi... 在外围的认知了解算法方面,其求解范式由传统的强依赖语言、问题类型和人工定制教训的多模块流水线计划,演变成了更简略、通用、高效的端到端一体化计划。这种范式的演进极大地简化了问题求解流程,不仅可能无效防止累积误差,更使得大数据、大模型、大算力可能落地利用,显著晋升成果。 近两年来,在模型层面以谷歌BERT为代表的大规模预训练模型横空出世,横扫各大语言建模工作榜单,为研发更先进的语义了解算法模型开释了微小的潜能,这无疑会给对话交互的倒退提供松软的技术撑持。 总结来看,无论是工业界还是学术界都十分关注对话交互这一方向,这反映了行业对将来趋势的预判。而算法技术的突破性停顿则进一步催化了对话交互产品落地的速度,使得将来将会更早到来。 4 小布算法零碎实际与停顿如前所述,语义了解和对话能力一起形成了小布外围的语义算法零碎,以下局部将具体出现咱们在这一方向上的实际与要害停顿。 首先,在业务需要方面咱们次要思考业务边界、对话能力、用户体量,以及评估指标这四个维度。在业务边界方面,小布助手属于全场景凋谢域对话交互零碎,须要反对的畛域包含系统控制、信息查问、影音娱乐、生存服务、智能聊天等,共约包含数百项技能,用户Query的广度十分大;在对话能力方面,除了简略指令型命令管制和单轮问题,还须要反对面向多轮的工作型、弱多轮、上下文了解等能力,以及对话举荐、被动对话等高阶能力;在用户体量方面,小布须要笼罩欧加团体三品牌手机,以及手表、电视等亿级别设施,千万量级的日活;在评估指标方面,次要思考需要覆盖度、用意召准率、技能满意度、响应工夫等。 详情来讲,小布助手的使命工作是建设一种对话连贯,连贯的一端是欧加团体设施生态宏大的用户群,另一端是优质的对话式服务,借助于这种连贯来实现用户价值、营销价值,以及技术价值。 为了撑持上述业务需要,咱们形象总结了四项设计准则来领导算法零碎的设计: 畛域分治:采纳划分畛域的形式将全畛域简单问题进行合成,转化成更简略的子问题分组求解,升高求解的难度,晋升零碎的可掌控性; 成果优先:为了尽可能防止“智障”体验,不拘泥于任何繁多技术,以成果优先驱动算法方案设计,躲避低级缺点; 闭环监控:建设欠缺的闭环监控机制,在研发阶段通过产品、测试、研发等多方拉通的测试例设计晋升测试覆盖度,在线上采纳实时动静测试集监控和人工评测来保障体验; 平台提效:为了应答泛滥中长尾的技能反对,推动技能平台的建设,以统一、通用的平台化解决方案升高中长尾技能的研发和保护老本。 参考业务需要和设计准则,小布助手目前的算法零碎整体架构如下图所示。首先,在平台与工具方面,根底算法以行业支流的深度学习算法为主,在其上针对不同的问题类型构建算法计划,并进一步封装成NLU框架、通用图谱问答、技能平台、开放平台等模块。而后在业务方面,最上层会采纳符号化、结构化、数值化的思路对query进行通用解决,再按零碎利用、生存服务、影音娱乐、信息查问、智能聊天几个维度进行业务拆分,各业务线独立迭代。最初再联合对话生成、交融排序优选出最佳的技能去满足用户的诉求。 从解决流程上,又能够分为预处理、用意辨认、多分类ranking、资源获取和后置解决几个环节,其中前三个节点次要对用意的召准率负责,后两个节点对资源的覆盖度和后果相关性负责,全流程一起为最终的技能执行满意度负责。 语义算法零碎中波及的要害算法模块如下图所示,后续将别离对语义了解、对话治理、对话生成三个外围模块进行介绍。 用意辨认是语义了解的外围模块,其次要工作是通过对用户以后Query,以及交互历史的剖析,推断用户到底想要干什么,包含关闭域、凋谢域、上下文几种典型的场景。 槽位提取是与用意辨认亲密关联的工作,次要工作是从用户以后Query以及交互历史中提取要害信息,辅助精准获取用户所需的答案/内容。 用意辨认和槽位提取独特形成语义了解模块,其难点次要在于书面语多样化(亿级别独立Query);歧义性(如小猪佩奇是动画片,也是App);依赖常识(如“可不可以”居然也是一首歌名)。 对话治理是语义算法零碎的另一要害模块,其工作是依据以后Query和对话上下文推导对话状态,并据此推理对话零碎下一步的最佳响应。 实现语义了解和对话治理后,还需联合对话生成能力实现技能的最终失当的执行反馈,对话生成的工作就是依据语义了解的解析后果和要执行的动作,通过失当的形式获取失当的响应话术。 在算法模型方面,小布以强深度学习驱动为主,这类模块一方面成果较好,另外技术计划也曾经比拟成熟,存在十分多胜利的案例。 然而值得强调的是,在这一畛域根本不存在“一招鲜”的繁多模型解决所有技术问题的算法计划,个别基于深度学习的主模型负责保障成果的基本面,仍须要联合定制规定来解决边角的badcase。 面对零碎利用操控类技能,为了晋升语义了解的成果,咱们次要采纳基于规定和深度学习模型交融的计划,其中反向规定用于疾速回绝畛域外的Query,正向规定用于笼罩强说法,深度学习模型负责通用case的泛化辨认。此外为了晋升用意和槽位的联结准确率,引入了多任务联结学习。 多任务联结学习能使得用意和槽位相互消歧,次要利用在电话、短信、日程等技能上,绝对与单任务独立学习,个别准确率能晋升1%~3%。联合粗疏的数据驱动优化和规定校验,根本能够做到95%以上的召准率。 面向常识强依赖型的技能,如音乐、电台、影视等,咱们次要采纳了交融常识的用意辨认计划,如下图所示。这类技能次要难点是单从句式无奈断定用意,从Query中精确提取资源字段十分要害,交融资源关联后果后再进行用意辨认能显著升高问题求解的难度。 ...

December 28, 2021 · 1 min · jiezi

关于算法:深度解析开源推荐算法框架EasyRec的核心概念和优势

简介:如何通过机器学习PAI实现疾速构建举荐模型 作者:程孟力 - 机器学习PAI团队 随着挪动app的遍及,个性化举荐和广告成为很多app不可或缺的一部分。他们在改善用户体验和晋升app的收益方面带来了微小的晋升。深度学习在搜广推畛域的利用也曾经十分深刻,并且给各种场景的成果带来了微小的晋升。针对举荐流程的各个阶段,业界曾经有很多的模型,这些模型大部分也有开源的实现,然而这些实现通常散落在github的各个角落,其数据处理和特色结构的形式各有差别。如果咱们想要在一个新的场景外面利用这些模型,通常须要做比拟多的改变: 输出的革新,开源的实现的输出格局和特色结构通常和线上不统一,适配一个算法通常须要1-2周左右的工夫,还不免因为对代码的不相熟引入bug,如果要尝试5个算法的话,就须要5倍的革新工夫。如果算法资源无限,这时候是不是就要忍痛割爱,放弃一些可能有成果的尝试了?开源的实现很多只是在公开数据集上获得了比拟好的成果,在公开数据集上的最优参数也不肯定适宜理论的场景,因而参数调优也须要较大的工作量;有时候成果不好,并不是因为办法不行,而是选的参数不太好。如果没有系统化的调参办法,很多算法也就是简略试一下,没有deep explore,哪来对算法的深刻了解呢? 为什么看似简略的改良,你没有可能发现呢? 为什么你也尝试了相似的方向,然而没有搞进去成果呢? 成果通常都是用算力和数不尽的尝试堆进去的;开源的实现用的是tensorflow 1.4,而线上用的tensorflow 2.3,好多函数的参数都变掉了(此处心里是不是想骂google一百遍,当初山盟海誓说好的api不再变呢); 很多开源的实现因为没有在理论场景中验证过,所以其可靠性也是存疑的,可能就会少了个dropout,少了一个bn,成果相差甚远;费了九牛二虎之力把模型成果调好了,发现上线也会有很多问题,比方训练速度太慢、内存占用太大、推理qps跟不上、离线成果好在线成果跪等等。遇到这么多问题,你还有精力去做你的下一个idea吗?你还能斗志昂扬,坚定不移的去摸索新方向吗?这些问题搞得咱们爱莫能助、天天加班到深夜、不知何时是个头:想要验证一个简略的idea都要使出九牛二虎之力。所谓天下文治,唯快不破,对于搜广推畛域的算法同学来说,尤其如此:通过疾速迭代能力验证更多的想法,发现更多的问题,找出最优的特色和模型构造。速度慢了的话,可能你的模型还没调好,业务指标就变了,前端的布局也改了,你的业务方可能都不置信你了,你也就没机会上线了。 说到这里,咱们的诉求就比拟明确了,咱们就是想少写代码,甚至不写代码就能验证咱们的想法。针对这些问题和诉求,咱们推出一个全新的、一步到位的举荐建模框架,致力于帮忙大家解决在举荐建模、特色结构、参数调优、部署等方面的问题,让大家少写代码,少干反复的没有意义的脏活累活(这些EasyRec都承包了),少趟一些坑少踩一些雷(这些EasyRec都替你趟了),让大家可能疾速上线验证新的idea,晋升举荐模型的迭代效率。 劣势 和其余建模框架相比,EasyRec在以下几个方面具备显著的劣势: 反对多平台和多数据源训练反对的平台包含: MaxCompute(原ODPS), DataScience(基于Kubernete), DLC(deep learning container), Alink, 本地;反对的数据源包含: OSS, HDFS, HIVE, MaxCompute Table, Kafka, Datahub;用户通常只须要定义本人的模型,在本地测试通过后,就能够在多种分布式平台上进行训练;反对多种Tensorflow版本(>=1.12, <=2.4, PAI-TF),可能无缝的对接用户的环境,不须要对代码做迁徙和改变;反对支流的特色工程的实现,特地是显示穿插特色,可能显著得晋升成果;反对HPO主动调参,显著升高了用户的调参工作量,并在多个场景中晋升了模型成果;实现了支流的深度模型,笼罩召回、排序、粗排、重排、多指标、多趣味等;反对EarlyStop, BestExport, 特色重要性,特征选择、模型蒸馏等高级性能。架构 EasyRec建模框架整体上是基于Estimator的数据并行训练形式,通过Parameter Server的构造反对多机多卡的训练。EasyRec的次要模块包含输出、特色结构、深度模型、Loss和Metric,每个模块都能够自定义。针对用户在用TF进行训练可能遇到的多种问题,如worker退出失败、应用num_epoch evaluator无奈退出、auc计算不精确等,EasyRec做了深度优化。针对AdamOptimizer训练速度慢,异步训练慢机,hash抵触,大样本空间负采样等问题,EasyRec联合PAI TF(PAI优化过的tensorflow)和AliGraph也做了深度优化。 模型EasyRec内置了业界先进的深度学习模型, 笼罩了举荐全链路的需要,包含召回、粗排、排序、重排、多指标、冷启动等。 同时EasyRec也反对用户自定义模型。如下所示,在EasyRec外面实现自定义模型,只须要定义模型构造、Loss、Metric三个局部,数据处理和特色工程是能够间接复用框架提供的能力的,因而可能显著节俭用户的建模工夫和老本,可能将精力focus在模型构造的摸索上。针对常见的模型类型如RankModel、MultiTaskModel等,Loss和Metric局部也能够间接复用父类的定义。 主动调参和主动特色工程EasyRec主动调参接入了PAI automl主动调参的能力,实现了对多种参数的主动调优。EasyRec外面定义的任意参数都是能够搜寻的,常见的参数包含hash_bucket_size, embedding_dim, learning_rate,dropout, batch_norm, 特征选择等。当你对某些参数拿不准时,就能够启动主动调参来帮忙你寻找最优的设置;通过主动寻优失去的参数通常会比拍脑袋设置的参数要好,有时候还会带来意外的惊喜。 特色工程通常是晋升举荐成果的要害,做高阶的特色组合通常有助于晋升模型成果,然而高阶组合的空间十分大,无脑组合会导致特色爆炸,连累训练和推理的速度。因而,EasyRec引入了主动特色工程(AutoFeature)的能力,主动寻找有晋升的高阶特色,进一步晋升模型的成果。 搜寻后果(top5): 模型部署EasyRec模型能够一键部署到PAI EAS环境,也能够通过tf serving部署。为了晋升inference性能,EasyRec引入了PAI Blade的能力做placement优化,op fusion,子图去重等性能,通过上述优化qps晋升30%以上,rt降落50%。将来还将引入FP16的性能,进一步晋升inference性能,升高memory的耗费。为了反对超大规模的Embedding,EasyRec对大模型做了拆分和op替换,将Embedding存储到Redis等分布式缓存外面,冲破了内存的限度。从Redis获取embedding会比内存慢,通过对高频id进行cache等来升高对redis的拜访来晋升embedding lookup的速度。 特色一致性特色工程是搜广推流程外面的要害局部,也通常是造成线上线下成果不统一的起因。为了可能在疾速迭代中放弃离线在线的一致性,通常采纳的办法是线上线下采纳同一套代码。离线训练数据的结构流程:首先结构user feature(蕴含实时和离线两局部), item feature和context_feature,而后join上训练样本(蕴含label),最初通过特色工程的jar包生成输出EasyRec的训练样本。上线的流程:将user feature(离线局部)和item feature导入Redis、Hologres等分布式存储,举荐引擎依据user_id和item_id去查问对应的特色,调用特色工程的库进行加工之后,送入EasyRec模型预测。在线局部的实时特色通常是应用blink、alink等反对流式计算的平台来生成的,而离线局部的实时特色结构有两种形式:离线模仿和在线落特色。这两种形式各有优缺点:因为日志失落等问题,离线模仿通常会和线上有大量的不统一;在线落特色如果要减少新的特色通常要期待比拟长的工夫能力攒够样本。咱们的解决方案是在线将用户行为的序列落下来,而后离线通过雷同的jar包来加工出各种统计特色,如1h/2h/../24h的点击次数。 在线特色工程对计算效率要求比拟高,而计算量也比离线要大:离线计算的样本通常是1个user配对m个曝光的item(召回模型的话,会减少一些随机采样的负样本), 而线上计算的样本是1个user配对n个item(n>>m)。在线计算如果采纳naive的计算形式,将一次申请开展成n个样本别离进行计算,效率通常是跟不上的。不难发现其中user feature的局部做了比拟多的反复计算,对user feature做计算效率的优化,可能显著晋升线上的qps。 咱们联合淘系外部应用的Feature Generation模块做了深度优化,包含内存调配、字符串解析、反复计算打消、多线程并行计算等,在保障一致性的前提下,显著进步了计算的效率。 ...

December 27, 2021 · 1 min · jiezi

关于算法:新功能开放搜索多路召回技术解读

简介:多路召回就是指采纳不同的策略、特色或者简略模型,别离召回一部分候选集,而后再把这些候选集混合在一起后供后续排序模型应用的策略,本文将介绍凋谢搜寻平台上的多路召回技术是如何深度晋升搜寻成果的。 背景所谓的“多路召回”就是指采纳不同的策略、特色或者简略模型,别离召回一部分候选集,而后再把这些候选集混合在一起后供后续排序模型应用的策略。 阿里云凋谢搜寻(OpenSearch)是基于阿里巴巴自主研发的大规模分布式搜索引擎搭建的一站式智能搜寻业务开发平台,目前为包含淘宝、天猫在内的阿里团体外围业务提供搜寻服务反对。目前凋谢搜寻提供文本检索,通过对文本query进行分词加上一些查问剖析解决,对query进行改写后再查问引擎,大大提高了搜寻的成果。然而对于一些对搜寻成果要求较高的场景,例如:教育搜题场景,教育拍照搜题相比传统的网页或者电商的搜寻存在显著的差别,第一点是搜寻的Query特地长,第二点是搜寻的Query由拍照OCR辨认之后失去的文本,其中要害TERM辨认谬误的话,就会重大影响召回排序。针对这些问题的解决办法,一种计划是持续优化QP,加强QP对文本处理的能力。另一种计划是引入向量召回,通过计算向量空间的间隔来召回文档,作为对文本召回的一种补充。 性能价值在长Query、长尾Query、Query不标准等场景时,如果基于文本检索呈现召回不精确、后果有余等问题,补充向量召回能够无效地进步召回文本的成果,同时也能够提供扩召回的能力。 凋谢搜寻提供多路召回的算法工程能力,赋予不同行业的用户定制不同的多路召回性能需要,并且曾经产品化,在多个行业的用户中实际利用。其长处有以下几个方面: 1、提供灵便的算法能力,反对依据不同行业的特点对文本向量化进行技术优化,兼顾成果和性能; 2、反对cava脚本,提供更加灵便的定制排序算分能力; 3、反对带模型的分析器和不带模型的分析器,别离对无算法能力的用户和有算法能力的用户提供向量召回性能; 4、比照开源产品,凋谢搜寻搜寻准确性和搜寻提早劣势更加显著,搜寻提早从开源秒级降到几十ms。 多路召回架构图 多路查问 凋谢搜寻(OpenSearch)反对多路查问性能。配置好查问策略,能够同时查问文本Query和向量Query。当然也反对只查问文本Query或只查问向量Query。如果配置了文本向量化性能,则文本查问的时候凋谢搜寻会对文本向量化,生成向量Query,两路后果召回后排序。 向量分析器 凋谢搜寻(OpenSearch)反对多种类型的向量分析器,次要是行业通用向量分析器、行业定制向量分析器、以及通用的向量分析器(向量-64维、128维、256维通用)。其中通用的向量分析器须要用户自行将数据转化为向量,并以DOUBLE_ARRAY类型存储,这实用于算法能力较强的客户应用。 查问剖析 赋予算法同学对不同行业的向量模型进行定制,依据以教育行业为例, 其中针对教育搜题做的特地优化有: BERT模型采纳达摩院自研的StructBERT,并针对教育行业定制模型向量检索引擎采纳达摩院自研的proxima引擎,准确性和运行速度远超开源零碎训练数据能够基于客户的搜寻日志一直积攒,成果继续晋升改写出语义向量query, RANK上文本term, 只参加算分不参加召回,晋升召回的top文本品质。排序定制 凋谢搜寻(OpenSearch)凋谢了两阶段排序:根底排序和业务排序,即粗排和精排。其中,精排反对cava脚本,更灵便地反对用户的排序需要。 多路召回流程中凋谢搜寻最终会进行对立排序,目前反对外部排序和精排模型打分排序。外部排序间接依据多路召回的后果依照返回的分数从高到低排序。精排模型打分须要用户提供模型信息,对多路召回的后果依据模型打分排序。 多路召回实际案例电商/批发搜寻 社区论坛搜寻 比照接入前后top title的不同成果 原文链接本文为阿里云原创内容,未经容许不得转载。

December 27, 2021 · 1 min · jiezi

关于算法:算法与数据结构体系课已完结redojsow

download:算法与数据结构体系课【已完结】在读 Vue 3 响应式原理部分代码的过程中看到其在进行响应式处理的时候,为每个对象使用 WeakMap 创建了一个「缓存区」,代码如下: // 注意上面这句代码!const reactiveMap = new WeakMap();// 核心进行劫持的方法 处理 get 和 set 的逻辑const mutableHandlers = { get,set}function reactive(target: object) { return createReactiveObject(target, mutableHandlers, reactiveMap);}/** @description 创建响应式对象@param {Object} target 需要被代理的目标对象@param {Function} baseHandlers 针对每种形式对应的不同处理函数@param {Object} proxyMap WeakMap 对象 */function createReactiveObject(target, baseHandlers, proxyMap) { // 检测 target 是不是对象,不是对象间接返回,不进行代理if (!isObject(target)) { return target}const existsProxy = proxyMap.get(target);// 如果该对象已经被代理过了,则间接返回,不进行重复代理if (existsProxy) { return existsProxy}// 未被代理过,则创建代理对象const proxy = new Proxy(target,baseHandlers);// 缓存,避免重复代理,即避免 reactive(reactive(Object)) 的情况出现proxyMap.set(target,proxy); return proxy}从下面的代码可能看出,WeakMap 缓存区的作用就是用来防止对象被重复代理。 ...

December 24, 2021 · 2 min · jiezi

关于算法:备战2022春招这十道题必回

大家好,我是bigsai。 最近不少小伙伴跟我交换刷题肿么刷,我给的倡议就是先剑指offer和力扣hot100,在这些题中还有些重要水平和呈现频率是十分十分高的,明天给大家分享当今呈现频率最高的10道算法题,学到就是赚到。 0X01翻转链表力扣206和剑指offer24原题,题意为: 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 剖析: 翻转链表,本意是不创立新的链表节点而后在原链表上实现翻转,然而这个图有点会误导人的思维,其实更好的了解你能够看上面这幅图: 具体实现上两个思路,非递归和递归的实现形式,非递归的实现形式比较简单,利用一个pre节点记录前驱节点,向下枚举的时候扭转指针指向就能够,实现代码为: class Solution { public ListNode reverseList(ListNode head) { if(head==null||head.next==null)//如果节点为NULL或者单个节点间接返回 return head; ListNode pre=head;//前驱节点 ListNode cur=head.next;//以后节点用来枚举 while (cur!=null) { ListNode next=cur.next; //扭转指向 cur.next=pre; pre=cur; cur=next; } head.next=null;//将原先的head节点next置null避免最初成环 return pre; }}而递归的形式比拟奇妙,借助递归归来的过程奇妙扭转指针指向和返回值传递,代码尽管精简然而了解起来有肯定难度的,这里用一张图帮忙大家了解: 具体代码为: class Solution { public ListNode reverseList(ListNode head) { if(head==null||head.next==null)//如果最初一个节点不操作 return head; ListNode node =reverseList(head.next);//先递归 到最底层 而后返回 head.next.next=head;//前面一个节点指向本人 head.next=null;//本人原本指向的next置为null return node;//返回最初一个节点(始终被递归传递) }}0X02设计LRU对应力扣146LRU缓存机制,题目要求为: 使用你所把握的数据结构,设计和实现一个 LRU 缓存机制 。实现 LRUCache 类: ...

December 24, 2021 · 5 min · jiezi

关于算法:恒源云文本数据扩增时哪些单词-不-应该被选择

文章起源 | 恒源云社区(恒源云,专一 AI 行业的共享算力平台) 原文地址 | 论文笔记 原文作者 | Mathor 我在,或者我不在,大佬就在那里,继续一直的发文!所以,我还是老老实实的搬运吧! 注释开始:文本扩增(Text Augmentation)当初大部分人都在用,因为它能够帮忙晋升文本分类的成果,具体来说罕用的办法包含但不限于:替换、删除、减少。一般来说文本扩增都会使得最终的性能更好,少部分状况下会更差。你或者可能想过是因为诸如删除、替换等办法将句子中一些重要的词给抹去了,然而到底句子中那些词是重要的词呢?哪些词能够进行扩增,哪些词最好不要扩增? ACL2022有一篇名为《Roles of Words: What Should (n’t) Be Augmented in Text Augmentation on Text Classification Tasks?》的投稿钻研了这个问题,并且给出了领导办法。首先作者对FD News数据集进行训练,最终在测试集上的准确率为98.92%,这阐明模型对数据集的拟合水平十分好。接着作者手动输出几个测试样本,如下所示 因为单词"basketball"和"athletes"经常出现在"sport"类的训练样本中,所以模型能十分精确的将其预测为"sport"类;然而从第2和4个样本来看,模型的体现并不像咱们设想的那么好。因为"Based on"和"team"在训练集中常常与类别为"sport"的句子独特呈现,模型被这种数据集进行训练后,天然会带有一点「偏见」;从最初一个例子来看,模型无奈正确辨认出与体育相干的业余词汇:三分(three-pointer) 下面这个例子启发咱们从「统计相关性」和「语义相似性」两个角度对待句子中的每个词。具体来说,咱们能够从这两个角度给每个词调配一种「角色」,总共有4种角色: Common Class-indicating words (CC-words):高统计相关性与高语义相似性Specific Class-indicating words (SC-words):低统计相关性与高语义相似性Intermediate Class-indicating words (IC-words):高统计相关性与低语义相似性Class-irrelevant words/Other words (O-words):低统计相关性与低语义相似性STATISTICAL CORRELATION & SEMANTIC SIMILARITY作者采纳weighted log-likelihood ratio (WLLR) 掂量句子中的每个词与类别之间的统计相关性,WLLR分数的计算公式如下: 其中,\( w \)是一个单词;\( y \)是一个类别;\( \bar{y} \)代表所有类别。\( \text{wllr}(w,y) \)越大,词\( w \)与类别\( y \)之间的统计相关性越高 为了掂量两个词的语义类似度,最间接的方法是计算两个向量的余弦类似度,然而这里作者并没有应用比较复杂的BERT-based模型提取单词的向量,因为须要比拟大的计算资源,作者间接应用简略的Word2Vec办法失去一个单词的向量。事后类似度的计算公式如下: 其中,\( l \)代表类别,\( v_w,v_l \)别离代表词和类别的向量示意 ...

December 23, 2021 · 1 min · jiezi

关于算法:从-香农熵-到-告警降噪-如何提升告警精度

简介:ARMS 智能降噪性能依靠于 NLP 算法和信息熵实践建设模型,从大量历史告警事件中去开掘这些事件的模式法则。当实时事件触发后,实时为每一条事件打上信息熵值与乐音辨认的标签,帮忙用户疾速辨认事件重要性。 作者:董善东 & 白玙 对于大部分人来说,信息是一个十分形象的概念。人们经常说信息很多或信息较少,但却很难说分明信息到底有多少。比方一份帮忙文档或一篇文章到底有多少信息量。直到 1948 年,C.E.Shannon(香农)提出了“信息熵”的概念,才解决了对信息的量化度量问题。信息熵这个词是香农从热力学中借鉴而来来的。热力学中的热熵是示意分子状态凌乱水平的物理量。而香农用信息熵的概念来形容信源的不确定度。 香农的信息熵实质上是对咱们司空见惯的 “不确定景象” 的数学化度量。譬如说,如果天气预报说 “今天下午下雨的可能性是 60%” ,咱们就会不谋而合想到出门带伞;如果预报说 “有 60% 的可能性下雨” ,咱们就会犹豫是否带伞,因为雨伞无用时确是累赘之物。显然,第一则天气预报中,下雨这件事的不确定性水平较小,而第二则对于下雨的不确定度就大多了。 作为数学中颇为形象的概念,咱们能够把信息熵了解成某种特定信息的呈现概率。而信息熵和热力学熵是严密相干的。依据 Charles H. Bennett 对 Maxwell's Demon 的从新解释,对信息的销毁是一个不可逆过程,所以销毁信息是合乎热力学第二定律的。而产生信息,则是为零碎引入负(热力学)熵的过程。当一种信息呈现概率更高时,表明被流传得更宽泛,或者说被援用的水平更高。咱们能够认为从信息流传角度来看,信息熵能够示意信息的价值,这样子咱们就有一个掂量信息价值高下的规范。 再具体到咱们日常运维工作场景中,各类的告警事件作为最典型的一种信息,在面对每天海量高警事件咱们该如何评估告警的信息价值成为了一个重要问题。 各大监控平台/工具个别有两种形式去辨认指标异样并触发告警事件。第一种是常见的通过设定阈值/动静阈值的形式。第二种就是设定默认规定,触发零碎预设规定事件,例如:机器重启等。 与此同时,运维团队往往不会依赖繁多的监控工具,常常须要在各种不同档次工具中都设定对应的监控告警。 在这样的背景下,监控源多元化与监控工具类别多样化,往往导致雷同故障起因在不同监控工具、不同监控规定下,触发出大量反复、冗余的告警事件。甚至在产生大范畴故障时造成告警风暴。运维人员很难从这些海量告警中疾速无效的辨认到底哪些告警事件是重要且精确的信息,这也往往导致无效告警被吞没。因而,对于运维团队和告警产品来说,存在以下几个痛点: 多处监控告警源以及频繁误报导致大量反复、冗余、低效事件,重要事件吞没在其中,无奈无效辨认;大范畴故障导致的告警风暴;测试事件等脏数据混在事件中。什么是 ARMS 智能降噪ARMS 智能降噪性能依靠于 NLP 算法和信息熵实践建设模型,从大量历史告警事件中去开掘这些事件的模式法则。当实时事件触发后,实时为每一条事件打上信息熵值与乐音辨认的标签,帮忙用户疾速辨认事件重要性。 智能降噪的实现原理介绍事件核心中大量的历史事件沉积,很难人工实现从这些大量历史事件中形象出事件模式与价值。利用实时监控服务 ARMS ITSM 产品智能降噪功对不同告警源收归到对立平台进行告警事件处理,将这些历史事件进行模式识别,开掘外在关联,建设基于信息熵的机器学习模型辅助用户进行事件重要性的辨认,模型外围步骤包含: step 1:基于自然语言解决和畛域词汇库, 实现事件内容的词向量化,实现事件最小粒度的度量;step 2:基于信息论中信息熵的概念, 联合 tfidf 模型,构建词向量的信息熵值和重要性度量模型;step 3:利用 sigmod,实现事件的非线性和归一化 “信息熵” 度量;step 4:联合历史事件的解决记录和反馈, 构建模型迭代训练与验证。利用自然语言解决算法,基于信息论中的信息量和信息熵概念来表征事件重要性,帮忙用户利用大量历史事件训练迭代出辨认事件重要性的模型。当新实时事件触发时,疾速辨认事件重要性。同时,联合信息熵阈值设定,来实现乐音事件过滤与屏蔽。并依据工夫演进以及事件类型与内容变动,模型通过自适应定期实现迭代式更新(更新频率为每周一次),无需用户进行任何操作,即可保障模型准确性。 智能降噪业务价值业务价值一:智能化辨认反复、低效事件,开掘离奇事件(1)大量反复、类似事件的辨认 对于大量反复、类似事件,该类事件继续大量呈现在事件告警中,模型对于这类事件的信息熵值会继续给予升高的信息熵,即:这类事件的信息熵值会越来越低,直到最初靠近为 0。这是因为模型期待对于重要的事件,用户能够更多关注响应, 而如果事件始终反复、大量触发,往往阐明这类事件用户基本不关怀,从业务逻辑上也辅证了模型机理。 (2)开掘离奇事件 对于在历史事件中未曾呈现、比拟少呈现的事件,模型则会重点关注,认定该类事件为离奇事件,给予以后事件较大的信息熵值,以期待用户更多的关注该类事件。因而,ARMS 智能降噪模型还具备帮忙用户辨认重要事件的性能。 业务价值二:定制化需要反对设定对于一些用户测试事件或特定字段事件,咱们经常心愿对这类事件进行定制化解决,例如:测试事件只触发查看整个流程,但不须要去点击做任何解决。再比方,有些事件中蕴含了特地重要字段信息,对于这类事件须要优先解决。 业务价值三: 模型具备高成长性对于历史事件数量较少的用户(事件数量<1000), 个别不举荐关上该性能,这是因为历史事件数量过少的状况下,模型很难充沛训练,辨认其内在模式和法则。然而在开启后, 模型每周会在本周新产生的事件根底上,进行模型迭代训练。在用户无需关怀的前提下,模型一方面自适应追踪事件模式变动,另外一方面对于原有事件数量不短缺的模型, 也在继续进行充沛迭代。 ...

December 21, 2021 · 1 min · jiezi

关于算法:中国矿业大学2021年算法设计与分析实践考试题目以及题解信安版

说在后面:因为此次考试,不晓得是哪位信安的大哥把学校的OJ平台给黑掉了,导致咱们100来人同时登陆不上OJ,考试被迫终止半小时.然而因为少部分同学刚开始登录下来了一小会,看到了题目(比方我),所以为了偏心起见,学校从新换了一套题.上面我把两套题以及相应题解放在上面,供大家学习参考! A卷:1.凯撒加密法题目形容:凯撒加密法,或称恺撒加密、恺撒变换、变换加密,是一种最简略且最广为人知的加密技术。它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)依照一个固定数目进行偏移后被替换成密文。 例如,当偏移量是左移3的时候:明文字母表:ABCDEFGHIJKLMNOPQRSTUVWXYZ密文字母表:DEFGHIJKLMNOPQRSTUVWXYZABC应用时,加密者查找明文字母表中须要加密的音讯中的每一个字母所在位置,并且写下密文字母表中对应的字母。须要解密的人则依据当时已知的密钥反过来操作,失去原来的明文。例如: 明文:THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG密文:WKH TXLFN EURZQ IRA MXPSV RYHU WKH ODCB GRJ当初给定你一个字符串S(长度不会超过1000000)和一个整数k(-1000000000<=k<=1000000000),别离代表接受者收到的密文和在加密该密文时向后的偏移量,你的工作是计算出原来的明文留神:只有字母在加密时才会产生偏移,其它字符放弃不变.输出:输出蕴含多组数据,其中第一行为数据组数T(T<=10)每组数据第一行为一个字符串S,由数字、字母以及常见字符组成(不含空格),第二行为一个整数k代表加密时向后的偏移量(|S|<=1000000,-1000000000<=k<=1000000000) 输入:对每组数据,输入一行字符串,代表输出中的密文对应的明文。 样例输出: 1DEFGHIJKLMNOPQRSTUVWXYZABC3样例输入: ABCDEFGHIJKLMNOPQRSTUVWXYZ题解:水题,只须要简略变换一下字符的地位即可. #include<bits/stdc++.h>using namespace std;int main(){ int t; cin>>t; while(t--) { string str; cin>>str; int k; cin>>k; int n = str.size(); for(int i=0; i<n; i++) { str[i] = 'A' + (str[i]-'A'-k+26)%26; } cout<<str<<endl; } return 0;}2.跳跃游戏Ⅱ题目形容:给定一个非负整数数组,假设你的初始地位为数组第一个下标。数组中的每个元素代表你在那个地位可能跳跃的最大长度。你的指标是达到最初一个下标,并且应用起码的跳跃次数。例如:A = [2,3,1,1,4],达到最初一个下标的起码跳跃次数为 2。(先跳跃11步,从下标0到1,而后跳跃3步,达到最初一个下标。一共两次) 输出:第一行输出一个正整数n(1≤n≤100),接下来的一行,输出n个整数,示意数组A。 输入:最初输入起码的跳跃次数。 样例输出: 53 1 1 1 1样例输入: ...

December 21, 2021 · 5 min · jiezi

关于算法:二叉树基本算法

二叉树定义:二叉树(英语:Binary tree)是每个节点最多只有两个分支(即不存在分支度大于2的节点)的树结构。通常分支被称作“左子树”或“右子树”。二叉树的分支具备左右秩序,不能随便颠倒。更多解释,详见堆和堆排序。 一、递归遍历1、先序遍历根左右。a,b,d,e,c,f,g /** * 二叉树:先序遍历。根-左-右 *  * 经典递归写法 * * @author Java和算法学习:周一 */public static void pre(Node head) {    if (head == null) {        return;    }    System.out.println(head.value);    pre(head.left);    pre(head.right);}2、中序遍历左根右。d,b,e,a,f,c,g /** * 二叉树:中序遍历。左-根-右 * * 经典递归写法 * * @author Java和算法学习:周一 */public static void in(Node head) {    if (head == null) {        return;    }    in(head.left);    System.out.println(head.value);    in(head.right);}3、后序遍历左右根。d,e,b,f,g,c,a /** * 二叉树:后序遍历。左-右-根 * * 经典递归写法 * * @author Java和算法学习:周一 */public static void pos(Node head) {    if (head == null) {        return;    }    pos(head.left);    pos(head.right);    System.out.println(head.value);}经典的递归版先序、中序、后序遍历,咱们再相熟不过了,明天咱们说些不同的,递归序。 认真点的小伙伴仿佛曾经发现,递归的先序、中序、后序遍历其实是很类似的,就是打印的机会不同。这是因为,它们理论是由递归序改写而来的。啥是递归序,就是每次通过本人的时候,都打印节点的值,最初打印进去的即是递归序。 在递归序的根底上,只打印第一次通过本人时的值,即是先序;只打印第二次通过本人的值,即是中序;只打印第三次通过本人的值,即是后序。 4、递归序/** * 递归序 * * @author Java和算法学习:周一 */public static void f(Node head) {    if (head == null) {        return;    }    // 1    System.out.println(head.value);    f(head.left);    // 2    System.out.println(head.value);    f(head.right);    // 3    System.out.println(head.value);}一个论断:已知一个二叉树的先序遍历和后序遍历,某个节点X,X先序遍历之前的节点汇合为A,X后序遍历之后的节点汇合为B,那么 A 和 B 的交加肯定是X节点的所有先人节点。 二、非递归遍历1、先序遍历(1)筹备一个栈,压入以后节点(即头节点) (2)弹出栈顶元素,打印对应的值 (3)此元素有右孩子往栈压入右孩子,有左孩子往栈压入左孩子(先右再左) (4)始终执行2、3步,直到栈为空。 /** * 非递归先序遍历 * * @author Java和算法学习:周一 */public static void pre(Node head) {    if (head != null) {        Stack<Node> stack = new Stack<>();        // 压入以后节点        stack.push(head);        while (!stack.isEmpty()) {            // 弹出栈顶元素            Node current = stack.pop();            System.out.print(current.value + " ");            // 先压入右孩子,再压入左孩子            if (current.right != null) {                stack.push(current.right);            }            if (current.left != null) {                stack.push(current.left);            }        }    }}2、中序遍历(1)筹备一个栈 (2)压入以以后节点current为头节点的整个左子树(入栈一个,current就挪动到左孩子),直到为空 (3)弹出栈顶元素,打印其值,以以后弹出元素的右孩子为current节点,反复第2步 (4)当栈为空时完结 /** * 非递归中序遍历 * * @author Java和算法学习:周一 */public static void in(Node head) {    if (head != null) {        Stack<Node> stack = new Stack<>();        Node current = head;        while (!stack.isEmpty() || current != null) {            if (current != null) {                // 将以后节点的整个左子树入栈                stack.push(current);                current = current.left;            } else {                // 左子树入栈完后,弹出栈顶元素                Node pop = stack.pop();                System.out.print(pop.value + " ");                // 以以后弹出元素的右孩子为current节点,持续循环                current = pop.right;            }        }    }}3、后序遍历(1)筹备两个栈stackA,stackB;stackA压入以后节点(即头节点) (2)弹出栈顶元素,压入stackB (3)此元素有左孩子往stackA栈压入左孩子,有右孩子往stackA栈压入右孩子(先左再右) (4)始终执行2、3步,直到stackA栈为空。 (5)打印所有stackB栈的元素 相当于stackA出栈程序是 根右左,最初stackB出栈程序是 左右根。 /** * 非递归后序遍历 * * @author Java和算法学习:周一 */public static void pos(Node head) {    if (head != null) {        Stack<Node> stackA = new Stack<>();        Stack<Node> stackB = new Stack<>();        stackA.push(head);        while (!stackA.isEmpty()) {            // stackA出栈程序是 根 右 左            Node current = stackA.pop();            // stackB入栈程序是 根 右 左            stackB.push(current);            // stackA先左孩子入栈,再右孩子入栈            if (current.left != null) {                stackA.push(current.left);            }            if (current.right != null) {                stackA.push(current.right);            }        }        // stackB出栈程序是 左 右 根        while (!stackB.isEmpty()) {            System.out.print(stackB.pop().value + " ");        }    }}三、二叉树按层遍历(1)筹备一个队列,头节点入队 (2)出队一个节点,打印其值;出队节点有左孩子则左孩子入队,有右孩子则右孩子入队 (3)循环执行第2步,直到队列为空 /** * 二叉树按层遍历 * * @author Java和算法学习:周一 */public static void levelTraversal(Node head) {    if (head == null) {        return;    }    // 筹备一个队列    Queue<Node> queue = new LinkedList<>();    // 头节点入队    queue.offer(head);    while (!queue.isEmpty()) {        // 从队列中弹出一个节点        Node current = queue.poll();        // 打印        System.out.print(current.value + " ");        // 有左孩子则左孩子入队        if (current.left != null) {            queue.offer(current.left);        }        // 有右孩子则右孩子入队        if (current.right != null) {            queue.offer(current.right);        }    }}本文次要介绍了,二叉树的先序、中序、后序的递归遍历(以及已经不晓得的递归序)、非递归遍历,二叉树的层序遍历。 本文全副代码:https://github.com/monday-pro/algorithm-study/tree/master/src/basic/binarytree

December 20, 2021 · 1 min · jiezi

关于算法:贪心学院推荐系统算法工程师培养计划dhh

download:贪婪学院-举荐零碎算法工程师造就打算拆分扩容后存在的问题随着业务的增长,零碎变得越来越宏大, 根据零碎功能拆分红独立而又互通的我的项目, 比如交易零碎、财务零碎、生产流程零碎、物流零碎、网站零碎等等,然而分布式结构会存在很多问题。对于这些问题每一个都值得深入探讨,这儿简略的提一下,前面再开篇幅。 数据共享问题所有的服务之间数据如何共享同步,这是一个需要考虑的问题,微服务架构中,数据不可能只有一份,没法避免机器损坏等原因造成的数据丢失,多份数据之间如何同步?目前可供参考的解决思路是建立数据中心、搭建数据库集群。 接口调用问题不同的服务器之间进行调用遵循近程调用协定RPC JAVA RMI:Java近程方法调用,即Java RMI(Java Remote Method Invocation)是Java编程语言里,一种用于实现近程过程调用的应用程序编程接口。 它使客户机上运行的程序可能调用近程服务器上的对象。 dubbo:提供了面向接口代理的高性能RPC调用 持久化数据雪崩问题数据库分库分表,参考:MySQL调优之分区表。资源隔离,参考:亿级流量架构之资源隔离思路与方法。缓存设定数据持久化策略:Redis持久化之RDB和AOF。高并提问题缓存:诸如缓存击穿、穿透、雪崩等,参考Redis击穿、穿透、雪崩产生原因以及解决思路。 数据闭环:为了便于理解,举个例子,对于淘宝而言,有网页版、IOS版、安卓版、还有什么一淘等等,诚然客户端不一样,然而展示的商品信息是雷同的,也就是一件商品,无论是哪个端用的数据是一样的,需要一套打算来解决并发下根据雷同数据在不同端进行不同展示的问题,这就叫数据闭环。 数据一致性问题这是一个难点,粗心就是多个服务器之间数据如何保障一致性,同样的商品在不同客户端服务端端价格应该是一样的, 通常使用分布式锁。 数据库扩容:集群先简略说一下分布式与集群的区别,这两个词儿常常一起出现,然而意义却有所不同,分布式会缩短单个工作的执行工夫来晋升工作效率,而集群强调的是提高单位工夫内执行操作数的减少来提高效率。更简略的来说,分布式是将步骤分到每台电脑上,不考虑依赖关系,集群打算是指几个工作同时在处理。 繁多数据库存储难以满足业务需要时,采取集群的形式,将数据存储在不同的服务器,这可能是主主或者主从,主从中主负责写,从负责读,将与数据库无关的压力进行合成到多台机器上。 分布式ID在简单分布式零碎中,经常需要对大量的数据和消息进行唯一标识。很容易想到的是利用自增,然而自增有很多问题,例如ID有太强的法则,可能会被恶意查问收集,面对数据日渐增长,对数据分库分表后需要有一个唯一ID来标识一条数据或消息,这样数据库的自增ID显然不能满足需要;特地一点的如商品、订单、用户也都需要有唯一ID做标识。此时一个能够生成全局唯一ID的零碎是十分必要的。概括下来,那业务系统对ID号的申请有哪些呢? 分布式ID申请面对分布式ID,需要满足上面的申请: 全局唯一性:不能出现重复的ID号,既然是唯一标识,这是最基本的申请。趋势递增:在MySQL InnoDB引擎中使用的是会集索引,因为少数RDBMS使用B-tree的数据结构来存储索引数据,在主键的抉择下面咱们应该尽量使用有序的主键保障写入性能。枯燥递增:保障下一个ID肯定大于上一个ID,例如事务版本号、IM增量消息、排序等非凡需要。信息安全:如果ID是间断的,恶意用户的扒取工作就非常容易做了,间接按照次序下载指定URL即可;如果是订单号就更危险了,竞对可能间接知道咱们一天的单量。所以在一些利用场景下,会需要ID无规则、不规则。上述123对应三类不同的场景,然而3和4的需要是互斥的,也就是无奈使用同一个打算满足。除了对ID号码自身的申请,业务还对ID号生成零碎的可用性申请极高,设想一下,如果ID生成零碎瘫痪,整个与数据无关的动作都无奈执行,会带来一场劫难。由此总结下一个ID生成零碎起码应该做到如下几点: 平均提早和TP999提早都要尽可能低;可用性5个9(这是美团的申请,有些企业例如阿里申请6个9);高QPS。分布式ID生成策略目前业界罕用的ID生成策略有很多,例如UUID、雪花生成算法、Redis、Zookeeper等,这儿只简略讲讲UUID以及Snowflake,前面要开篇详谈。 UUID生成算法UUID(Universally Unique Identifier)的标准型式蕴含32个16进制数字,以连字号分为五段,形式为8-4-4-4-12的36个字符,示例:550e8400-e29b-41d4-a716-446655440000,到目前为止业界一共有5种形式生成UUID,详情见IETF公布的UUID规范 A Universally Unique IDentifier (UUID) URN Namespace。 长处: 性能非常高:本地生成,没有网络消耗。缺点: 不易于存储:UUID太长,16字节128位,通常以36长度的字符串示意,很多场景不实用。信息不安全:基于MAC地址生成UUID的算法可能会造成MAC地址泄露,这个漏洞曾被用于寻找梅丽莎病毒的制造者地位。ID作为主键时在特定的环境会存在一些问题,比如做DB主键的场景下,UUID就非常不实用:① MySQL官网有明确的倡导主键要尽量越短越好[4],36个字符长度的UUID不符合申请。 All indexes other than the clustered index are known as secondary indexes. In InnoDB, each record in a secondary index contains the primary key columns for the row, as well as the columns specified for the secondary index. InnoDB uses this primary key value to search for the row in the clustered index.If the primary key is long, the secondary indexes use more space, so it is advantageous to have a short primary key. ...

December 20, 2021 · 1 min · jiezi

关于算法:恒源云YTuning-通过对标签表征进行微调的深度学习新范式ACL-2022

文章起源 | 恒源云社区) 原文地址 | 【ACL 2022】 原文作者 | Mathor 小编此刻心田OS:不能怪大佬产出高~是我不致力!打工人打工魂,站起来,开始搬运!!! 注释开始:ACL2022有一篇名为《Y\mathcal{Y}Y-Tuning: An Efficient Tuning Paradigm for Large-Scale Pre-Trained Models via Label Representation Learning》的投稿,从题目上就吸引了我的留神,不同于Fine-Tuning、Adapter-Tuning、Prompt-Tuning,这篇文章的翻新之处在于,不调整输出文本特色与大规模预训练模型的参数,仅通过学习标签的特色,以往很少见到论文去学习标签的特色。尽管最终成果可能仍无奈与微调相比,但它在节俭计算成本方面有很大的劣势,并有可能通过后续钻研进一步提高性能 PRELIMINARIES OF TUNING PTMS对于NLP工作来说,通常都含有输出文本\( x\in \mathcal{X} \)以及标签\( y\in \mathcal{Y} \),其中\( \mathcal{X} \)的特色空间是离散的(例如One-hot)。以情感剖析(Sentiment Analysis, SA)工作为例,输出句子标签集\( \mathcal{Y} \)=\( postive \), \( \text{negative} \)中的标签\( y=\text{postive} \)为实在标签 定义\( \phi : \mathcal{X}\to \mathcal{Z} \)为输出句子到高维浓密向量空间的映射,\( f: \mathcal{Z}\to \mathcal{Y} \)为改向量空间到标签空间的映射。给定训练集\( \mathcal{D} \),咱们能够定义损失函数为\( \ell: \mathcal{Y}\times \mathcal{Y}\to \mathbb{R}^+ \),并且能够通过以下办法找到最佳的\( f \)和\( \phi \):通常来说,即使分类器\( f \)很简略,但只有有一个好的特征提取器\( \phi(x) \),上游工作中的体现就不会差 ...

December 17, 2021 · 1 min · jiezi

关于算法:AI-收藏夹-Vol004虚拟爱豆出道

人工智能是一门交融了计算机科学、图形学、生物学、语言学等学科的前沿科学。随着产学研深度交融翻新,人工智能从实践钻研逐步落地,各种利用与构想层出不穷。「AI 收藏夹」将会与大家分享一些 AI 畛域实用乏味的文章和工具,与大家一起见证技术的翻新与改革。文章 0 1 虚构爱豆出道 ! 「与真人网红不同,虚构网红永远不会拍照早退,不会在团聚上喝醉,也不会变老……」最近,英国《经济学人》[1.1]发表了一篇题为《下一个是什么?2022 年值得关注的 22 项新兴技术》的文章,写道:「2022 年预计将有 150 亿美元用于网红营销,虚构网红也会迅速增多。」 5 月 20 日,阿里巴巴旗下的首个数字人员工、NFT 艺术家、数字策展人、潮牌主理人 AYAYI 横空出道; 12 月 3 日,首个元宇宙 NFT 属性的虚构偶像 CC is Dreaming 以全息图的模式登台上演; 韩国头部经纪公司 SM 打造八人男子偶像个人 aespa ,由来中日韩的四名真人成员和 1:1 建模的 AI 成员独特组成,主打实在与空幻的融合,自去年出道以来,歌曲、舞蹈、造型都极具将来感。 如何打造一个数字世界的虚构明星?「海内外市场都对此既有狐疑,又饱含期待,资本对虚拟世界更是透支了超额的激情。但如何解决虚构偶像的商业化瓶颈,让元宇宙的概念实在落地,依然须要更多人带着感性的思维入局。」[1.2] 0 2 神经网络模型帮忙检测虚伪和误导性信息 任何人都能轻松分辨这两张图片的不同——左边的图片有一个边框,是前右边的网页截图。然而对于计算机视觉零碎来说,尽管两张图片内容雷同,然而像素不同,很难分辨差别。图片的相似性检测十分重要,因为,一条不实信息的图片可能有成千上万的正本,须要找到全副的正本,提醒用户可能是不实信息。 Facebook 自研的 SimSearchNet 模型用于准确检测图像的轻微变动。一旦工作人员人员确定图像蕴含虚伪和误导性信息,该模型可能找到与指标图像近似的所有图像并提醒用户,在后疫情时代失去广泛应用[2]。 0 3 鼻纹寻爱宠 咱们晓得猫狗的鼻子能够反馈健康状况,其实它还像人类的指纹一样具备唯一性,不会随着年龄发生变化。猫狗的鼻纹能够用于身份标识,铲屎官能够在支付宝录入爱宠鼻纹,给宠物「上保险」;发现疑似走失的宠物,也可扫一扫鼻纹辨认身份,帮它回家。 旷视[3.1]、蚂蚁[3.2]等团队研发的宠物鼻纹辨认技术曾经取得十几项专利。除了帮忙找寻走丢宠物之外,宠物鼻纹辨认还有望在城市宠物治理、宠物保险、宠物医疗等方面发挥作用。 0 4 AI 算法阻止偷猎 每年有近三万头非洲象被偷猎者杀死,如果照着这样的趋势继续下去,非洲象将会在十年后灭绝。 卡内基梅隆大学(CMU)计算机学院软件研究所助理传授方飞曾帮忙美国海岸警卫队在 2013 年部署了PROTECT 模型,用于打击恐怖主义。之后,方飞摸索了 AI 能够解决的其余问题,率领团队开发了 PAWS 模型[4],应用过来巡逻的数据来预测可能产生偷猎的中央,并应用博弈论模型来帮忙生成随机的、不可预测的巡逻路线。PAWS 既是动物脚掌的意思,又是「野生动物平安爱护助理」的英文缩写。 ...

December 17, 2021 · 1 min · jiezi

关于算法:区间算法题用线段树可以秒解

区间算法题用线段树能够秒解?背景给一个两个数组,其中一个数组是 A [1,2,3,4],另外一个数组是 B [5,6,7,8]。让你求两个数组合并后的大数组的: 最大值最小值总和这题是不是很简略?咱们间接能够很轻松地在 $O(m+n)$ 的工夫解决,其中 m 和 n 别离为数组 A 和 B 的大小。 那如果我能够批改 A 和 B 的某些值,并且我要求很屡次最大值,最小值和总和呢? 奢侈的思路是原地批改数组,而后 $O(m+n)$ 的工夫从新计算。显然这并没有利用之前计算好的后果,效率是不高的。 那有没有效率更高的做法? 有!线段树就能够解决。 线段树是什么?线段树实质上就是一棵树。更精确地说,它是一颗二叉树,而且它是一颗均衡二叉树。对于为什么是均衡二叉树,咱们前面会讲,这里大家先有这样一个意识。 尽管是一棵二叉树,然而线段树咱们通常应用数组来模仿树结构,而不是传统的定义 TreeNode 。 一方面是因为实现起来容易,另外一方面是因为线段树其实是一颗齐全二叉树,因而应用数组间接模仿会很高效。这里的起因我曾经在之前写的堆专题中的二叉堆实现的时候中讲过了,大家能够在我的公众号《力扣加加》回复堆获取。 解决什么问题正如它的名字,线段树和线段(区间)无关。线段树的每一个树节点其实都存储了一个区间(段)的信息。而后这些区间的信息如果满足肯定的性质就能够用线段树来进步性能。 那: 到底是什么样的性质?如何进步的性能呢?到底是什么样的性质?比方后面咱们提到的最大值,最小值以及求和就满足这个肯定性质。即我能够依据若干个(这里是两个)子集推导出子集的并集的某一指标。 以下面的例子来说,咱们能够将数组 A 和 数组 B 看成两个汇合。那么:汇合 A 的最大值和汇合 B 的最大值已知,咱们能够间接通过 max(Amax, Bmax) 求得汇合 A 与汇合 B 的并集的最大值。其中 Amax 和 Bmax 别离为汇合 A 和汇合 B 的最大值。最小值和总和也是一样的,不再赘述。因而如果统计信息满足这种性质,咱们就能够能够应用线段树。然而要不要应用,还是要看用了线段树后,是否能进步性能。 如何进步的性能呢?对于进步性能,我先卖一个关子,等前面讲完实现的时候,咱们再聊。 实现以文章结尾的求和为例。 咱们能够将区间 A 和 区间 B 别离作为一个树的左右节点,并将 A 的区间和与 B 的区间和别离存储到左右子节点中。 ...

December 16, 2021 · 3 min · jiezi

关于算法:有环或无环单链表的相交问题

对于求有环无环单链表相交的问题,是链表类型题目中首屈一指的难题,且听一一道来。 一、题目形容给定两个可能有环也可能无环的单链表,头节点head1和head2。 请实现一个函数,如果两个链表相交,请返回相交的第一个节点。如果不相交,返回null 要求:如果两个链表长度之和为N,工夫复杂度请达到O(N),额定空间复杂度请达到O(1)。 二、思路解决思路分为两大步: (1)找到单链表的入环节点,无环则返回null (2)依据失去的链表的入环节点,再展开讨论 1、找到单链表的入环节点,无环则返回null(1)遍历此单链表,如果某次遍历到的节点为null,则此单链表必然无环 (2)否则有环 筹备一个快指针,一个慢指针。开始时,两个指针都从头节点开始,快指针一次走两个节点,慢指针一次走一个节点,直到两个指针相遇。 此时,快指针再从头节点开始走,每次走一个节点;慢指针从相遇处持续往下走,仍然一次走一个节点,当两个指针再次相遇时的节点即是入环节点。 2、依据失去的链表的入环节点,再展开讨论(1)两个链表都无环 遍历其中一个链表,记录链表的长度 length1 和最初一个节点 end1;遍历另外一个链表,记录链表的长度 length2 和最初一个节点 end2。 如果end1和end2不等,则两个链表肯定不相交;否则,计算length1和length2的差值 a,长链表先走 a个节点,而后两个链表挨个往下走,第一个相等的节点即是相交的第一个节点。 (2)一个有环、一个无环 此种状况两个链表是不可能相交的。(大伙能够尝试脑补出这样的构造,记住一点,是单链表) (3)两个链表都有环 分三种状况,各自有环然而不相交;入环节点是同一个;入环节点有两个。 1)各自有环然而不相交 2)入环节点是同一个 3)入环节点有两个 两个链表的入环节点相等:即入环节点是同一个这种状况,求解过程和两个链表都是无环且相交的过程是一样的,也就是求解时齐全能够疏忽前面的环。 两个链表的入环节点不等:则是第一小种或第三小种。此时,从其中一个入环节点开始,遍历一圈,如果在回到本人时遇到了第二个入环节点,则是第三小种,否则就是第一小种。 三、具体参考代码1、找到单链表的入环节点/** * 找到单链表的入环节点,无环则返回null * * @author Java和算法学习:周一 */public static Node getLoopNode(Node head) {    if (head == null || head.next == null || head.next.next == null) {        return null;    }    // 快指针    Node fast = head.next.next;    // 慢指针    Node slow = head.next;    while (fast != slow) {        // 如果某次快指针走着走着变为空了,则此单链表必然无环        if (fast.next == null || fast.next.next == null) {            return null;        }        fast = fast.next.next;        slow = slow.next;    }    // 当快慢指针相遇时,快指针再次从头节点开始走    fast = head;    while (fast != slow) {        // 此时就不须要再判断为空了,能走到这里则此单链表必然是有环的        // 此时快指针一次走一个节点        fast = fast.next;        // 慢指针仍然一次走一个节点        slow = slow.next;    }    return slow;}2、依据失去的链表的入环节点,再展开讨论(1)两个链表都无环 /** * 当初曾经晓得两个链表无环,找到它们的第一个相交节点 * * @author Java和算法学习:周一 */public static Node noLoop(Node head1, Node head2) {    if (head1 == null || head2 == null) {        return null;    }    Node current1 = head1;    Node current2 = head2;    int n = 0;    // 链表一遍历一遍失去长度、最初一个节点    while (current1.next != null) {        n++;        current1 = current1.next;    }    // 链表二遍历一遍失去长度差、最初一个节点    while (current2.next != null) {        n--;        current2 = current2.next;    }    // 如果两个链表的最初一个节点不等,则肯定不相交    if (current1 != current2) {        return null;    }    // 长链表的头节点给current1    current1 = n > 0 ? head1 : head2;    // 短链表的头节点给current2    current2 = current1 == head1 ? head2 : head1;    n = Math.abs(n);    // 长链表先走n个节点    while (n != 0) {        n--;        current1 = current1.next;    }    // 两个链表挨个往下走,第一次相等的节点即是第一个相交的节点    while (current1 != current2) {        current1 = current1.next;        current2 = current2.next;    }    return current1;}(3)两个链表都有环 /** * 两个链表都有环 * 分三种状况,各自有环然而不相交;入环节点是同一个;入环节点有两个      * * @author Java和算法学习:周一 */public static Node bothLoop(Node head1, Node loop1, Node head2, Node loop2) {    Node current1 = null;    Node current2 = null;    if (loop1 == loop2) {        current1 = head1;        current2 = head2;        int n = 0;        // 计算head1链表有多少个节点        while (current1 != loop1) {            n++;            current1 = current1.next;        }        // 计算两个链表节点数的差值        while (current2 != loop2) {            n--;            current2 = current2.next;        }        // 长链表的头节点给current1        current1 = n > 0 ? head1 : head2;        // 短链表的头节点给current2        current2 = current1 == head1 ? head2 : head1;        n = Math.abs(n);        // 长链表先走n个节点        while (n != 0) {            current1 = current1.next;            n--;        }        // 两个链表挨个往下走,第一次相等的节点即是第一个相交的节点        while (current1 != current2) {            current1 = current1.next;            current2 = current2.next;        }        return current1;    } else {        // 两个链表的入环节点不等,则是各自有环然而不相交或者入环节点有两个        current1 = loop1.next;        // 从其中一个入环节点开始,遍历一圈,如果在回到本人时遇到了第二个入环节点,则是 入环节点有两个        while (current1 != loop1) {            if (current1 == loop2) {                // 此时两个入环节点都是第一个相交节点,返回其中一个即可                return loop1;            }            current1 = current1.next;        }        return null;    }}以上是外围具体参考代码,置信主办法和测试方法可能轻易的写进去,当然想参考全副代码,此处也附上本文全副代码的Github地址: https://github.com/monday-pro...

December 16, 2021 · 1 min · jiezi

关于算法:面试被问TopK问题可以这样优雅的解答

前言hello,大家好,我是bigsai哥哥,好久不见,甚是惦记哇! 明天给大家分享一个TOPK问题,不过我这里不思考特地大分布式的解决方案,一般的一道算法题。 首先搞清楚,什么是topK问题? topK问题,就是找出序列中前k大(或小)的数,topK问题和第K大(或小)的解题思路其实大抵统一的。TopK问题是一个十分经典的问题,在口试和面试中呈现的频率都十分十分高(从不说实话)。上面,从小小白的出发点,认为topK是求前K大的问题,一起意识下TopK吧! 以后,在求TopK和第K大问题解法差不多,这里就用力扣215数组的第k个大元素 作为解答的题演示啦。学习topk之前,这篇程序员必知必会的十大排序肯定要会。 排序法找到TopK,并且排序TopK啥,你想要我找到TopK?不光光TopK,你想要多少个,我给你多少个,并且还给你排序给排好,啥排序我最相熟呢? 如果你想到冒泡排序O(n^2)那你就粗心了啊。 如果应用O(n^2)级别的排序算法,那也是要优化的,其中冒泡排序和简略抉择排序,每一趟都能程序确定一个最大(最小)的值,所以不须要把所有的数据都排序进去,只须要执行K次就行啦,所以这种算法的工夫复杂度也是O(nk)。 这里给大家回顾一下冒泡排序和简略抉择排序区别: 冒泡排序和简略抉择排序都是多趟,每趟都能确定一个最大或者最小,区别就是冒泡在枚举过程中只和本人前面比拟,如果比前面大那么就替换;而简略抉择是每次标记一个最大或者最小的数和地位,而后用这一趟的最初一个地位数和它替换(每一趟确定一个数枚举范畴都缓缓变小)。上面用一张图示意过程: 这里把code也给大家提供一下,简略抉择下面图给的是每次选最小,实现的时候每次选最大就能够了。 //替换数组中两地位元素private void swap(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp;}//冒泡排序实现public int findKthLargest1(int[] nums, int k) { for(int i=nums.length-1;i>=nums.length-k;i--)//这里也只是k次 { for(int j=0;j<i;j++) { if(nums[j]>nums[j+1])//和右侧街坊比拟 { swap(nums,j,j+1); } } } return nums[nums.length-k];}//简略抉择实现public int findKthLargest2(int[] nums, int k) { for (int i = 0; i < k; i++) {//这里只须要K次 int max = i; // 最小地位 for (int j = i + 1; j < nums.length; j++) { if (nums[j] > nums[max]) { max = j; // 更换最小地位 } } if (max != i) { swap(nums, i, max); // 与第i个地位进行替换 } } return nums[k-1];}当然,快排和归并排序甚至堆排序也能够啊,这些排序的工夫复杂度为O(nlogn),也就是将所有数据排序完而后间接返回后果,这部分就不再具体解说啦,调调api或者手写排序都可。 ...

December 16, 2021 · 2 min · jiezi

关于算法:复制带随机指针的链表

LeetCode 138:复制带随机指针的链表 https://leetcode-cn.com/probl... 一、题目形容给你一个长度为 n 的链表,每个节点蕴含一个额定减少的随机指针 random ,该指针能够指向链表中的任何节点或空节点。 结构这个链表的深拷贝。深拷贝应该正好由 n 个 全新节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针可能示意雷同的链表状态。复制链表中的指针都不应指向原链表中的节点。 例如,如果原链表中有 X 和 Y 两个节点,其中 X.random --> Y 。那么在复制链表中对应的两个节点 x 和 y ,同样有 x.random --> y 。 返回复制链表的头节点。 用一个由 n 个节点组成的链表来示意输出/输入中的链表。每个节点用一个 [val, random_index] 示意: val:一个示意 Node.val 的整数。 random_index:随机指针指向的节点索引(范畴从 0 到 n-1);如果不指向任何节点,则为  null 。 你的代码 只 承受原链表的头节点 head 作为传入参数。 节点定义: class Node {    int val;    Node next;    Node random;    public Node(int val) {        this.val = val;        this.next = null;        this.random = null;    }}二、示例 输出:head = [[7,null],[13,0],[11,4],[10,2],[1,0]] 输入:[[7,null],[13,0],[11,4],[10,2],[1,0]]三、思路额定空间复杂度为O(1)的写法1、在原链表每个节点前面,复制一个新的节点,并连到老节点前面 即: 复制前:1 -> 2 -> 3, 复制后:1 -> 1\` -> 2 -> 2\` -> 3 -> 3\` ...

December 13, 2021 · 1 min · jiezi

关于算法:实体链接在小布助手和OGraph的实践应用

1 问题背景精准中转的常识问答能力对营造小布“懂常识、更懂你”的形象十分重要。在语音助手场景,常常会呈现一词多义或者口语化表白等问题。例如:李白出装,李白的诗,播放李白。第一李白是指游戏角色,第二个是指诗人李白,第三个是指歌曲李白。如何准确辨认用户所指、给出正确的答案是小布助手面临的挑战。 常识图谱是让机器了解主观世界的基石,领有极强的表达能力和建模灵活性。目前OPPO自建常识图谱OGraph曾经积攒了数亿实体和数十亿关系。接下来让咱们看看小布和Ograph将如何碰撞,通过实体链接技术解决实体歧义问题,帮忙小布做能听、会说、更懂你的智能助手。 2 工作介绍实体链接是NLP、常识图谱畛域的根底工作,即对于给定的一个中文文本,将其中的实体形容(mention)与给定知识库中对应的实体进行关联的工作。 2009年在TAC会议上第一次提出实体链接工作,2014年深度学习风行之前都是通过统计特色和基于图的办法进行实体链接。2017年提出了Deep Joint计划,应用Attention构造进行语义匹配来实体消歧。前面该团队通过模型构造翻新,实现了同一个模型同时实体辨认和消歧,消歧仍旧应用Attention。2018年提出了Deep Type计划,将消歧问题转化为实体分类,失去实体类别后,通过Link Count确定要链接到的实体。2020年预训练语言模型开始风行,Entity Knowledge计划借助大量的语料和弱小的预训练模型,用序列标注的形式进行实体链接。 3 技术计划实体链接通常会被拆分为三个子工作:实体辨认、候选实体召回、实体消歧。 3.1 实体辨认实体辨认的作用是辨认出query中的实体形容(即mention),例如李白所在朝代皇帝是谁中的李白即为要辨认的mention。在进行通用畛域实体辨认时,实体量级大、类型多、说法多样,因而计划要兼顾效率和泛化。 小布助手开发了基于词典的实体辨认应用自研匹配工具Word Parser,该工具无论是在性能还是性能都较开源工具有劣势。 实体链接中并不关怀实体类型,因而实体辨认能够应用 B/I 标签或者指针标注的模式,同时为了晋升输出信息的丰盛水平,引入词汇信息作为特色补充,试验了 Lattice LSTM 和 FLAT 等构造,实体辨认成果晋升约 1%。 3.2 候选实体召回候选实体召回的指标是用mention召回所有可能的候选实体,然而线上存在大量昵称、同音字、口语化表白,例如:卷福、抖森这类昵称别名,而且还会呈现表述谬误,例如饱满奥特曼、拖拉机奥特曼、倩雅集,如果不足别名到正确实体的映射,就无奈实现召回。在语音场景没有用户间接反馈,无奈像搜寻一样通过用户点击进行开掘,因而实体别名的开掘相当有挑战。 依据问题的特点,咱们构建了两套计划,通用别名开掘采纳信息抽取为主模式生成为辅的开掘流程,充分利用OGraph中的形容信息、别名信息和关系信息,从中开掘别名。 针对用户输出谬误、同音字、近音字这类别名开掘,小布助手开创性的构建了基于特色聚类的别名发现流程。开掘步骤如下: 1)Query筛选:采纳畛域关键词过滤、搜寻点击日志筛选的形式,从用户搜寻query和小布助手线上query中筛选出可能蕴含待开掘别名的query。 2)实体辨认:应用实体辨认技术,从待开掘query中辨认实体。实体辨认模型采纳通用实体辨认模型+垂域finetune的形式失去。 3)畛域特色构建:因为实体辨认间接失去的实体别名准确率不高,而且没有和实体规范名关联起来,须要构建畛域特色,将开掘的实体别名与实体规范名关联。依据场景特点,咱们选取了部首偏旁特色和拼音特色。 4)特色聚类:应用聚类的形式来关联开掘的实体别名与实体规范名。通过应用这套开掘计划,失去数十万实体别名,准确率95%+,解决了线上高频的别名问题。 3.3 实体消歧实体消歧是实体链接中最要害一步,消歧的实质是排序,通过对候选实体进行排序,失去每个候选实体的排序分数,选出最终的后果。实体消歧有上面次要问题: 1)在语音助手场景下多为短文本,因而上下文特色缺失,须要额定结构特色帮忙消歧。 2)消歧时不能仅仅通过语义特色来消歧,还要充分考虑全局消歧特色,例如“刘德华给学员讲课,把炸弹比喻成姑娘的手”中的刘德华,从语义上来讲清华大学传授刘德华更合乎,实际上是演员刘德华和《拆弹专家》的文章题目。 3)图谱中存在未对齐实体,导致模型消歧艰难,同时容易呈现语料标注谬误。例如中国和中华人民共和国在有些开源图谱中是两个实体,导致训练集里有些正确标签中国这个实体,有的正确标签为中华人民共和国这个实体。 针对下面提到的问题,咱们从数据筹备、模型选型、模型优化等方面着手,通过针对性的优化解决这些问题。 3.3.1 数据筹备结构消歧样本时,咱们提供尽可能多的信息给模型,样本由三局部形成:query样本、实体样本和统计特色。 query样本结构:query样本输出时要害时将mention的地位信息传入模型,让模型能判断mention在query中的具体位置。因而引入标识符#将,在mention两边退出对立的标识符“#”,样本如下: 实体形容样本结构:实体样本中须要蕴含待消歧实体的特色,咱们在第一版实体样本中设计了mention和规范名的拼接示意规范名和mention是否雷同这一特色;结构了“类型:实体类型”这种形容,提供实体类型信息;同时退出了实体形容和图谱的三元组信息。在第二版中,咱们将规范名和mention是否雷同的特色间接转化成文本形容“名称雷同/不同”,同时退出了“非/是主义项”这一特色,通过优化特色表达方式,模型体现晋升约2%。 统计特色样本结构:为了防止消歧模型只关注语义特色,咱们统计了query和实体样本共现特色、风行度、丰盛度、mention共现特色等统计特色,作为模型输出,辅助进行全局消歧。 3.3.2 模型选型排序学习中,有三种常见模式pointwise,pairwise和listwise,对于实体消歧这种只须要TOP1的排序工作,并不需要思考候选实体之间的顺关系,只思考全局相关性,因而咱们选取了pointwise办法。 总结前人的消歧模型,Deep Joint从排序登程,Deep Type从分类登程,都获得了较好的成果,阐明分类和排序工作都对消歧有帮忙,因而咱们依据工作特点,设计了多任务模型框架,同时进行排序和分类,两个工作共享模型参数,一起训练,损失函数一起优化,通过共享排序工作和分类工作的信息,模型能够有更好的体现,多任务损失函数如下。 为了更好的融入统计特色,咱们间接将统计特色embedding拼接到特征向量前面进行排序。 最终咱们模型构造如下,将query样本和实体样本拼接,输出预训练语言模型,将CLS地位的向量和统计特色embedding拼接后作为特征向量。排序工作将特征向量输出全连贯层,而后通过tanh最终输入[-1,1]区间的分数,分数越高代表越有可能是指标实体。分类工作将特征向量输出全链接层,通过softmax层输入各个分类的得分。 通过试验基于多任务的实体链接模型成果整体上优于单任务模型,具体F1见下表。 3.3.3 模型优化为了理解模型到底关注哪些输出特色,应用互信息的可视化办法对模型进行可视化,对各个词的重要水平进行了可视化,色彩越深重要水平越高。通过可视化发现,模型偏向于关注实体的类型和用来辨别实体的片段,例如示例1吃得慢、食物、吃法、火腿肠,示例2中的珊迪、海绵宝宝、开关电源品牌。示例3种的人物、种族、梦三国等,能够看到多任务模型关注的特色都是对消歧有帮忙的。 ...

December 13, 2021 · 1 min · jiezi

关于算法:上岸算法LeetCode-Weekly-Contest-270解题报告

【 NO.1 找出 3 位偶数】 解题思路签到题,枚举所有组合即可。 代码展现 class Solution { public int[] findEvenNumbers(int[] digits) { Set<Integer> result = new HashSet<>(); for (int i = 0; i < digits.length; i++) { for (int j = 0; j < digits.length; j++) { for (int k = 0; k < digits.length; k++) { if (i == j || j == k || i == k) { continue; } if (digits[i] != 0 && digits[k] % 2 == 0) { result.add(digits[i] * 100 + digits[j] * 10 + digits[k]); } } } } int[] arr = result.stream().mapToInt(i -> i).toArray(); Arrays.sort(arr); return arr;}} ...

December 13, 2021 · 2 min · jiezi

关于算法:COMP331COMP557-Optimisation

Programming AssignmentDue date: Friday, December 10th, 2021, noon, via SAM(https://sam.csc.liv.ac.uk/COM... orhttps://sam.csc.liv.ac.uk/COM...)This assignment is worth 15% of your grade.The following graph shows 12 positions with connections (this arrangement is called the Frucht graph1):At each of the 12 positions you plan to build one building that is either a quarry, or a factory, or a market.There are three types of resources: gold, diamonds, and jewellery. Every year the same amount of resources arebeing sent from building to building over the connections. There is a limitation though for each connection: Inevery year the sum of all resources that are being sent over a connection cannot exceed 165 units in total (forexample, if 100 units of gold are being sent from a to b, then the amount of diamonds that are being sent fromb to a is at most 65).Every year you have 850 units of energy available. Energy is not transported through the network, but isavailable everywhere.? Every year a quarry produces 200 units of gold and 75 units of diamonds. This costs 100 units of energy.? Every year a factory uses 70 units of gold and 20 units of diamonds and produces 60 units of jewellery.This costs 300 units of energy.? The market sells gold, diamonds, and jewellery.– A unit of gold gives £150.– A unit of diamonds gives £200.– A unit of jewellery gives £1000.Selling costs no energy. The sum of all revenues of all markets is called the total revenue.Resources cannot be carried over between years. Quarries and factories are not required to use up all resources.You can decide to forward or destroy an arbitrary amount of resources. The forwarding and the destruction ofresources cost no energy. You also do not have to sell everything that gets sent to a market. You can forwardthose resources instead. It obviously makes no sense to forward jewellery through a market instead of sellingit, but it could in principle be useful to forward gold or diamonds instead of selling them, so that they can beconverted to jewellery at a factory.Quarries and factories can run on an efficieny lower than 100%. Their input, their output, and their energyusage scale down linearly.On the next page is a graphical presentation of an optimal solution for a specific fixed arrangement of buildings.Quarries are yellow, factories are blue, and markets are red. G stands for gold, D stands for diamond, J standsfor jewellery. The efficiencies are shown within the circles. ...

December 11, 2021 · 4 min · jiezi

关于算法:将单向链表划分成左边小中间等右边大的形式

咋一看,仿佛和快排的partition过程,也就是荷兰国旗问题很类似,只是此处换成了单链表构造,实际上也的确能够采纳荷兰国旗问题来求解,只是此时的额定空间复杂度为O(N)。 1、采纳荷兰国旗问题求解:(1)将链表放到数组中 (2)应用荷兰国旗办法将数组分为小于区、等于区、大于区 (3)将数组从新连成链表,返回头节点 /** * @author Java和算法学习:周一 */public static Node comparator(Node head, int pivot) {    if (head == null) {        return null;    }    // 获取链表节点数    Node current = head;    int i = 0;    while (current != null) {        i++;        current = current.next;    }    // 将链表放到数组中    Node[] arr = new Node[i];    current = head;    for (i = 0; i < arr.length; i++) {        arr[i] = current;        current = current.next;    }    // 将数组分为小于区、等于区、大于区(外围就是荷兰国旗问题)    partition(arr, pivot);    // 将数组连成链表    for (i = 1; i < arr.length; i++) {        arr[i - 1].next = arr[i];    }    arr[i - 1].next = null;    // 返回头节点    return arr[0];}private static void partition(Node[] arr, int pivot) {    int small = -1;    int big = arr.length;    int index = 0;    while (index < big) {        if (arr[index].value < pivot) {            swap(arr, ++small, index++);        } else if (arr[index].value == pivot) {            index++;        } else {            swap(arr, --big, index);        }    }}2、额定空间复杂度为O(1)的解法:(1)应用6个变量,顺次示意小于区头节点、尾结点,等于区头节点、尾结点,大于区头节点、尾结点 (2)遍历链表,把节点放到各个局部、同时调整尾结点 (3)将小于区 等于区 大于区 三块头尾连接起来 /** * @author Java和算法学习:周一 */public static Node smallerEqualBigger(Node head, int pivot) {    // 小于区头节点    Node sH = null;    // 小于区尾节点    Node sT = null;    // 等于区头节点    Node eH = null;    // 等于区尾节点    Node eT = null;    // 大于区头节点    Node bH = null;    // 大于区尾节点    Node bT = null;    // 标记以后遍历的next节点    Node next = null;    // 将链表分成 小于区 等于区 大于区 三块    while (head != null) {        // 记录next节点        next = head.next;        // 以后节点next节点置空        head.next = null;        if (head.value < pivot) {            // 小于区            if (sH == null) {                // 如果是小于区的第一个节点,则小于区的头尾节点都指向以后节点                sH = head;                sT = head;            } else {                // 如果不是小于区的第一个节点,则小于区的尾结点指向以后节点,调整尾结点                // 即在以后区内将各节点再次连接起来                sT.next = head;                sT = head;            }        } else if (head.value == pivot) {            // 等于区            if (eH == null) {                // 如果是等于区的第一个节点,则等于区的头尾节点都指向以后节点                eH = head;                eT = head;            } else {                // 如果不是等于区的第一个节点,则等于区的尾结点指向以后节点,调整尾结点                eT.next = head;                eT = head;            }        } else {            // 大于区            if (bH == null) {                // 如果是大于区的第一个节点,则大于区的头尾节点都指向以后节点                bH = head;                bT = head;            } else {                // 如果不是大于区的第一个节点,则大于区的尾结点指向以后节点,调整尾结点                bT.next = head;                bT = head;            }        }        // 以后节点挪动到next节点        head = next;    }    // 将小于区 等于区 大于区 三块头尾连接起来    // 小于区存在    if (sT != null) {        // 则小于区尾节点连贯等于区头节点        sT.next = eH;        // 如果此时等于区尾结点为空(即整个等于区为空),那么等于区的尾结点则为小于区尾结点        // 如果此时等于区尾结点不为空,那么等于区的尾结点就是之前的尾结点        eT = eT == null ? sT : eT;    }    // 有等于区,eT 就是等于区的尾结点    // 无等于区,有小于区,eT 就是小于区的尾结点    // 无等于区,无小于区,eT 就是空    if (eT != null) {        // 则等于区的尾结点连贯大于区头节点        eT.next = bH;    }    // 最初返回以后的头节点    // 有小于区,返回小于区头节点    // 无小于区,有等于区,返回等于区头节点    // 无小于区,无等于区,有大于区,返回大于区头节点    return sH != null ? sH : (eH != null ? eH : bH);}本文所有代码:https://github.com/monday-pro/algorithm-study/tree/master/src/basic/node

December 11, 2021 · 1 min · jiezi

关于算法:35搜索插入位置-算法leetode附思维导图-全部解法300题

零 题目:算法(leetode,附思维导图 + 全副解法)300题之(35)搜寻插入地位一 题目形容 二 解法总览(思维导图) 三 全副解法1 计划11)代码: // 计划1 “忽视要求,遍历法”// 思路:// 1)状态初始化// 2)外围解决:遍历 nums ,若此时 nums[i] >= target ,则 间接return i;// 3)边界:遍历完结,没找到 nums[i] >= target ,则 return l; (即插入 nums 开端)。var searchInsert = function(nums, target) { // 1)状态初始化 const l = nums.length; // 2)外围解决:遍历 nums ,若此时 nums[i] >= target ,则 间接return i; for (let i = 0; i < l; i++) { if (nums[i] >= target) { return i; } } // 3)边界:遍历完结,没找到 nums[i] >= target ,则 return l; (即插入 nums 开端)。 return l;};2 计划21)代码: ...

December 11, 2021 · 2 min · jiezi

关于算法:判断链表是不是回文结构

啥是回文结构:一个链表正向看和反向看都是一样的。 例如:1 --> 2 --> 2 --> 1,1 --> 2 --> 3 --> 2 --> 1这样的链表就具备回文结构。 1、额定空间复杂度为O(1)的写法:(1)找到此链表的中点(偶数个节点则找上中点) (2)调整链表构造 例如:1 --> 2 --> 3 --> 3 --> 2 --> 1,调整为:1 --> 2 --> 3 <-- 3 <-- 2 <-- 1,上中点3的next节点为null (3)判断是否为回文结构 (4)将链表调整为原来的构造 (5)返回后果 /** * @author Java和算法学习:周一 */public static class Node {    public int value;    public Node next;    public Node(int v) {        value = v;    }}/** * 额定空间复杂度为O(1) * * 全程只应用了n1、n2、n3三个无限变量 */public static boolean isPalindromeList(Node head) {    // 只有一个节点的链表必定是回文结构    if (head == null || head.next == null) {        return true;    }    // 1.找到此链表的中点(偶数个节点则找上中点)    Node n1 = head;    Node n2 = head;    while (n2.next != null && n2.next.next != null) {        n1 = n1.next;        n2 = n2.next.next;    }    // 此时n1即为中点(偶数个节点则为上中点)    // 2.调整链表构造    // 例如:1 --> 2 --> 3 --> 3 --> 2 --> 1,调整为:1 --> 2 --> 3 <-- 3 <-- 2 <-- 1,上中点3的next节点为null    // n2批改为右半局部的第一个节点    n2 = n1.next;    // 中点(或上中点)的next节点置为null    n1.next = null;    Node n3 = null;    while (n2 != null) {        // 记录此时右半局部节点的next节点        n3 = n2.next;        // 将n2的next节点指向前一个节点        n2.next = n1;        // 调整n1,即n1后移一个节点        n1 = n2;        // 调整n2,即n2到本来n2的后一个节点        n2 = n3;    }    // 此时n1为链表最初一个节点,n2和n3都为null    // 3.判断是否为回文结构    // 记录链表最初一个节点,判断完是否为回文结构后将链表调整回去时须要    n3 = n1;    // n2从右边第一个节点开始,n1从最初一个节点开始    n2 = head;    // 记录是否为回文结构    boolean res = true;    while (n1 != null && n2 != null) {        if (n1.value != n2.value) {            res = false;            // 此处不能间接返回是否为回文结构,还须要将链表调整为原始构造            break;        }        // n1和n2都往两头挪动        n1 = n1.next;        n2 = n2.next;    }    // 4.将链表调整为原来的构造    n1 = n3.next;    // 链表最初一个节点指向null    n3.next = null;    while (n1 != null) {        // 记录next节点        n2 = n1.next;        // n1的next节点指向后一个节点(行将链表调整为原来的构造)        n1.next = n3;        // n3前移        n3 = n1;        // n1前移        n1 = n2;    }    // 调整完后才返回最初的后果    return res;}2、额定空间复杂度为O(N)的写法:(1)将链表元素放进栈中,因为栈先进后出,等于把链表翻转了 (2)从原链表头节点开始,挨个和栈弹出的元素进行比拟 (3)每次的值都相等,则是回文结构 /** * 采纳栈来作为对数器。 * * 额定空间复杂度为 O(N) * * @author Java和算法学习:周一 */public static boolean comparator(Node head) {    Stack<Node> stack = new Stack<>();    Node current = head;    while (current != null) {        stack.push(current);        current = current.next;    }    while (head != null) {        if (head.value != stack.pop().value) {            return false;        }        head = head.next;    }    return true;}本文所有代码:https://github.com/monday-pro/algorithm-study/tree/master/src/basic/node

December 10, 2021 · 1 min · jiezi

关于算法:活动预告|Feature-Store-Meetup

流动预报|Feature Store Meetup 2021年12月11日 14:00-18:00,第四范式开发者社区Feature Store Meetup将在第四范式北京Office召开。流动邀请到小米商业平台技术部负责人-黄飞、美团外卖广告预估方向工程负责人-邹亚劼、伴鱼AI平台负责人-陈易生,独特探讨Feature Store在各公司的实现与利用。 第四范式零碎架构师、数据库团队和高性能计算团队负责人、开源我的项目 OpenMLDB 负责人-卢冕还将带来“开源机器学习数据库 OpenMLDB:为企业提供全栈 FeatureOps 解决方案”主题分享。 具体内容见海报,欢送大家点击下方链接或扫描海报二维码报名参会~报名链接:http://hdxu.cn/mkLDK

December 9, 2021 · 1 min · jiezi

关于算法:排序算法总结

说了这么久的排序算法,是时候进行总结一下了。本文总结了排序算法的稳定性、排序算法常见的坑、工程上对排序算法的改良等。 一、排序算法的稳定性稳定性定义:稳定性是指样本在排序之后不会扭转绝对程序。 对于根底类型来说,稳定性毫无意义 对非根底类型来说,稳定性有重要意义 排序算法工夫复杂度额定空间复杂度稳定性抉择排序O(N^2)O(1)无(抉择最小的数和第一个地位的数替换时扭转了绝对程序)冒泡排序O(N^2)O(1)有(相等时不往后替换即可)插入排序O(N^2)O(1)有(相等时不前移即可)归并排序O(N*logN)O(N)有(相等时拷贝左组的即可)疾速排序O(N*logN)O(logN)无(小于区右扩,替换以后数和小于区最右侧的数时扭转了绝对程序)堆排序O(N*logN)O(1)无(调整为大根堆或小根堆时就扭转了绝对程序)二、排序算法总结1、不基于比拟的排序,对样本数据有严格要求,不易改写 2、基于比拟的排序,只有规定好两个样本怎么比大小就能够间接复用 3、基于比拟的排序,工夫复杂度的极限是O(N*logN) 4、工夫复杂度O(N*logN)、额定空间复杂度低于O(N)、且稳固的基于比拟的排序是不存在的。 5、为了相对的速度选快排(工夫复杂度的常数工夫小)、为了省空间选堆排、为了稳定性选归并 三、排序算法常见的坑在网上见到以下相干的文章,如果不是做学术研究的,能够间接疏忽,不然对于你而言只是浪费时间,最初发现毫无用处。 1、归并排序的额定空间复杂度能够变成O(1),采纳“归并排序 外部缓存法”,然而将变得不再稳固。 2、“原地归并排序”是垃圾贴,会让工夫复杂度变成O(N^2) 3、疾速排序稳定性改良, “01 stable sort" ,然而会对样本数据要求更多。 4、在整型数组中,请把奇数放在数组右边,偶数放在数组左边,要求所有奇数之间原始的绝对秩序不变,所有偶数之间原始绝对秩序不变。工夫复杂度做到O(N),额定空间复杂度做到O(1)。 这是不可能的。 这就是快排的partition分成小于、等于、大于区的过程,在此过程的规范和分奇偶一样是01规范,而快排的工夫复杂度是O(N*logN),额定空间简单是O(logN),所以是不可能的,不然快排早就改良了。 四、工程上对排序的改良1、稳定性的思考例如:Java中Arrays.sort()办法,如果传入的是根底类型,零碎是采纳快排进行排序的(因为此时的稳定性是无意义的,而快排比堆排更快);如果传入的是非根底类型,零碎是采纳归并排序进行排序的(因为此时可能是须要稳定性的)。 2、充分利用O(N*logN)和O(N^2)排序算法各自的劣势插入排序O(N^2),然而常数项小 疾速排序O(N * logN),然而常数项高 也就是N很大的时候,采纳快排;当N比拟小(小于60,试验得出)的时候,采纳插排。

December 9, 2021 · 1 min · jiezi

关于算法:高效设计一个LRU

前言大家好,我是bigsai,好久不见,甚是惦记! 最近有个小伙伴跟我诉苦,说他没面到LRU,他说他很久前晓得有被问过LRU的然而心想本人应该不会遇到,所以临时就没筹备。 奈何不巧,这还就真的考到了!他此刻的情绪,能够用一张图来证实: 他说他最终踉踉跄跄的写了一个效率不是很高的LRU,面试官看着不是很称心……起初果然GG了。 避免日后再碰到这个坑,明天和大家一起把这个坑踩了,这道题我本身刚开始也是用较为一般的办法,然而好的办法尽管不是很难然而想了真的很久才想到,尽管花了太多工夫不太值,总算是本人想进去了,将这个过程给大家分享一下(只从算法的角度,不从操作系统的角度)。 了解LRU设计一个LRU,你得晓得什么是LRU吧? LRU,英文全称为Least Recently Used,翻译过去就是最近最久未应用算法,是一种罕用的页面置换算法。 说起页面置换算法,这就是跟OS关系比拟大的了,咱们都晓得内存的速度比拟快,然而内存的容量是十分无限的,不可能给所有页面装到内存中,所以就须要一个策略将罕用的页面预放到内存中。 然而吧,谁也不晓得过程下次会拜访哪个内存,并不能很无效的晓得(咱们在以后并没有预测将来的性能),所以有些页面置换算法只是理想化然而没法实在实现的(没错就是最佳置换算法(Optimal)),而后常见必回的算法就是FIFO(先进先出)和LRU(最近最久未应用)。 LRU了解不难,就是保护一个有固定大小的容器,外围就是get()和put()两个操作。 咱们先看一下LRU会有的两个操作: 初始化:LRUCache(int capacity) ,以正整数作为容量 capacity 初始化 LRU 缓存。 查问:get(int key),从本人的设计的数据结构中查找是否有以后key对应的value,如果有那么返回对应值并且要将key更新记录为最近应用,如果没有返回-1。 插入/更新:put(int key,int value),可能是插入一个key-value,也可能是更新一个key-value,如果容器中曾经存才这个key-value那么只须要更新对应value值,并且标记成最新。如果容器不存在这个值,那么要思考容器是否满了,如果满了要先删除最久未应用的那对key-value。 这里的流程能够给大家举个例子,例如 容量大小为2:[ "put", "put", "get", "put","get", "put","get","get","get"][ [1, 1], [2, 2], [1], [3, 3], [2], [4, 4], [1], [3], [4]]这个过程如下: 大家容易疏忽的细节有: put()存在更新的操作,例如put(3,3),put(3,4)会更新key为3的操作。get()可能查问不到,然而查问到也会更新最久未应用的程序。如果容器未应用满,那么put可能更新可能插入,然而不会删除;如果容器满了并且put插入,就要思考删除最久未应用的key-value了。对于下面的这么一个规定,咱们该如何解决呢? 如果单单用一个List相似的列表,能够顺序存储键值对,在List后面的(0下标为前)咱们认为它是比拟久的,在List后咱们认为它是比拟新的。咱们思考下各种操作可能会这样设计: 如果来get操作: 遍历List一个个比对,查看是否有该key的键值对,如果有间接返回对应key的value,如果没有那么返回-1.如果来put操作: 遍历List,如果有该key的键值对,那么果决删除这个key-value,最初在开端对立插入该键值对。 如果没有对应的key并且List容器曾经达到最满了,那么果决删除第一个地位的key-value。 用List可能须要两个(一个存key一个存value),或者一个存Node节点(key,value为属性)的List,思考下这个工夫复杂度: put操作:O(n),get操作:O(n) 两个操作都须要枚举列表线性复杂度,效率属实有点拉胯,必定不行,这样的代码我就不写了。 哈希初优化从下面的剖析来看,咱们曾经能够很自信的将LRU写进去了,不过当初要思考的是一个优化的事件。 如果说咱们将程序中引入哈希表,那么必定会有一些优化的。用哈希表存储key-value,查问是否存在的操作都能优化为O(1),然而删除或者插入或者更新地位的复杂度可能还是O(n),咱们一起剖析一下: 最久未应用肯定是一个有序的序列来贮存,要么是程序表(数组)要么是链表,如果是数组实现的ArrayList存储最久未应用这个序列。 如果是ArrayList进行删除最久未应用(第一个)key-value,新的key被命中变成最新被应用(先删除而后插入开端)操作都是O(n)。 同理如果是LinkedList的一些操作大部分也是O(n)的,像删除第一个元素这个是因为数据结构起因O(1)。 你发现自己的优化空间其实十分十分小,然而的确还是有提高的,只是被卡住不晓得双O(1)的操作到底怎么优化,这外面我把这个版本代码放进去,大家能够参考一下(如果面试问到切实不会能够这么写) class LRUCache { Map<Integer,Integer>map=new HashMap<>(); List<Integer>list=new ArrayList<>(); int maxSize; public LRUCache(int capacity) { maxSize=capacity; } public int get(int key) { if(!map.containsKey(key))//不存在返回-1 return -1; int val=map.get(key); put(key,val);//要更新地位 变成最新 很重要! return val; } public void put(int key, int value) { //如果key存在,间接更新即可 if (map.containsKey(key)) { list.remove((Integer) key); list.add(key); } else {//如果不存在 要插入到最初,然而如果容量满了须要删除第一个(最久) if (!map.containsKey(key)) { if (list.size() == maxSize) { map.remove(list.get(0)); list.remove(0); } list.add(key); } } map.put(key, value); }}哈希+双链表下面咱们曾经晓得用哈希可能间接查到有木有这个元素,然而苦于删除!用List都很费劲。 ...

December 9, 2021 · 2 min · jiezi

关于算法:模型推理教你用-C-实现一般模型推理图片预处理模块

 欢送关注我的公众号 [极智视界],回复001获取Google编程标准 O_o >_<  o_O O_o ~_~ o_O 大家好,我是极智视界,本文介绍了用 C++ 实现个别模型推理图片预处理的办法,通用性较强。   大家晓得,对于一个视觉深度学习利用来说,次要会波及几个流程:视频编解码、图像预处理、模型推理、后处理。这里介绍一下图像预处理的实现。   以默认如下配置为例:opencv 读图、宽高均为512、三通道、均值 [0.485, 0.456, 0.406]、方差 [0.229, 0.224, 0.225]、需做归一化、以 RGB 喂给模型。那么你的预处理能够这么写: cv::Mat source, frame;source = cv::imread(img_path); // 读图if (!source.data) // 异样判断{ std::cout << " read error" << std::endl;}int batchsize = 1;int net_w = 512;int net_h = 512;cv::cvtColor(source, frame, cv::COLOR_BGR2RGB); // 通道转换cv::resize(frame, frame, cv::Size(net_w, net_h)); // resizefloat* mat_data = new float[batchsize * net_w * net_h * 3];int data_index = 0;// 开启图像预处理for(int i = 0; i < net_h; i++){ const uchar* current = frame.ptr<uchar>(i); // 指向每行首地址 for(int j = 0; j < net_w; j++) { mat_data[data_index] = ((current[3*j + 0] / 255.0) - 0.485) / 0.229; // R mat_data[net_w*net_h + data_index] = ((current[3*j + 1] / 255.0) - 0.456) / 0.224; // G mat_data[2*net_w * net_h + data_index] = ((current[3*j + 2] / 255.0) - 0.406) / 0.225; // B data_index++; }}// 而后把 mat_data 喂给模型// 用完之后别忘了 delete mat_datadelete mat_data;   解释一下以上的代码,opencv 读图默认 BGR 排布,这个案例须要以 RGB 喂给模型,所以在做预处理的时候最重要的是要把通道对应起来。这里的实现次要利用了指针偏移,每个内循环的起始地位都是指向每行首地址,而后缓缓往后偏移,在偏移的途中顺便做一些预处理的操作,等走完一遍也就顺便实现了图像预处理流程,这样的解决形式,效率还是不错的。 ...

December 8, 2021 · 1 min · jiezi

关于算法:Data-structure-and-algorithm

Data structure and algorithm analysis project2021N-Body dynamics simulation under gravitational force andcollision IntroductionIn this project, you are going to build a simulation system of rigid spherical objects. You should write aprogram to simulate some rigid balls in a vacuum space so that they can move and collide with eachother.The basic aspects of the problem are as follows:• All of the objects are rigid body. When they collide with each other, they will not change shape.They will not break into pieces either.• Each object has its own size, mass, position and color. You can add as many attributes to theobjects as you wish. The size, mass and color of an object do NOT change. But the position canchange with time.• Since the objects move their position, they can collide with each other and bounce off with eachother. When this happens, the energy and momentum are preserved.• There are gravitational forces between objects. This affects the movement of the objects.• You need to write programs to simulate this process.The difficulty of this problem can vary a lot with different requirement of the program. In order to simplifythis job, we add the following simplification:• All of the objects that move in space are spherical balls with uniform density, which means thecentroid of mass of a ball is the the geometry center of the same ball.• Ignore relativistic effect, quantum effect, air resistence (as the space is vacuum), friction.• The gravitational force between two objects is denoted as: , where is the gravitationalconstant, approximatly . You can use that number in this project. and are the mass of the two object, respectively. is the distance between the centroid of the twoobject.• The objects are smooth. And they do NOT rotate at the initial state of the simulation. So they willnot rotate at any time.• The objects are in a two dimensional space. There are four walls around the space. The walls arealso rigid. When the objects collide with the wall, they can bounce off the wall. The mass of thewalls are very small, so the gravitational force between the walls and the objects are ignored. Thewalls do not move, so that you can simulate a finite size of a square space where x,y [0, length]instead of from negative infinity to positive infinity.R2Gm m1 2 G6.67 × 10 Nm /kg −11 2 2 m1m2 R∈• The objects cannot intersect with each other. The objects cannot intersect with the wall.• All collisions happens instantly.Your program should display the result using a graphic window. The window should display how the ballsmove as time goes.You should also write some test code to test the correctness of your program as well as the performance.Note that in real world project, this could be equally important as writing a good algorithm.Project RequirementThe actural work of the project contains many parts:• Write the system described above. (50 Points)• Test the accuracy and performance of your system. (10 points)• Write your report. (10 points)Write the system described above. First of all, you should make such a system.• (10 points) Can customize all collision balls.(This means that the program should be able to readfrom standard input the initial state of all the balls.)• (20 points) The program should be able to run and show the movement of the objects with GUI.• (10 points) To collide and bounce according to the energy and momentum.• (10 points) Consider the influence of gravity.Test the accuracy and performance of your system.• (5 points) Show that your program can produce the correct result.• (5 points) Show the performance of your program.Programming mistakes can happen anywhere in such a project. Some mistakes will make your programproduce the wrong result but still be able to run. Try to prove that your program can produce the rightresult.You could also find ways to show that your program runs fast, especially when you have someperformance improvement in your project. Try to run your program with large number of objects insteadof just 10 objects. Maybe you can test the frame rate of your program. You may also find hints in thereference material at the end of this document.Write your report.Include everything you want us to know about your project. Such as the basic structure of your project,the data structures you have used in the project, the way you optimize the performance, and anythingthat makes your project different from others.Clearly state how to run your program in your report. It's necessary when we test your program.You may also include some statistics of your program, such as those mentioned in the reference links.However, we have no requirement on the length of the report. Do NOT try to make it unnecessarily long.Remember to include group members and student numbers. Also remember to upload your report in"pdf" format.Extra testYou may noticed that the above parts add up to 70 points. In the last we will run some test we haveprepared on your program. That is the last 30 points of your project. This can only be down after yourcode is submitted. We'll test your program by some cases. By specifying the number of objects and eachobject's size, mass, position and color, your program's result should be the same with the standardanswer. The difficulty of each test cases is different. Some examples contains only a few objects, e.g. onlyor 4 balls in the space. However, some cases contains much more objects than that. Brute forcealgorithms may not pass all of them, and you can try to minimize the time complexity of your algorithm.Each test case has some score, and your score depends on the number of test cases you pass. Youralgorithm has to be able to show us the process through the GUI.There are restrictions on what you can use and cannot use in this project.You could use various tools to advance your project, but third party physics engines, game engines arenot allowed. For instance, you could use OpenGL, and OpenCL, but Unity and Unreal are not allowed touse in the project.You are allowed to use algs4 library. If you want to use some library and you are not sure about it, youcan ask.Input & Output StandardHere's a template input file in the block shown as below.terminal10030.5 0.5 0 0 0.1 1000000 150 30 100.1 0.5 0 0.01 0.03 1 50 50 500.8 0.5 0 0.01 0.01 0.1 50 50 503204There are 2 choices of line 1st: terminal and gui. terminal means you should not show a window.Instead, you should print the required information in the terminal. gui means you should show a window.The number of line 2nd indicates the side length of the square space, all the objects are supposed be inthe square space. For example, the second line contains 100, then the x and y coordinate of everything inyour space is in [0, 100].The number of line 3rd num is the number of objects.For each of the next num lines, there are 9 numbers represent the initial state of one object. The 9numbers are:• x-coordinate x• y-coordinate y• initial velocity in the x direction vx• initial velocity in the y direction vy• radius of the square radius• mass of the square weight• color of the square r g b.The unit of x, y and radius is meter. The unit of vx and vy is meter/second. The unit of weight iskilogram.The objects are indexed. The first object is the 0th and the second object is the 1st,..., the last object isnum-1.The number in the next line query indicates the number of querys. For each of the next query lines, thereare 2 numbers. The first is the time t in seconds and the second is index of the object. You should print aline containing the x, y, vx, vy of the object at the time t seconds after the begining of the simulation.Sample Input:terminal10015 1 0 1 100 150 150 1503000Sample Output:5 1 05 1 05 1 0In the above example, the object's initial location is (3, 5), the velocity is (1, 0). So after 4 seconds, thelocation is (7, 5). The speed remains the same in the above example.Please follows strictly the above requirement. When we test your program (as mentioned in the lastsection, 30 points), we will run your program with our input data and compare your result with thestandard output data. If your program does not follow the above restriction and prints something else,the comparison will fail and it will not be good.It you have any question about the input output format, you can ask.

December 7, 2021 · 7 min · jiezi

关于算法:IAE-101-Digital-Intelligence

IAE 101 – Introduction to Digital IntelligenceFall, 2021Programming Project 04 – Creating a TwitterbotAssigned: Friday, November 19th, 2021Due: Friday, December 10th, 2021, at 11:59 PMDescription:Twitter is a social media platform through which users can post short messages that everyone calls "tweets", but which the developers of Twitter insist are called "statuses". Initially, the length of tweets was restricted to 140 characters, but the limit was recently doubled to 280 characters.Users can engage with each other and gain access to each other's status updates by following each other. When you log into Twitter you are presented with your home timeline, which is a display of all the tweets sent by you and the other user's that you follow, typically ordered from most recent to least recent.Twitter engagement and interaction takes many forms. Some users post frequently while others post seldom or never. Some users post the everyday minutiae of their lives. Others engage in extended political discussions. Politicians, journalists, academics, celebrities, and professionals of many other types make use of Twitter to pursue their various interests. The medium has shown remarkable versatility given the strict limits on the length of status updates.Since early on in its existence, Twitter has also been home to automated participants, Twitterbots –programs that read and post status updates to Twitter. These algorithmic users vary quite a bit in their overall sophistication. Dr. Graham discussed several examples during her lecture on Wednesday (11/18/2020). I follow at least two movie related bots—one that posts the script of the 1995 movie Hackers one line at a time, and another that posts lines from Kurt Russel's character Jack Burton from the movie Big Trouble in Little China. However, their behavior can be much more interesting and complex than this.Here are some lists of popular and well-regarded Twitterbots.• https://blog.mozilla.org/inte... internet-better-place/• http://nymag.com/intelligence...• https://discover.bot/bot-talk...• https://www.poynter.org/tech-...Twitterbots are a kind of public performance, and they are often an interactive form of public performance in which the bot engages with the status updates posted by other users in interesting, or significant, or amusing, or beautiful ways.For this assignment you will build a Twitterbot using Python and the Tweepy library for accessing Twitter's Application Programming Interface. I have simplified the interface to make it easier for you all to use and to restrict the operations you can take. Your real task is to think about an interesting way to have your bot perform on Twitter and implement that in mytwtterbot.py.Directions: ...

December 5, 2021 · 5 min · jiezi

关于算法:你该不会拿-CSAPP-垫显示器吧

一个程序员,到底须要对计算机的硬件理解到什么水平呢? 如果你是零碎级软件开发工程师,想必这本书是你的案(垫)头(显)必(示)备(器); 如果你是应用软件工程师,或者不须要太多底层常识也能够使用高级语言设计程序。不过,只有你和计算机打交道,这本书中的内容你早晚都会遇到…… 《深刻了解计算机系统》(简称 CSAPP),CMU 计算机导论教材,豆瓣评分 9.8,被誉为计算机领域的 「神书」。 这本书的诞生能够回溯到 1998 年秋季 CMU 开设的计算机系统导论(ICS)课程。课程传授 Randal 和 David 意识到,「学生中简直没有人会亲自结构一个计算机系统,但大多数学生都日常应用计算机编写程序」。因而,他们筛选了主题,排除了手写汇编语言、总线设计这样的内容,重点关注:C 语言编译器是如何将 C 语言翻译成机器代码的?编译器是如何翻译指针、循环、过程调用语句的?因而,这门课、这本书的主旨是从程序员的角度来解说零碎,把硬件、零碎、软件系统地联合起来,形成一整个框架,这对学生而言更实用也更具体。 不少国内学校都以这本书作为参考教材,所有想通过学习计算机系统的外在运作、从而写出更好程序的人,都应该认真浏览此书并实现课后作业 。 这本书中的不少内容针对 C 语言个性(包含指针、显式的动态内存调配、格式化的 I/O),对于 C 语言背景单薄的读者,这本书中有一些专门的正文帮忙突出 C 语言中重要的个性。 如果你感觉这本书对你有些艰难,但又渴望理解计算机体系结构,能够从《编码:隐匿在计算机软硬件背地的语言》这本小书动手,也能够参考本文第三局部 「如何浏览这本书」 辅助学习。 你将从这本书中取得: 理解编译系统如何工作,帮忙优化程序性能、了解链接时呈现的谬误、防止安全漏洞零碎级了解计算机的实质概念,以及这些概念如何实实在在地影响应用程序的正确性、性能和实用性二进制炸弹 CSAPP 这本书十分激励你入手尝试,每章都带有练习题与参考答案,还有相应的实验课(Lab)与试验的主动评分零碎。 你能够从官网上找到九个试验(http://csapp.cs.cmu.edu/3e/la...)包含:数据试验、二进制炸弹试验、缓冲区溢出试验、体系结构试验、性能试验、cache 试验、shell 试验、malloc 试验、代理试验。这些配套试验不仅有趣风趣,而且能训练你学到的内容,加强调试程序的能力,让你一生受害。 让咱们一起来看看赫赫有名的「二进制炸弹」吧! 邪恶博士在咱们的班级机器上搁置了大量的「二进制炸弹」。二进制炸弹是由六个环节组成的程序。每个环节,你都要输出一个特定的字符串。只有输出正确的字符串能力拆除炸弹,进入下个关卡。否则,炸弹会爆炸!在解决本程序时,不得穿戴防弹衣。 有太多炸弹要咱们解决,所以咱们给每个学生一个炸弹来拆除。这是你的工作,你别无选择,只能承受,就是在截止工夫前拆除你的炸弹。祝你好运,欢送退出拆弹小组! 这个试验能训练到哪些能力? 比方,想要破解第一个炸弹,须要执行以下步骤: 设置调用函数断点运行至断点处并调试进入函数外部进一步察看剖析代码得出答案残缺拆除六个炸弹,你就能够相熟 GDB 调试工具、彻底了解函数调用的栈帧、相熟罕用寄存器的用处、相熟 AT&T 汇编语法。 在小编看来,写程序这件事件有一个极大的妙处:当你学到了什么新货色,你能够马上试验并看到运行后果。你不须要看残缺本书就能明确某件事情,我只须要学到能够本人能入手尝试并纠错就够了。 在计算机底层,数组是如何存储的?让咱们来看下方两个函数,这两个函数都是对一个二维数组的各个元素求和,区别在于循环的优先程序不同: int sumarrayrows(int a[M][N]) { int i, j, sum = 0; for (i = 0; i < M; i++) { for(j = 0; j < N; j++) { sum += a[i][j]; } } return sum;}// 后行后列int sumarraycols(int a[M][N]) { int i, j, sum = 0; for (j = 0; j < N; j++) { for(i = 0; i < M; i++) { sum += a[i][j]; } } return sum;}// 先列后行编译运行,看看运行耗时差了多少?后行后列比先列后行快了 25 倍! ...

December 1, 2021 · 1 min · jiezi

关于算法:COMP5823M

Dungeon 1: The Charming Choreographer (Inverse Kinematics, 33g of total 100g). 1g may be exchangedfor a human percentage point in COMP5823M.For the birthday celebration of Lord Spinhead, the Great Dancer Lady Anklesprainer is the masterchoreographer. She has been designing a glorious but difficult dance show. After breaking some ankles,she decides to use simulated characters to try some of her moves.You, my loyal geniuses, will provide your assistance. You will build an Inverse Kinematics system toanimate human characters. It should come with a GUI which can load/save BVH files. It should be able toplay an animation clip from the BVH file and allow the user to control the positions of the joints by dragging.For your hard work, Lady Anklesprainer has kindly agreed to give you rewards for: ...

December 1, 2021 · 4 min · jiezi

关于算法:恒源云卷积神经网络的工作原理

文章起源 | 恒源云社区 原文地址 | 卷积神经网络的工作原理 原文作者 | instter 视频链接每当深度学习又有什么重大突破时,这些停顿十有八九都和卷积神经网络(Convolutional Neural Networks,CNN)无关。 CNN 又被称为 CNNs 或 ConvNets,它是目前深度神经网络(deep neural network)畛域的倒退主力,在图片分别上甚至能够做到比人类还精准的水平。 如果要说有任何办法能不负大家对深度学习的冀望,CNN相对是首选。 它们特地棒的中央在于它们很容易了解,至多当你将它们分解成它们的根本局部时。我将疏导您实现它。有一段视频更具体地探讨了这些图像。如果两头有什么不懂的中央,只有点击图片,就能跳到影片中对应的阐明。 X’s and O’s为了阐明 CNN,咱们能够从一个非常简单的例子开始:辨识图片上的符号是圈还叉。 这个例子一方面曾经能很好阐明CNN的运作原理,另一方面也够简略,免得咱们拘泥于不必要的细节。 在这里CNN最重要的工作,就是每当咱们给它一张图,它就会回报下面的符号是圈还是叉。 对它来说后果永远是这两者之一。首先咱们能够想到分别图片最简略的办法,是间接用圈和叉的图片去比对新的图片,看图上的符号比拟像哪个。 但事件没有这么简略,因为电脑在比对这些图片的时候十分刻板。 在电脑看来,这些图片只是一群排成二维矩阵、带有地位编号的像素(就跟棋盘一样)。 在咱们的例子里,红色格子(即笔画)的值为 1,彩色格子(即背景)的值为 -1。 所以在比对图片时,如果有任何一个格子的值不相等,电脑就会认为两张图不一样。 现实上,咱们心愿不论在平移、放大、旋转或变形等状况下,电脑都能正确判断符号。 这时CNN就派上用场了。 特色CNN会比拟两张图片里的各个部分,这些部分被称为特色(feature)。 比起比拟整张图片,在类似的地位上比对大略特色,CNN 能更好地分辨两张图片是否雷同。一张图片里的每个特色都像一张更小的图片,也就是更小的二维矩阵。 这些特色会捕获图片中的共通因素。 以叉叉的图片为例,它最重要的特色包含对角线和两头的穿插。 也就是说,任何叉叉的线条或中心点应该都会合乎这些特色。 卷积每当 CNN 分辨一张新图片时,在不晓得上述特色在哪的状况下,CNN 会比对图片中的任何中央。 为了计算整张图片里有多少相符的特色,咱们在这里发明了一套筛选机制。 这套机制背地的数学原理被称为卷积(convolution),也就是CNN的名称由来。 卷积的基本原理 , 要计算特色和图片部分的相符水平,只有将两者各个像素上的值相乘、再将总和除以像素的数量。 如果两个像素都是红色(值为 1),乘积就是 ;如果都是彩色(值为 -1),乘积就是 。 也就是说像素相符的乘积为 1,像素相异的乘积为 -1。 如果两张图的每个相素都相符,将这些乘积加总、再除以像素数量就会失去 1;反之,如果两者的像素齐全相异,就会失去 -1。1 * 1 = 1(-1) * (-1) = 1咱们只有反复上述过程、演绎出图片中各种可能的特色,就能实现卷积。 而后,咱们能够依据每次卷积的值和地位,制作一个新的二维矩阵。 这也就是利用特色筛选过后的原图,它能够通知咱们在原图的哪些地方能够找到该特色。 值越靠近1的部分和该特色越相符,值越靠近-1则相差越大,至于靠近值靠近0的部分,则简直没有任何类似度可言。下一步是将同样的办法利用在不同特色上,在图片中各个部位的卷积。 最初咱们会失去一组筛选过的原图,每一张图都对应了一个特色。 咱们能够将整段卷积运算,简略想成繁多的解决步骤。这个步骤被称为卷积层,这也代表前面还有更多层。 ...

November 30, 2021 · 1 min · jiezi

关于算法:贪心学院推荐系统算法工程师培养计划TX

download:贪婪学院-举荐零碎算法工程师造就打算<html><head> <meta charset="utf-8"><link rel = "stylesheet" href="mycss.css" type="text/css" /><title>测试内部css</title><script language="javascript"> function changcolor(obj){ var ocssRules = document.styleSheets[0].rules;//这里的0示意援用的第1个css文件,.rules返回所有的规定 var styleobj = ocssRules[0];//这里的0示意第1个规定 for(key in styleobj){ document.writeln(key + "=" + styleobj[key]+"<br>"); } if(obj.value == "红色"){ styleobj.style.backgroundColor="red"; }else{ styleobj.style.backgroundColor="black"; } }</script></head><body> <div id = "div1" class="style">div</div><input type = "button" value="红色" nclick="changcolor(this)"><input type = "button" value="彩色" nclick="changcolor(this)"></body></html> css文件为mycss.css: .style{ width:600px;height:300px;background-color:red;} people{width:300px;}.card{ width:123px;height:444px;}

November 29, 2021 · 1 min · jiezi

关于算法:上岸算法LeetCode-Weekly-Contest-269解题报告

【 NO.1 找出数组排序后的指标下标】 解题思路签到题,循环判断即可。 代码展现 class Solution { public List<Integer> targetIndices(int[] nums, int target) { Arrays.sort(nums); List<Integer> res = new ArrayList<>(); for (int i = 0; i < nums.length; i++) { if (nums[i] == target) { res.add(i); } } return res;}} 【 NO.2 半径为 k 的子数组平均值】 解题思路应用前缀和计算区间和。留神应用 long 类型以防止溢出。 代码展现 class Solution { public int[] getAverages(int[] nums, int k) { if (k == 0) { return nums; } long[] preSum = new long[nums.length]; preSum[0] = nums[0]; for (int i = 1; i < nums.length; i++) { preSum[i] = preSum[i - 1] + nums[i]; } int[] res = new int[nums.length]; Arrays.fill(res, -1); for (int i = k; i + k < nums.length; i++) { long sum = 0; if (i - k == 0) { sum = preSum[i + k]; } else { sum = preSum[i + k] - preSum[i - k - 1]; } res[i] = (int) (sum / (long) (k * 2 + 1)); } return res;}} ...

November 29, 2021 · 3 min · jiezi

关于算法:IN3063INM702-Mathematics

IN3063/INM702: Mathematics and Programming for AICourseworkSubmission deadlines:Report and Code: Sunday 2nd January 2022, 5pmPresentation: Wednesday 19th January 2022, 5pmIntroduction This coursework builds on the material covered in the lecture slides, the classroompresentations, and the tutorial Jupyter notebooks used in the labs. On completing thiscoursework, you should be able to code your analysis in Python, to implement and understandregression methods and classification techniques, as well as to implement advanced neuralnetwork techniques from scratch. You will make use of the different concepts learned in themodule: ...

November 28, 2021 · 11 min · jiezi

关于算法:CSCI570-Analysis-of-Algorithms

CSCI-570 Fall 2021Analysis of AlgorithmsFinal ProjectDue: Dec 8, 2021I. GuidelinesThe project is related to the implementation of the two different solutions provided in chapter 6of the Kleinberg textbook for the Sequence Alignment problem. You can work on this project ingroups of no more than 3 people.II. Project DescriptionImplement the basic Dynamic Programming solution to the Sequence Alignment problem. Runthe test set provided and show your results.A. Algorithm Description:Suppose we are given two strings X and Y, where X consists of the sequence of symbolsx1, x2 . . . xm and Y consists of the sequence of symbols y1, y2 . . . yn. Consider the sets {1,2, . . . , m} and {1, 2, . . . , n} as representing the different positions in the strings X and Y,and consider a matching of these sets; recall that a matching is a set of ordered pairs withthe property that each item occurs in at most one pair. We say that a matching M of thesetwo sets is an alignment if there are no “crossing” pairs: if (i, j), (i’ , j’ ) ∈ M and i < i’ ,then j < j’ . Intuitively, an alignment gives a way of lining up the two strings, by tellingus which pairs of positions will be lined up with one another.Our definition of similarity will be based on finding the optimal alignment between Xand Y, according to the following criteria. Suppose M is a given alignment between Xand Y: ...

November 28, 2021 · 5 min · jiezi

关于算法:32最长有效括号-算法leetode附思维导图-全部解法300题

零 题目:算法(leetode,附思维导图 + 全副解法)300题之(32)最长无效括号一 题目形容 二 解法总览(思维导图) 三 全副解法1 计划11)代码: // 计划1 “滑动窗口法”。// 通过:229 / 231,超时!// 例子:太长,暂不列举。// 思路:// 1)初始化状态。// 2)外围:窗口大小固定为 tempL(范畴:[l, 0] ) ,一直穷举所有的可能状况、而后做解决// tempL:以后窗口大小, left、right 别离为以后窗口的左右边。// 3)返回后果var longestValidParentheses = function(s) { // 判断以后子串 tempS 是否为 无效括号 const isValidParentheses = (tempS = '') => { const l = tempS.length; let stack = []; for (let i = 0; i < l; i++) { if (tempS[i] === '(') { stack.push('('); } else { const tempChar = stack.pop(); if (tempChar !== '(') { return false; } } } return stack.length === 0; }; // 1)初始化状态。 const l = s.length; // 2)外围:窗口大小固定为 tempL(范畴:[l, 0] ) ,一直穷举所有的可能状况、而后做解决 // tempL:以后窗口大小, left、right 别离为以后窗口的左右边。 for (let tempL = l; tempL > 0; tempL--) { // 优化:长度为奇数,必定不是! if (tempL % 2 === 1) { continue; } for (let left = 0; left < (l - tempL + 1); left++) { const right = (left + tempL - 1); // 优化:最左、最右的字符肯定别离是 '('、')' ! if (s[left] !== '(' || s[right] !== ')') { continue; } else { const tempS = s.slice(left, right + 1); if (isValidParentheses(tempS)) { // 3)返回后果 return tempL; } } } } // 3.2)返回后果 return 0;};2 计划21)代码: ...

November 27, 2021 · 2 min · jiezi

关于算法:大厂技术实现-腾讯信息流推荐排序中的并联双塔CTR结构推荐与计算广告系列

作者:韩信子@ShowMeAI,Joan@腾讯地址:http://www.showmeai.tech/arti...申明:版权所有,转载请分割平台与作者并注明出处 双塔模型是举荐、搜寻、广告等多个畛域的算法实现中最罕用和经典的构造,理论各公司利用时,双塔构造中的每个塔会做构造降级,用CTR预估中的新网络结构代替全连贯DNN,本期看到的是腾讯浏览器团队的举荐场景下,奇妙并联CTR模型利用于双塔的计划。一图读懂全文 实现代码文中波及到的DCN / FM / DeepFM / FFM / CIN(xDeepFM) 等CTR预估办法实现,请返回 GitHub 进行查看:https://github.com/ShowMeAI-H... 论文下载 & 数据集下载相干数据请在公众号(AI算法研究所)回复 『举荐与CTR数据集』 ,获取下载链接。 CTR预估中的多任务多指标建模的大厂技术实现,欢送查看同系列相干文章《多指标优化及利用(含代码实现)》 http://www.showmeai.tech/arti...《爱奇艺短视频举荐业务中的多指标优化实际》 http://www.showmeai.tech/arti...一、双塔模型构造1.1 模型构造介绍双塔模型广泛应用于举荐、搜寻、广告等多个畛域的召回和排序阶段,模型构造如下所示: 双塔模型构造中,左侧是User塔,右侧是Item塔,对应的,咱们也能够将特色拆分为两大类: User相干特色 :用户根本信息、群体统计属性以及交互过的Item序列等;Item相干特色 :Item根本信息、属性信息等。如果有上下文特色(Context feature)能够放入用户侧塔。 最后版本的构造中,这两个塔两头都是经典的 DNN 模型(即全连接结构),从特色 Embedding 通过若干层 MLP 隐层,两个塔别离输入 User Embedding 和 Item Embedding 编码。 在训练过程中,User Embedding 和 Item Embedding 做内积或者Cosine类似度计算,使得以后 User和正例 Item 在 Embedding 空间更靠近,和负例 Item 在 Embedding 空间间隔拉远。损失函数则可用规范穿插熵损失(将问题当作一个分类问题),或者采纳 BPR 或者 Hinge Loss(将问题当作一个示意学习问题)。 1.2 双塔模型优缺点 双塔模型 长处 很显著:构造清晰。别离对 User 和 Item 建模学习之后,再交互实现预估训练实现之后,线上 inference 过程高效,性能优良。在线 serving 阶段,Item 向量是事后计算好的,可依据变动特色计算一次 User 向量,再计算内积或者 cosine 即可。双塔模型也存在 毛病 :原始的双塔模型构造,特色受限,无奈应用穿插特色。模型结构限制下,User 和 Item 是离开构建,只能通过最初的内积来交互,不利于 User-Item 交互的学习。1.3 双塔模型的优化 腾讯信息流团队(QQ 浏览器小说举荐场景) 基于以上限度对双塔模型构造进行优化,加强模型构造与成果上,获得了不错的收益,具体做法为: ...

November 25, 2021 · 7 min · jiezi

关于算法:COSC-222-Data-Structures

COSC 222: Data StructuresLab 7 – GraphsQuestion 1 [8 marks]: Question 1 does not require coding. You will need to submit a PDF file with youranswers. This can be handwritten and scanned, drawn on a tablet, or created using a diagramming programand word processor. Name your file Lab7Question1.pdf.A. Prim’s Algorithm [4 marks]: Apply Prim's algorithm on the graph to construct a minimumspanning tree starting with vertex A. If there are any ties, the vertex with the lower letter comes first(for an example, unvisited vertex ‘B’ should come before another unvisited vertex ‘C’). Write thevertices and edges in the order in which they are added to the tree. Also, include the total cost tospan the tree. Show each step (feel free to use graphs.docx file for showing each step).B. Kruskal’s algorithm [4 marks]: Step through Kruskal’s algorithm (covered in lecture 14) tocalculate a minimum spanning tree of the graph. If you can select two edges with the same weight,select the edge that would come alphabetically first (e.g., select (B, C) before (E, F) or (A, B) before(A, F). Also, when representing an edge, arrange two letters in alphabetical order, e.g., use (C, E)instead of (E, C). List the edges in the order in which they are added to the tree. Also, include thetotal cost to span the tree. Show each step (feel free to use graphs.docx file for showing each step).Question 2 (Graph Representation): Adjacency Matrices and Lists [10 marks]While we typically visualize graphs as interconnected webs of nodes, graphs in code are typicallyrepresented in 2 ways: adjacency matrices and adjacency lists. These three formats are shown belowin Figures 1-3.In this question, you will write a program which will create a graph and then print it as both anadjacency matrix and as an adjacency list. You will need the following files: Graph.java andGraphTest.java.First review GraphTest.java. You do not need to change anything in this file. Notice the methodrandomMatrix() in particular. This method generates a random double-array of integers, with thesize given, representing the adjacency matrix of a graph. This random double array is then taken asthe only argument for the Graph constructor. Your task is to complete all of the necessary methodswithin the Graph.java file.Part A [5 marks]:Graph() and generateAdjList(): First write the constructor of the graph. This constructor takesin the adjacency matrix (int[][]) as its only argument. It then initializes the Graph (i.e., initialize thevalues of numVertices and adjMatrix). You should also call generateAdjList() from theconstructor. This method takes no arguments, but uses the data in the newly saved adjMatrix topopulate the adjListArray.Note: Please use Java’s default LinkedList class. Here is a sample code showing how to add fournumber into an array of LinkedList. If you prefer to use a list instead of an array, feel free to makecorresponding changes in the code.import java.util.LinkedList;... ... ...int n = 2; //Array size 2LinkedList<Integer>[] arrayLinkedList = new LinkedList[n]; //Initialize arrayarrayLinkedList[0] = new LinkedList<Integer>(); //Initialize array elementsarrayLinkedList[1] = new LinkedList<Integer>(); //(objects of LinkedList)arrayLinkedList[0].add(101); //Add 101 and 102 to arrayLinkedList[0]arrayLinkedList[0].add(102);arrayLinkedList[1].add(201); //Add 201 and 202 to arrayLinkedList[1]arrayLinkedList[1].add(202);for (int i = 0; i < n; i++) { //Showing the elements with get() method, you can also for (int j = 0; j < arrayLinkedList[i].size(); j++) { //use for-each loop System.out.print(arrayLinkedList[i].get(j) + " "); } System.out.println();}Output:101 102201 202Part B [2 marks]:printMatrix(): This method takes no arguments, but prints the adjacency matrix (adjMatrix) inthe format shown below. Note that since the graphs are randomly generated, the values will not beidentical to the output shown.Part C [3 marks]:printList(): This method takes no arguments, and prints the adjacency list (adjListArray) inthe format shown below. Note that since the graphs are randomly generated, the values will not beidentical to the output shown.Practicing drawing the graphs generated by randomMatrix() may be a good exercise for yourexam. Try drawing the graphs first by looking at either the matrix or the adjacency list and thenchecking from the other.Sample Output:Graph 1:Adjacency matrix (4 nodes): 0 1 1 1 0 0 0 1 0 0 0 1 1 0 1 0Adjacency list of vertex 0: 1, 2, 3Adjacency list of vertex 1: 3Adjacency list of vertex 2: 3Adjacency list of vertex 3: 0, 2Graph 2:Adjacency matrix (7 nodes): 0 0 1 0 0 0 1 0 0 1 1 1 1 1 0 1 0 0 0 1 0 1 0 1 0 0 1 1 0 1 1 1 0 1 1 0 0 1 1 1 0 0 0 0 0 0 1 0 0Adjacency list of vertex 0: 2, 6Adjacency list of vertex 1: 2, 3, 4, 5, 6Adjacency list of vertex 2: 1, 5Adjacency list of vertex 3: 0, 2, 5, 6Adjacency list of vertex 4: 1, 2, 3, 5, 6Adjacency list of vertex 5: 2, 3, 4Adjacency list of vertex 6: 4Question 3 (DFS): Count Starting Nodes [2 + 3 (bonus) marks]This question asks that you write a program which will take an undirected graph and visit all thevertices using a Depth-First Search (DFS). However, with some graphs it is not possible to reachevery vertex from one starting vertex (i.e. a disconnected graph). Therefore, you may need to selectmore than one starting vertex to complete the graph traversal.Begin with the files DFSGraph.java and DFSTest.java. In DFSTest.java, one of several uniquegraphs is generated. Then two methods from the DFSGraph.java class are called, which you willneed to complete.Part A [2 mark]:printList(): This method prints out the graph in an adjacency-list format. You may adapt yourprintList() method from Question 2.Part B [3 marks (BONUS)]:countStartingNodes(): This method finds the number of vertices that need to be selected asstarting vertices to traverse the entire graph. Check Lecture 12 slide 24. For the left graph, we canselect one vertex and traverse the entire graph. However, for the right graph, you need to selectminimum two vertices to traverse the entire graph. Note that you must select vertices in ascendingorder (i.e. you must try starting from vertex 1 before trying vertex 2). Hint: you may want to use aboolean flag to keep track of which vertices have already been visited.Within this method, you should call DFS(). This method traverses the graph from the given startingvertex, maintaining a record of which nodes have been visited. Recursion should be used with thismethod. Note that you may wish to change the return type.When the traversal has been completed, countStartingNodes() should print the number ofstarting vertices selected and a list of the selected vertices.If you complete these methods correctly, you should see the following output when testing yourprogram with the provided graph0 matrix.Sample Output:Adjacency list of vertex 0: 1Adjacency list of vertex 1: 0, 2Adjacency list of vertex 2: 1Adjacency list of vertex 3: No vertex foundYou can traverse the entire graph by selecting 2 verticesStarting vertices are: 0 3Submission Instructions:● Create a folder called “Lab7_<student_ID >” where <student_ID > is your studentnumber/ID (e.g. Lab7_12345678). Only include the mentioned java files in the folder. DONOT include any other files (e.g., .class, .java~ or any other files)o For Question 1, include a pdf file your Lab7Question1.pdf file.o For Question 2, include your Graph.java file.o For Question 3, include your DFSGraph.java file.● Make a zip file of the folder and upload it to Canvas.● To be eligible to earn full marks, your Java programs must compile and run upondownload, without requiring any modifications.● These assignments are your chance to learn the material for the exams. Code yourassignments independently. ...

November 25, 2021 · 6 min · jiezi

关于算法:大厂技术实现-爱奇艺短视频推荐业务中的多目标优化实践-推荐与计算广告系列

作者:韩信子@ShowMeAI,August@爱奇艺地址:http://www.showmeai.tech/arti...申明:版权所有,转载请分割平台与作者并注明出处 短视频是以后互联网最热门的业务之一,汇集了微小的互联网用户流量,也是各大公司争相倒退的业务畛域。作为次要营收业务方向,短视频方向的举荐算法也突飞猛进并驱动业务增长,本期咱们看到的是爱奇艺的短视频频道下,举荐多任务算法利用实际门路与落地计划。一图读懂全文 获取『多指标模型办法实现代码』,请返回GitHub我的项目 https://github.com/ShowMeAI-H...。文章波及到的局部论文以及『微信数据集』,请在公众号(AI算法研究所)后盾回复关键字 『爱奇艺多任务』 获取。对『多指标学习』利用感兴趣的小伙伴,也欢送关注咱们公众号(AI算法研究所),查看更多大厂落地计划哦! 《多指标优化及利用(含代码实现)》http://www.showmeai.tech/arti...《信息流举荐排序中的并联双塔CTR构造》 http://www.showmeai.tech/arti...咱们来看看,头部互联网公司的短视频业务在进行多任务优化时,是如何落地的,这里看到的是来自爱奇艺的短视频举荐业务。 一、短视频举荐业务1.1 业务介绍在爱奇艺短视频举荐业务中,次要流量状态由两个局部组成:爱奇艺App 底Tab的随刻视频以及顶导航的热点模块,爱奇艺随刻App 首页短视频流举荐页面。 1.2 用户反馈信息 爱奇艺App中,用户在Feed流页面的行为有2类: 显示反馈:点击播放,点击up主头像、关注、点击/公布评论、珍藏、点击圈子、分享等正向互动行为,点击不喜爱、举报等负向行为。隐式反馈:播放时长、完成率、用户疾速划过等行为。1.3 业务优化指标 起初以点击+时长为排序指标,后业务倒退须要兼顾用户评论、点赞等强互动行为的生态收益,缩小用户短停等负向内容的举荐。 1.4 多指标优化后果爱奇艺在举荐零碎多指标建模方向进行的尝试和实际迭代, 达到了人均播放时长晋升7%+、互动晋升20%+的短视频举荐业务正向收益。 二、[实现形式1] CTR预估模型融入权重2.1 YouTube的权重策略2.1.1 计划介绍 解决形式:YouTube的权重策略是视频举荐CTR预估中很常见的一种解决形式,具体做法是将正样本的播放时长作为样本权重,在训练分类器时进行加权解决。 2.1.2 形式毛病这种解决办法会使得模型给予长视频高权重优先举荐长视频。但联合业务,不论利用该办法时用哪个业务指标(播放时长、完播率)作为样本权重,都会导致模型对视频长度的倾向性,而这并不是咱们想要的。 2.2 交融时长权重爱奇艺提出交融时长权重的建模形式,线上收益状况为人均播放时长晋升3%,UCTR晋升0.2%,具体做法如下: 2.2.1 权重计算首先,在业务场景下提出了一个假如:『推出视频品质与视频长度无关,且在视频时长的各区间下应近似均匀分布』。即在任何区间下,样本权重的均值大略雷同。即有: $$\frac{1}{\operatorname{count}\left(D_{i}\right)} * \sum_{d \in D_{i}} w(\text { playtime, } \text { duration })=C$$ 对视频时长(duration)和播放时长(playtime)进行等频分桶,如下图所示: 具体做法为: 对一段时间窗内的播放样本依照duration(视频时长)排序扩散到100个桶,确保同一桶中视频观看数雷同。对每个duration桶依照playtime(播放时长)排序再次等频扩散到100个桶,并将权重归一化到[0,99] 的区间整数。做完该解决之后,对任何给定的样本,能够按照(duration, playtime)确定分桶坐标进而确定权值。2.2.2 播放时长加权接下来会对playtime较高的样本权重进行整体晋升,心愿优化播放时长的指标,同时管制模型对长视频的偏向。这里具体的boosting办法如下公式所示: $$boost\_sigmoid\left ( playtime \right ) =\frac{Am}{1+e^-\frac{playtime+offset}{slope} }+shift $$ \( Am \) 是『上界值』\( shift \) 是『下界值』\( offset \) 是『时长偏移量』\( slope \) 是『斜率』能够看到随着 playtime 的减少,最初的 boost_sigmoid 也会减少,而 offset、slope 和 shift 能够调整加权水平。 ...

November 24, 2021 · 2 min · jiezi

关于算法:CS258-Unsupervised

CS258 Unsupervised PracticalAssignment: (2021/2022)GigSystem SpecificationA music promotion company is planning to book acts for an upcoming festival. You will help themdesign a system to store information about which acts have played in a particular venue.The system must consist of the following tables with the following attributes: Acts (such as a band, solo musician, comedian, etc.) have a name, a number of members in the bandand a standard fee that they would usually charge for being part of a gig.Gigs take place in a venue, have a gigtitle, take place on a particular gigdate (including start time),and have a gigstatus of either ‘Cancelled’ or ‘GoingAhead’.Acts are associated with a particular gig via the act_gig table. Each act charges an actfee (notnecessarily their standardfee) for a gig. They have a particular time when they start (which must beafter the start of the gig), and their performance lasts for a particular duration (a number ofminutes). No gigs should go beyond 11:59pm.Venues have a name, a hirecost (amount in £ that it costs to hire the venue for a day) and a capacity(maximum number of customers allowed at once, therefore maximum number of tickets to be sold).Customers buy tickets. The standard cost of a ticket is stored in gig_ticket. There may be differenttypes of ticket, each with a different cost. The system will mostly deal with ticket type ‘A’ (for‘Adult’), but there may be concessionary tickets added to (e.g. ‘C’ for Children, ‘O’ for ‘OAP’ or ‘F’ forcomplementary tickets) – these are just examples, and you should not add any extra constraints. Acustomer’s purchased ticket is stored in the ticket table with their CustomerName andCustomerEmail address. You can assume that a customer is identifiable by their email address (notwo customers share an email address), and that the customer always uses the same name andemail address when booking tickets.Part 1: Schema [20%]Based on the above specification (with the same table names and column names), write aschema.sql file to create the necessary tables.Use SQL to specify any key and referential integrity constraints you might need to capture thedescription given in the introduction as accurately as possible. Also specify any additional constraintsthat you believe should apply to the system.Any other schema related objects (e.g., Views/Procedures/Functions/Triggers/Sequences) that youuse as part of the system should also be defined in schema.sql.Part 2: Design Choices [5%]The tables as described in the introduction should not be changed for the purposes of thiscoursework. If you were to make any modifications, what changes might you make to improve thetable structure? Write your answer in a section headed Design Choices in README.mdPart 3: Application [75%]Write (and test) a Java program that implements the options specified below. In the source code wehave provided, you will find GigSystem.java and GigTester.java.GigSystem.java contains a template of your main Java program. You must implement each of theoptions to carry out the described behaviour. You may also add a menu in the main method (similarto that used in the labs), but the marking will only assess the content of the options’ methods. If youimplement a menu, you will be able to test your system interactively (allowing the user to typeinput, and sending it to your JDBC queries). If you do make an interactive menu you can use thereadEntry method to gather user input, however, you must not read user input within the optionmethods (otherwise automated tests will hang when calling these methods).GigTester.java will give you an idea of how your GigSystem.java methods will be called. There is atestOption method for each of the options, but not all are fully implemented. The sample dataprovided is not an exhaustive set of tests. It is there to help you understand the basic requirementsof the query. In each case, there may be other situations that can occur that are not demonstratedby the sample data. You are expected to experiment with other data to ensure that your query cancope with all eventualities. More information about testing is given below.You will be expected to submit three files:? schema.sql – containing all the SQL definitions needed to recreate your database? README.md – containing information about your solution and answers to the ‘DesignChoices’ part. This can contain plain text, or you can use markdown1 formatting.? GigSystem.java – your completed java fileDocument your solutionsAny decisions that you make should be justified in your README.md file. It is expected that yourprogram should be able to appropriately handle any error cases that might occur (such as invalidinputs or failures that arise from violating database constraints). Any java methods you make shouldbe commented as clearly as possible (preferably JavaDoc2 style). For each option, you should writearound 100-200 words explaining what your solution does (describing the behaviour of your SQLstatements/queries).Option 1: Gig Line-UpThe Java program needs to be able to find the line-up for any given gigID. There should be theactname, the time they will start and the time they will finish. The option1 method should returnthis information in the two-dimensional array of strings. If you’d like to see the output, you can usethe printTable method.The output should look like this (headings must not be in your array of strings, these are given toillustrate the expected order of the columns): ...

November 23, 2021 · 12 min · jiezi

关于算法:Python集成学习自己编写构建AdaBoost分类模型可视化决策边界及sklearn包调用比较

原文链接:http://tecdat.cn/?p=24421 AdaBoost是?Boosting指的是机器学习元算法系列,它将许多 "弱 "分类器的输入合并成一个弱小的 "汇合",其中每个弱分类器独自的错误率可能只比随机猜想好一点。 AdaBoost这个名字代表了自适应晋升,它指的是一种非凡的晋升算法,在这种算法中,咱们适宜一连串的 "树桩"(有一个节点和两个叶子的决策树),并依据它们预测的精确水平对它们的最终投票进行加权。在每个迭代之后,咱们对数据集进行从新加权,对那些被前一个弱学习者谬误分类的数据点给予更大的器重,这样,这些数据点在迭代t+1期间就会失去 "特地关注"。   它与随机森林相比如何?特点 随机森林 AdaBoost 深度 有限(一棵残缺的树) 树桩(带有 2 个叶子的单个节点) 树木成长 独立 顺次 投票 雷同 加权 AdaBoost 算法A) 对立初始化样本权重为 . B) 对于每次迭代 t: 找到ht(x) 最小化的弱学习 器 .咱们依据其准确性为弱学习器设置权重: 减少谬误分类察看的权重: .从新归一化权重,使得 .C)将最终预测作为弱学习器预测的加权多数票: . 绘图咱们将应用上面的函数来可视化咱们的数据点,并可抉择笼罩拟合 AdaBoost 模型的决策边界。 def plot(X: np.ndaay,                  y: np.ndrry,                  cf=None) -> None:    """ 绘制2D的±个样本,可抉择决策边界 """    if not ax:        fig, ax = plt.sults(fgsze=(5, 5), di=100)    pad = 1    x\_min, x\_max = X\[:, 0\].min() - pad, X\[:, 0\].max() + pad    y\_min, y\_max = X\[:, 1\].min() - pad, X\[:, 1\].max() + pad    if saligs is not None:        sies = np.array(spl_wigts) * X.hae\[0\] * 100    else:        sze = np.oes(sape=X.shpe\[0\]) * 100    if cf:        xx, yy = np.ehrid(n.aange(x\_min, x\_max, plot_step),                             p.aang(y\_min, y\_max, plot_step))       pdt(np.c_\[xx.ravel(), yy.ravel()\])                      # 如果所有的预测都是正类,则相应地调整色彩图。        if list(np.niue(Z)) == \[1\]:            colors = \['r'\]        else:            colors = \['b', 'r'\]      ax.st\_im(in+0.5, \_ax-0.5)    ax.st_lm(ymin+0.5, yax-0.5)数据集咱们将应用相似的办法生成一个数据集  ,但应用较少的数据点。这里的要害是咱们想要两个不可线性拆散的类,因为这是 AdaBoost 的现实用例。 def maketat(n: it = 100, rased: it = None):    """ 生成一个用于评估AdaBoost分类器的数据集 """        nclas = int(n/2)        if ranmed:        np.ram.sed(rndoed)    X, y = me\_gainqnes(n=n, n\_fees=2, n_css=2)    plot(X, y) 应用 scikit-learn 进行基准测试让咱们通过从scikit-learn导入AdaBoostClassifier,并将其拟合到咱们的数据集上,来建设一个基准,看看咱们的模型的输入应该是什么样子的。 from skarn.esele import AdosClaserbnh = Adostlier(netrs=10, atm='SAMME').fit(X, y)plat(X, y, bech)tnr = (prdict(X) != y).man() 分类器在 10 次迭代中齐全拟合训练数据集,咱们数据集中的数据点被正当拆散。 编写本人的AdaBoost分类器上面是咱们的AdaBoost分类器的框架代码。拟合模型后,咱们将把所有的要害属性保留到类中--包含每次迭代的样本权重--这样咱们就能够在当前查看它们,以理解咱们的算法在每一步的作用。 下表显示了咱们将应用的变量名称和后面在算法形容中应用的数学符号之间的映射。 变量 数学 sampleweight wi(t) stump ht(x) stumpweight t error t predict(X) Ht(x) class AdBst:    """ AdaBoost分类器  """    def \_\_init\_\_(self):        self.sump = None        self.stup_weght = None        self.erro = None        self.smle_weih = None    def \_ceck\_X_y(self, X, y):        """ 验证对于输出数据格式的假如"""        assrt st(y) == {-1, 1}        reurn X, y拟合模型回忆一下咱们的算法来拟合模型: 找到ht(x) 最小化的弱学习 器 .咱们依据其准确性为弱学习器设置权重: 减少谬误分类察看的权重: . 留神 当假如与标签统一时将评估为 +1,当它与标签不统一时将评估为 -1。从新归一化权重,使得 .上面的代码实质上是下面的一对一的实现,然而有几点须要留神: 因为这里的重点是了解AdaBoost的汇合元素,咱们将调用DecinTeassfir(mxdpth=1, mlefnes=2)实现筛选每个ht(x)的逻辑。咱们在 for 循环之外设置初始对立样本权重,并在每次迭代 t 内设置 t+1 的权重,除非它是最初一次迭代。咱们在这里特意在拟合模型上保留一组样本权重,以便咱们当前能够在每次迭代时可视化样本权重。def ft(slf, X: narry, y: ndray, ites: int):    """ 应用训练数据拟合模型 """    X, y = slf.\_chck\_X_y(X, y)    n = X.shpe\[0\]    # 启动Numpy数组    self.smle_wegts = np.zos(shpe=(itrs, n))    self.tumps = np.zeos(she=iters, dtpe=obect)    # 平均地初始化权重    sef.sampewegts\[0\] = np.one(shpe=n) / n    for t in range(iters):        # 拟合弱学习器        fit(X, y, smpe\_eght=urrsmle\_igts)        # 从弱学习者的预测中计算出误差和树桩权重        predict(X)        err = cu_seghts\[(pred != y)\].sum()# / n        weiht = np.log((1 - err) / err) / 2        # 更新样本权重        newweis = (            crrawe * np.exp(-sum_wiht * y * tupd)        )                # 如果不是最终迭代,则更新t+1的样本权重        if t+1 < ies:            sef.smpe\_wit\[t+1\] = ne\_saml_wigt        # 保留迭代的后果        sef.sups\[t\] = tump做出预测咱们通过采取“加权少数投票”来做出最终预测,计算为每个树桩的预测及其相应树桩权重的线性组合的符号 (±)。 ...

November 23, 2021 · 1 min · jiezi

关于算法:CS260-Algorithms

CS260: AlgorithmsClass Test sample solutionsDecember 2020 (a) True; (b) True; (c) False; (d) False; (e) True; (f) False; (g) True; (h) True. br>2. (a) cS(1) = 5cS(2) = 5 + 3 + 2 = 10cS(3) = 5 + 3 = 8(b) `S(1) = 3 · 5 = 15`S(2) = 1 · 10 = 10`S(3) = 2 · 8 = 16LS = 15 + 10 + 16 = 41(c) We have:LS ? LS′ = (S(1) + S(2))? (S′(1) + S′(2))= (u[1]t[1] + u2)? (u[2]t[2] + u1)= u[2]t[1]? u[1]t[2],and hence schedule S = (1, 2) has smaller total urgency-weighted lateness than sched-ule S′ = (2, 1) if and only if u[2]t[1]? u[1]t[2] < 0, which is equivalent to:u[1]t[1] ...

November 23, 2021 · 5 min · jiezi

关于算法:BTH004

BTH004 - Laboratory assignment 1In this laboratory assignment you should design and implement algorithmsfor the multiple knapsack problem. The assignment contains two parts; one ismandatory and one is optional.In part 1 (the mandatory part) you should design and implement two algorithmsfor the multiple knapsack problem: A (contructive) greedy algorithm.An improving search (neighborhood search) algorithm.Part 2 (the optional part) concerns implementing a tabu-search algorithm(a meta-heuristic) for the considered problem.The assignment should be conducted individually, and it will be examinedthrough a written report (one per student). The report should fulfill the requirementsspecified below. The deadline for submitting the report is announced by Zhenbo Cheng.Note that you are allowed to use any high-level programming language youfind suitable, e.g., java, c, c++, and python.It is highly recommended that you start working with the assignment as soonas possible. It is of particular importance that you start before the scheduledsupervision time, so that you can make as much use as possible of the teachersupport.The knapsack problemThe (standard) knapsack problem, which was introduced earlier in the course,can be described in the following way. Assume that you have a set of items, eachwith a (positive) weight and a (positive) value, and a knapsack (or bag) with alimited weight capacity. The problem is to choose (to include in the knapsack)items so that the weight capacity of the knapsack is not violated and the valueof the chosen items are as high as possible.Mathematically, the problem can be formulated in the following way. We letI = {1, . . . , n} be an index set over the n items, where item i ∈ I have a valuepi > 0 and a weight wi > 0, and we let W > 0 denote the weight capacity of theknapsack. For item i ∈ I, the binary decision variable xiis used to determinewhether to include item i in the knapsack: xi = 1 if the item is chosen, andxi = 0 if it is not chosen.The objective function of the problem is to maximize the utility of the chosenitems, i.e.,MaximizeXi∈Ipixi.1All valid solutions to the problem should fulfill the weight constraintXi∈Iwixi ≤ W,and the values of the decision variables are restricted by the constraint setxi ∈ {0, 1} ∀i ∈ I.The multiple knapsack problemThe multiple knapsack problem is an extension to the standard knapsack problemin that it considers choosing items to include in m knapsacks (the standardknapsack problem considers only one knapsack).Mathematically, the multiple knapsack problem can be formulated as follows.We let I = {1, . . . , n} be an index set over the n items, where item i ∈ I havea value pi > 0 and a weight wi > 0. In addition, we let J = {1, . . . , m} be anindex set over the m knapsacks, where Wj > 0 denotes the weight capacity ofknapsack j ∈ J. For item i ∈ I and knapsack j ∈ J, we let the binary decisionvariable xij determine whether to include item i in knapsack j: xij = 1 if itemi is included in knapsack j, otherwise xij = 0.The objective function of the problem is to maximize the utility of the chosenitems, i.e.,MaximizeXi∈IXj∈Jpixij .For each of the knapsacks, the solution space is restricted by a weight capacityconstraint, which states that the total weight of the selected items for thatknapsack is not allowed to exceed the weight capacity of the knapsack. Thisis modeled by the following constraint set (one constraint for each of the mknapsacks):Xi∈Iwixij ≤ Wj , j ∈ J.In addition, it needs to be explicitly modeled that an item is not allowed to beincluded in more than one of the knapsacks. This is modeled by the followingconstraint set (one constraint for each of the n items):Xj∈Jxij ≤ 1, i ∈ I.Finally, the values of the decision variables are restricted by the constraint setxij ∈ {0, 1}, i ∈ I, j ∈ J.Part 1 - Greedy and neighborhood search algorithmsIn the first part (the mandatory part), you should design and implement 1)a greedy algorithm and 2) a neighborhood search algorithm for the multipleknapsack problem.2Greedy algorithmAs discussed earlier in the course, a greedy algorithm is an algorithm that startswith an empty solution, and iteratively adds solution components to partialsolution until a complete solution is found.For knapsack problems, it is possible to construct greedy algorithms that arebased on the relative benefit per weight unit for the considered items. We letbi =piwidenote the relative benefit per weight unit for item i ∈ I. By comparingbi′ =pi′wi′and bi′′ =pi′′wi′′for two items i′, i′′ ∈ I, it is possible to make a greedydecision on which item to include. If bi′ > bi′′ (i.e., bi′ gives higher value perweight unit than bi′′ ) it seems better to choose bi′ than bi′′ for some of the mknapsacks. On the other hand, if bi′ < bi′′ it seems better to include bi′′ thanbi′ in some of the m knapsacks. If bi′ = bi′′ , it does not matter which one tochoose, since bi′ and bi′′ in this case gives the same value per weight unit.A greedy algorithm for the multiple knapsack problem could be designed byiteratively adding to some knapsack the item with highest relative benefit (i.e.,i′ = arg maxi∈I(bi), such that i′ has not already been included in an earlieriteration).Please note that there are algorithm details not discussed above, which youneed to define yourself1. For example, termination criteria and choice of knapsackin case there is sufficient amount of capacity in more than one of theknapsacks, has not been discussed above. In addition, you need to considerwhat you should do if there is no capacity for the item with highest relativevalue, but there are other items with smaller weight that can be added.Improving search (neighborhood search) algorithmImproving search heuristics are algorithms that iteratively improve a feasiblesolution by doing small modifications of the most recent solution.For a solution x, we define a neighborhood N(x) as all solutions “closeenough” to x (according to some criteria). If y ∈ N(x), then y is a neighbor ofx.Neighborhood search algorithms are improving search algorithms where acurrent solution is iteratively updated by choosing the “best” solution in theneighborhood of the current solution. An algorithm description (for a maximizationproblem) is provided below.Step 0: Find a feasible (starting) solution x(0) with value (cost) c(x(0)) and setsolution index t = 0.Step 1: Determine (all points in) neighborhood N(x(t)).Step 2: If c(x(t)) ≥ c(x) ∀ x ∈ N(x(t)), then break with local optimal solutionx(t).Step 3: Choose x(t+1) ∈ N(x(t)) such that c(x(t+1)) ≥ c(xt)Set t = t + 1 and goto step 1.As starting solution to the neighborhood search algorithm, you could, forexample, use the solution obtained by your greedy algorithm.1It is typically a good idea to test different approaches to see which performs best3A challenge is how to determine an appropriate neighborhood for the multipleknapsack problem. If the neighborhood is too large, it will be impossible toiterate over all solutions in the neighborhood, if it is too small, there is a highrisk that the algorithm will get stuck in a local optima that is not so good.A possible way to define a neighborhood is to rotate items. As long as youhave at least one item that is not included in any knapsack, you could define theneighborhood of a solution as all other feasible solutions that can be obtainedby:• Moving some item (i′) from one knapsack (m′) to another knapsack (m′′).• Moving some other item (i′′) away from knapsack (m′′) (in order to makeroom for item i′). In the obtained solution, i′′ is not included in any ofthe knapsacks.• Moving some other item (i′′′), which is not included in any knapsack inthe current solution, into knapsack m′.If bi′′′ > bi′′ a better solution has been found.When using this type of neighborhood, it is important to consider that itmight be possible to, via rotations, make room for an additional item in someof the knapsacks after some item has been replaced by some other item. Thisneeds to be explicitly included in the neighborhood definition.You are encouraged to identify some other neighborhood that you find appropriatefor the considered problem. For example, you might find it interestingto consider rotation involving more than 3 items; however you need to considerthat this increases the search space significantly.Part 2 - Tabu-searchA problem with the neighborhood search heuristics is that they eventually willget stuck in a locally optimal solution. A locally optimal solution is a solutionthat cannot be improved by moving to any of the solutions that are sufficientlyclose in the search space (i.e., in the neighborhood), but there are solutionsfarther away that are better.The ideas of tabu-search methods, which are based on neighborhood search,are:• It is possible to move to a solution with worse objective if there is noimproving solution in the neighborhood (note that it is necessary to keeptrack of the so far best found solution).• The k most recent solutions are tabu, i.e., they cannot be visited (otherwisethe algorithm might immediately go back to the locally optimalsolution).Tabu search algorithms (for maximization problems) can be described in ageneral way using the following algorithm description.Step 0: Find a feasible (starting) solution x(0) with value (cost) c(x(0)) and setsolution index t = 0.4Step 1: Determine breaking criteria. For instance, break if maximum numberof iterations has been reached, or no non-tabu solutions exists.Step 2: Determine neighborhood N(x(t)).Step 3: Choose x(t+1) ∈ N(x(t)) which is not in the tabu-list, and which maximizesc(x).Step 4: Update tabu-list (remove the oldest solution in the tabu-list and addthe most recent solution, i.e., x(t)), set t = t + 1 and go to step 1.In part 2 (the optional part) you are encouraged to extend your neighborhoodsearch algorithm into a tabu-search algorithm.Requirements on report

November 23, 2021 · 8 min · jiezi

关于算法:算法-深入理解-Fibonacci-数列计算及黄金分割

在自然界中,有一串数字咱们时常能看到,它的前几项序列是: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233... 如果用数学语言形容,它的递归模式是这样的: $$\begin{cases}F_0 = 0 \\F_1 = 1 \\F_n = F_{n-1}+F_{n-2} &(n\geq2)\end{cases}$$ 也就是说,除了 第0项 和 第1项,之后的数字是由这个数紧邻的前两个数字,相加失去的。 如果用几何图形示意,你可能见过这张图: 这就是斐波那契数,它造成的数列就被称为斐波那契数列。 名称源自1170年出世的意大利比萨数学家列奥纳多·斐波那契:Leonardo Fibonacci。 (歪个楼:列奥纳多·迪·塞尔·皮耶罗·达·芬奇,出生于1452年) 求解和利用斐波那契数及数列,是古代计算机科学与传统古典艺术、古代新媒体艺术设计的热门交叉点,包含但不限于图形学、性能优化、先锋艺术、影视创作等等分支畛域。 其中最为驰名的,就是黄金螺旋分割线。所以此篇追根溯源,深刻到算法和数学的最底层面,了解斐波那契数列的计算形式。 ① Fibonacci_1(n):定义式二分递归计算根据上述定义式,fib() 函数的伪代码形容为(默认 n 为非正数): $$fib(n)=\begin{cases}n & (if &n\leq1)\\fib(n-1)+fib(n-2) & (if &n\geq2)\end{cases}$$ // C++int fib1(int n){ return (2 > n) ? n : fib1(n - 1) + fib1(n - 2);}显然,这种算法浅显易懂,间接依据定义式编码即可。 但弊病也很不言而喻,二分递归的模式,其计算效率十分低下。 ...

November 22, 2021 · 3 min · jiezi

关于算法:CSE-102图论

Introduction to Analysis of AlgorithmsGraph Theory GraphsA graph G consists of an ordered pair of sets = (, ) where ≠ ?, and ? (2) = {2-subsets of }.In other words E consists of unordered pairs of elements of V. We call = () the vertex set, and =() the edge set of G. In this handout, we consider only graphs in which both the vertex set and edge setare finite. An edge {, }, typically denoted xy or yx, is said to join its two end vertices x and y, and theseends are said to be incident with the edge xy. Two vertices are called adjacent if they are joined by an edge,and two edges are said to be adjacent if they have a common end vertex. A graph will usually be depictedas a collection of points in the plane (vertices), together with line segments (edges) joining the points.Two graphs 1 and 2 are said to me isomorphic if there exists a bijection : (1) → (2) such that forany , ∈ (1), the pair xy is an edge of 1 if and only if the pair ()() is an edge of 2. In otherwords, the function must preserve all incidence relations amongst the vertices and edges in 1 . We write1 ? 2 to mean that 1 and 2 are isomorphic. ...

November 22, 2021 · 19 min · jiezi

关于算法:恒源云教你如何团队合作搞算力

文章起源 | 恒源云社区(专一人工智能/深度学习云 GPU 服务器训练平台,十一月宠粉流动 ing,官网体验网址:https://gpushare.com/ ) 原文地址 | https://gpushare.com/docs/ins... 通过多期的分享,置信很多小伙伴曾经对咱们平台的性能都有肯定的理解了。 那,多人共享实例、镜像,数据……这些性能你想要吗? 明天,就让小编给大家分享团队如何更好的在咱们平台进行疾速无效的算法训练吧~ 首先,何为团队?多个用户能够组建一个团队,一个团队内的用户能够互相共享实例与镜像。创立团队首先须要一名团队长申请资质,通过资质审核后通过分享团队链接,邀请其余用户来退出团队。 其次,如何创立团队?part1:申请资质申请团队长须要累计充值达到 500 元且绑定微信。符合条件后在 控制台 中抉择 团队 - 我的团队,点击 申请成为团队长。 抉择申请信息,确定后提交期待平台审核。 part2:治理团队通过团队长资质审核后,在 控制台 中抉择 团队 - 我的团队 中能够治理团队。点击 创立新团队。 输出团队名称点击确定。 点击团队中的 查看队员 来治理该团队成员。 复制 成员邀请链接 发给想要增加到该团队的用户。 该用户关上该链接能够依据要求抉择退出或回绝。 最初,如何共享资源?在 控制台 中抉择 团队 - 共享资源。在这里能够把实例或者镜像分享给整个团队的成员。抉择好团队与共享实例/镜像,点击 增加共享实例/镜像。 抉择要共享的实例/镜像,点击确定。团队内成员就能够看到共享的资源。 以上,就是今日分享的全部内容啦,新的一周,预祝大家的算法训练顺的飞起~

November 22, 2021 · 1 min · jiezi

关于算法:看动画学算法之hashtable

简介java中和hash相干并且罕用的有两个类hashTable和hashMap,两个类的底层存储都是数组,这个数组不是一般的数组,而是被称为散列表的货色。 散列表是一种将键映射到值的数据结构。它用哈希函数来将键映射到小范畴的指数(个别为[0..哈希表大小-1])。同时须要提供抵触和对抵触的解决方案。 明天咱们来学习一下散列表的个性和作用。 文末有代码地址,欢送下载。 散列表的要害概念散列表中比拟要害的三个概念就是散列表,hash函数,和抵触解决。 散列是一种算法(通过散列函数),将大型可变长度数据集映射为固定长度的较小整数数据集。 散列表是一种数据结构,它应用哈希函数无效地将键映射到值,以便进行高效的搜寻/检索,插入和/或删除。 散列表广泛应用于多种计算机软件中,特地是关联数组,数据库索引,缓存和汇合。 散列表必须至多反对以下三种操作,并且尽可能高效: 搜寻(v) - 确定v是否存在于散列表中,插入(v) - 将v插入散列表,删除(v) - 从散列表中删除v。 因为应用了散列算法,将长数据集映射成了短数据集,所以在插入的时候就可能产生抵触,依据抵触的解决办法的不同又能够分为线性探测,二次探测,双倍散列和拆散链接等抵触解决办法。 数组和散列表思考这样一个问题:找到给定的字符串中第一次反复呈现的的字符。 怎么解决这个问题呢?最简略的方法就是进行n次遍历,第一次遍历找出字符串中是否有和第一个字符相等的字符,第二次遍历找出字符串中是否有和第二个字符相等的字符,以此类推。 因为进行了n*n的遍历,所以工夫复杂度是O(n²)。 有没有简略点的方法呢? 考虑一下字符串中的字符汇合其实是无限的,如果都是应用的ASCII字符,那么咱们能够构建一个256长度的数组一次遍历即可。 具体的做法就是遍历一个字符就将绝对于的数组中的相应index中的值+1,当咱们发现某个index的值曾经是1的时候,就晓得这个字符反复了。 数组的问题那么数组的实现有什么问题呢? 数组的问题所在: 键的范畴必须很小。 如果咱们有(十分)大范畴的话,内存使用量会(十分的)很大。键必须密集,即键值中没有太多空白。 否则数组中将蕴含太多的空单元。 咱们能够应用散列函数来解决这个问题。 通过应用散列函数,咱们能够: 将一些非整数键映射成整数键,将大整数映射成较小的整数。 通过应用散列函数,咱们能够无效的缩小存储数组的大小。 hash的问题无利就有弊,尽管应用散列函数能够将大数据集映射成为小数据集,然而散列函数可能且很可能将不同的键映射到同一个整数槽中,即多对一映射而不是一对一映射。 尤其是在散列表的密度十分高的状况下,这种抵触会常常产生。 这里介绍一个概念:影响哈希表的密度或负载因子= N / M,其中N是键的数量,M是哈希表的大小。其实这个抵触的概率要比咱们设想的更大,举一个生日悖论的问题: 一个班级外面有多少个学生会使至多有两人生日雷同的概率大于 50%? 咱们来计算一下下面的问题。 假如Q(n)是班级中n集体生日不同的概率。 Q(n)= 365/365×364/365×363/365×...×(365-n + 1)/ 365,即第一人的生日能够是365天中的任何一天,第二人的生日能够是除第一人的生日之外的任何365天,等等。 设P(n)为班级中 n 集体的雷同生日的概率,则P(n)= 1-Q(n)。 计算可得,当n=23的时候P(23) = 0.507> 0.5(50%)。 也就是说当班级领有23集体的时候,班级至多有两个人的生日雷同的概率曾经超过了50%。 这个悖论通知咱们:集体感觉常见的事件在个体中却是常见的。 好了,回到咱们的hash抵触,咱们须要构建一个好的hash函数来尽量减少数据的抵触。 什么是一个好的散列函数呢? 可能疾速计算,即其工夫复杂度是O(1)。尽可能应用最小容量的散列表,尽可能平均地将键扩散到不同的基地址∈[0..M-1],尽可能减少碰撞。 在探讨散列函数的实现之前,让咱们探讨现实的状况:完满的散列函数。 完满的散列函数是键和散列值之间的一对一映射,即基本不存在抵触。 当然这种状况是十分少见的,如果咱们当时晓得了散列函数中要存储的key,还是能够办到的。 好了,接下来咱们讨论一下hash中解决抵触的几种常见的办法。 线性探测先给出线性探测的公式:i形容为i =(base + step * 1)%M,其中base是键v的散列值,即h(v),step是从1开始的线性探测步骤。 ...

November 22, 2021 · 2 min · jiezi

关于算法:IN3026-Advanced-Games

IN3026: Advanced Games TechnologyBSc/MSci Computer Science with Games TechnologyCoursework Project: Casual Game in C++ and OpenGLSynopsisThe aim of this coursework is to give you the opportunity to develop your games programmingexperience by using industry-proven languages and toolkits. You will be developing a singlelevel of a casual game in C++ using Visual Studio and the game template provided on Moodle.The game will use OpenGL for real-time 3D graphics rendering.This coursework is an individual work, worth 100% of the final course module mark. There isno further exam on this module. The project is broken in two milestones, described below.Submission DetailsYou must submit your project via Moodle. Submission dates are shown in the submission areas.As with all modules, this deadline is hard, and extensions may only be requested via thestandard Extenuating Circumstances procedure. Milestone 1 will comprise 25% of the overallmarks for the module, and Milestone 2 will comprise the remaining 75%.A 3D Computer Game with Varying-Difficulty GameplayTaking on the roles of designer, developer and tester, you will create a single level of a 3Dcasual game. The core concept will be a game containing: Easy and hard modes, triggered by in-game actions and consistent with the gamestoryline or theme you create. Gameplay elements (power-ups, obstacles, etc.) that give the player a challenge andmake your game interesting to play.At least one camera technique. ...

November 21, 2021 · 11 min · jiezi

关于算法:MCD4710算法分析

MCD4710 - Introduction to Algorithms and ProgrammingAssignment 1 (8%)Objectives The objectives of this assignment are:● To gain experience in designing algorithms for a given problem description and implementing those algorithms inPython.● To demonstrate your understanding on:o Implementing problem solving strategieso Recognizing the relationship between a problem description and program designo Decomposing code into functions in Python.Submission Procedure Your assignment will not be accepted unless it meets these requirements: Your name and student ID must be included at the start of every file in your submission.Save your file(s) into a zip file called YourStudentID.zipSubmit your zip file containing your entire submission to Moodle.Late Submission Late submission will have 5% deduction of the total assignment marks per day (including weekends). Assignmentssubmitted 7 days after the due date will not be accepted.Important Notes ● Please ensure that you have read and understood the university’s procedure on plagiarism and collusion availableat https://www.monashcollege.edu.... You will be required to agree to these policies when you submit your assignment.● Your code will be checked against other students’ work and code available online by advanced plagiarismdetection systems. Make sure your work is your own. Do not take the risk.● Your program will be checked against a number of test cases. Do not forget to include comments in your codeexplaining your algorithm. If your implementation has bugs, you may still get some marks based on how closeyour algorithm is to the correct algorithm. This is made difficult if code is poorly documented.● Where it would simplify the problem you may not use built-in Python functions or libraries (e.g. usinglist.sort() or sorted()). Remember that this is an assignment focusing on algorithms and programming.2MCD4710 - Introduction to Algorithms and ProgrammingAssignment 1 (8%)Assignment code interview Each student will be interviewed during a lab session regarding their submission to gauge your personal understanding ofyour Assignment code. The purpose of this is to ensure that you have completed the code yourself and that you understandthe code submitted. Your assignment mark will be scaled according to the responses provided.Interview Rubric0 The student cannot answer even the simplest of questions.There is no sign of preparation.They probably have not seen the code before.0.25 There is some evidence the student has seen the code.The answer to a least one question contained some correct points.However, it is clear they cannot engage in a knowledgeable discussion about the code.0.5 The student seems underprepared.Answers are long-winded and only partly correct.They seem to be trying to work out the code as they read it.They seem to be trying to remember something they were told but now can’t remember.However, they clearly know something about the code.With prompting, they fail to improve on a partial or incorrect answer.0.75 The student seems reasonably well prepared.Questions are answered correctly for the most part but the speed and/or confidence they areanswered with is not 100%.With prompting, they can add a partially correct answer or correct an incorrect answer.1 The student is fully prepared.All questions were answered quickly and confidently.It is absolutely clear that the student has performed all of the coding themselves.Marking CriteriaThis assignment contributes to 8% of your final mark.Task 1: Display Sudoku - 5 marks Displaying all rows of the field in individual lines (1 mark) Displaying spaces instead of zeroes and no commas (1 mark) Visualisation of subgrid boundaries for k==2 (1 mark) Visualisation of subgrid boundaries for arbitrary k (not necessarily aligned columns for k > 2) (1 mark) If function correctly aligns columns for k = 4 by replacing values 10 to 16 by letters 'A' to 'G' (1 mark)Task 2: Implement the rules - 5 marks Correct implementation of subgrid values (2 mark) Correct implementation of options (1 mark) Integration into the play function (1 mark) For success message when board is solved (1 mark)Task 3: Undo – 2 marks Restart functionality (1 mark) Undo functionality (1 mark)Task 4: Hints - 3 marks Printing a hint and explaining how the hint is chosen in the docstring (2 marks) Printing board with marker on the field corresponding to the hint (1 mark)Programming practice – 2 marks Decomposition (1 mark) Variable names and code Documentation (1 mark)Total: 17 marks 3MCD4710 - Introduction to Algorithms and ProgrammingAssignment 1 (8%)SudokuSudoku is a puzzle game for one player where one has to fill up a regular grid of fields (game board) withnumbers. Typically a Sudoku board is 9 times 9 fields, but in this assignment we will write functions that canwork in principle with arbitrary sized n times n boards as long as n = k**2 for some integer k > 1.Conceptually, the board is composed of k×k subgrids (each consisting of k×k fields). The objective of theplayer is to fill all fields with the numbers 1 to n (inclusive) such that• no column of the grid contains the same number more than once• no row of the grid contains the same number more than once• none of the k**2 subgrids contains the same number more than onceSee https://en.wikipedia.org/wiki... for more information.In this assignment, we represent a Sudoku board by a n×n table where each entry is either a number from1 to n (inclusive) or 0 representing that the corresponding field is still empty. For example, a small game boardwith n=4 (and k=2) with four fields already filled could be defined as follows: ...

November 21, 2021 · 10 min · jiezi

关于算法:31下一个排列-算法leetode附思维导图-全部解法300题

零 题目:算法(leetode,附思维导图 + 全副解法)300题之(31)下一个排列一 题目形容 二 解法总览(思维导图) 三 全副解法1 计划11)代码: // 计划1 “双指针法”。// 通过:213 / 265 。未通过例子:[4,2,0,2,3,2,0] 。// 技巧:“双指针”大部分实用于 “数组”(双向,向前、向后都能够走)、“链表”(只能单向的向后走)。// 因为 “算法 与 数据结构 相适应” —— 类比生物学里的 “构造与性能相适应”。// 思路:// 1)2)利用 i( 范畴:[l - 1, 1] )、j( 范畴:[i - 1, 0] ) 双指针// 2.1)找到合乎 nums[i] > nums[j] 条件的 i、j 下标// 2.1.1)进行 “值替换”// 2.1.2)对 nums ,(j + 1)下标前面的数进行重排为升序// 3)边界解决。若 此时 nums 是最大的排列,则 间接将 nums 重排为升序排列即可~var nextPermutation = function(nums) { // 1)状态初始化 const l = nums.length; // 2)利用 i( 范畴:[l - 1, 1] )、j( 范畴:[i - 1, 0] ) 双指针 for (let i = l - 1; i >= 1; i--) { for (let j = i - 1; j >= 0; j--) { // 2.1)找到合乎 nums[i] > nums[j] 条件的 i、j 下标 if (nums[i] > nums[j]) { // 2.1.1)进行 “值替换” [nums[i], nums[j]] = [nums[j], nums[i]]; // 2.1.2)对 nums ,(j + 1)下标前面的数进行重排为升序 let tempList = nums.slice(j + 1); tempList.sort((a, b) => a - b); nums.splice(j + 1, (l - j - 1), ...tempList); return; } } } // 3)边界解决。若 此时 nums 是最大的排列,则 间接将 nums 重排为升序排列即可~ nums = nums.sort((a, b) => a -b);};2 计划21)代码: ...

November 20, 2021 · 2 min · jiezi

关于算法:得物技术基于自注意机制的图像识别算法

背景对于做 CV 同学的人来说,图像识别是入门中最简略的模型,也是最最根底的模型。在不同的 CV 工作重,即便倒退多年,都始终保留着利用训练好的图像识别工作重的模型权重,作为 backbone 用于减速训练收敛的作用。然而面对一些图像识别的工作,咱们如何依据业务需要去革新一个曾经比拟齐备的辨认工作,还是蛮有意思的一个话题。 业务需要可能筛选出用户上传的球鞋图片中带有洁净对立背景的图片,咱们暂且就叫这个我的项目为 背景复杂度检测 工作。帮忙后续估价以及发售环节算法升高难度,以及维持整个 app 图像品质在一个水平线上。 我的项目要求可能在测试集的准确率达到 80% 以上,能够用于给予用户提醒,然而并不强制;而达到 90% 以上,能够强制用户依照要求达到上传图片品质的要求。可能实现端侧利用。模型设计mobilenet backbone + FPN + modified SAM 最终做进去的模型各个模块合成来看其实很简略,没有什么特地难懂的中央。 整体须要致力的方向无外乎以下几点: 剖析业务特点,这是一个典型的空间型辨认工作,即是通过图像的某局部或者某几局部区域的内容实现目标。对于 背景复杂度 咱们要刨去主体之外的局部,判断残余局部是否是“简单的”,即可,所以想到能够用空间系列的注意力机制。咱们不可能对于用户严格控制拍照中的主体占据图片中比例的大小。有些用户习惯将主体占满屏,有些用户喜爱留白多一些。对于不同的尺度,如果想做到精密分类,是须要在较高分辨率下的 feature map 做文章,所以这里用 FPN。为了可能在端侧实现利用,选用 mobilenet 系列是很人造的想法。以上几点的设计思路其实就是齐全围绕以后 业务场景 而去做出的设计。 最终在测试集上,利用设计好的 CNN 模型达到了 96% 的正确率。能够作为强制用户上传高品质图片品质的根据。 如果想理解(白嫖)这个我的项目所用模型,其实分享到这就能够达到目标了。每一个模块的设计,其实都不难,没有新的概念。代码也很扼要,实现也很不便。 但我的项目自身最乏味的实际上是实现整个我的项目的思维,为什么最初选用这样的模型,两头其余的思路是如何被排除,如何试错的!!! 我的项目过程传统 CV我的项目须要在端侧实现,尽管没有明确手机实时性的要求,然而须要整个算法文件,所援用的 库 占据内存足够的小。第一可能想到的就是如果不必深度网络,这个问题是否可能解决。 谬误的思路剖析 背景复杂度,我曾想到用 对于和整个业务无关然而又重大影响后果的主体内容,用一个固定大小的高斯核进行过滤,而后进行其余解决。利用边缘检测、梯度信息剖析一张图片的背景复杂度傅里叶频率信息剖析图片的高低频信息来判断:高频代表背景信息多,较为简单;低频代表洁净。通过多张背景洁净的图片做简略像素加权均匀当做模板,而后利用异样检测的办法,筛选出背景简单的图片。以上都是在我的项目初期,我能想到的一些简略的 idea。然而察看图片样本后,这些想法,除去第一条的思路是对的(空间维度的信息),其余三条的思路都是错的。举个例子,一双鞋放在地毯上,地毯自身是洁净的,图片也除去主体和地毯没有其余任何物体。然而地毯有本人的纹路,高频信息很多,梯度信息很多。依照上述 idea 2、3、4 条的准则,这样的背景属于复杂度很高的背景。然而实际上,在样本中,这样的背景算是洁净的。 通过剖析数据的样本以及反思业务逻辑得出以下论断: 背景复杂度概念不是针对不同图片之间背景的差别。背景复杂度的概念是针对每张图片本身是否呈现了不同的背景和不是主体的一些前景物体。那么,整体的思路就要做出一些扭转,就是要通过 自类似度 的形式来判断背景复杂度。这也是对于业务越来越相熟之后做出策略上的调整。 模板匹配那么须要用到哪些局部能够用于自类似度的判断呢? 四个角下面说过,谬误的 idea 中,有一个思路是对的,就是要利用空间维度去思考业务,去掉主体信息思路是对的。即咱们在判断背景自类似度的状况,是须要防止划到主体信息的。依据这个思路,咱们可依据教训,4 个角能够在肯定水平上能够代表一张图的背景信息。如果 4 个角上的内容类似,能够解决大部分业务的指标。利用 4 个角的信息计算两两自类似度,有 6 个值。6 个值越高,阐明 4 个角的类似度越高,是洁净背景的概率也就越大。 ...

November 19, 2021 · 1 min · jiezi

关于算法:COMP5911M-Advanced-Software

COMP5911M Advanced Software EngineeringCoursework 2These tasks are concerned with computing software metrics. There are a total of 40 marks available. Thiscoursework is worth 15% of your overall grade.PreparationTask 1 of assignment uses the Car Rental example from the lectures and exercises. You will need to analyzethe initial, unrefactored version of the code, as provided for Exercise 2. You will then do the same analysisfor the code after you have applied all of the refactorings from Exercise 4.Hence it is important that you complete Exercise 4 before attempting this assignment!TasksTask 1 (24 marks) ...

November 19, 2021 · 5 min · jiezi

关于算法:图数据库平台建设及业务落地

1 什么是图数据库图数据库(Graph database)是以图这种数据结构存储和查问的数据库。与其余数据库不同,关系在图数据库中占首要地位。这意味着应用程序不用应用外键或带外解决(如 MapReduce)来推断数据连贯。与关系数据库或其余 NoSQL 数据库相比,图数据库的数据模型也更加简略,更具表现力。 图数据库在社交网络、常识图谱、金融风控、个性化举荐、网络安全等畛域利用宽泛。 2 图数据库调研2.1 调研背景随着常识图谱等业务数据的一直增长,现有图数据库 JanusGraph 应答曾经比拟吃力,导入工夫曾经无奈满足业务的要求。因而寻找性能更好的开源属性图数据库曾经成为了以后迫切要做的事件。 新图数据库应满足以下要求: 可能反对 10 亿节点 100 亿边 170 亿属性的大规模图谱全量导入工夫不超过 10h二度查问均匀响应工夫不超过 50ms,QPS 可能达到 5000+开源且反对分布式的属性图数据库2.2 调研过程第一步,收集常见的开源分布式属性图数据库,如下表: 第二步,基于美团、LightGraph、TigerGraph、GalaxyBase等图数据库测试报告,剖析可得几个图数据库性能如下: 导入:NebulaGraph > HugeGraph > JanusGraph > ArangoDB > OrientDB 查问:NebulaGraph > HugeGraph > JanusGraph > ArangoDB > OrientDB NebulaGraph不论是在导入还是在查问性能上都体现优异。 第三步,为了验证 NebulaGraph 的性能,对 NebulaGraph 和 JanusGraph 进行了一次性能比照测试,测试后果如下: 上图中,将JanusGraph性能看作 1,NebulaGraph 导入性能要比 JanusGraph 快一个数量级,查问性能是 JanusGraph 的 4-7 倍。而且随着并发量的增大,性能差距会进一步拉大,而且 JanusGraph 在从 20 个线程开始,三度街坊查问会有 error。而 NebulaGraph 没有任何error。 ...

November 19, 2021 · 2 min · jiezi

关于算法:Python集成机器学习用AdaBoost决策树逻辑回归集成模型分类和回归和网格搜索超参数优化

原文链接:http://tecdat.cn/?p=24231 Boosting 是一类集成机器学习算法,波及联合许多弱学习器的预测。 弱学习器是一个非常简单的模型,只管在数据集上有一些技巧。在开发实用算法之前很久,Boosting 就是一个实践概念,而 AdaBoost(自适应晋升)算法是该想法的第一个胜利办法。 AdaBoost算法包含应用十分短的(一级)决策树作为弱学习者,顺次增加到汇合中。每一个后续的模型都试图纠正它之前的模型在序列中做出的预测。这是通过对训练数据集进行衡量来实现的,将更多的注意力放在先前模型呈现预测谬误的训练实例上。 在本教程中,您将理解如何开发用于分类和回归的 AdaBoost 集成。 实现本教程后,您将理解: AdaBoost集成是一个由决策树顺次增加到模型中而造成的合集。如何应用 AdaBoost 集成通过 scikit-learn 进行分类和回归。如何摸索 AdaBoost 模型超参数对模型性能的影响。增加了网格搜寻模型超参数的示例。教程概述本教程分为四个局部;他们是: AdaBoost 集成算法AdaBoost  API用于分类的 AdaBoost用于回归的 AdaBoostAdaBoost 超参数摸索树的数量摸索弱学习摸索学习率摸索代替算法网格搜寻 AdaBoost 超参数AdaBoost 集成算法Boosting "Boosting") 是指一类机器学习集成算法,其中模型按程序增加,序列中较晚的模型纠正序列中较早模型所做的预测。 AdaBoost是“ Adaptive Boosting ”的缩写,是一种晋升集成机器学习算法,并且是最早胜利的晋升办法之一。 咱们称该算法为 AdaBoost 是因为与以前的算法不同,它能够自适应地调整弱假如的谬误— A Decision-Theoretic Generalization of on-Line Learning and an Application to Boosting, 1996. AdaBoost 联合了来自短的一级决策树的预测,称为决策树桩,只管也能够应用其余算法。决策树桩算法被用作 AdaBoost 算法,应用许多弱模型并通过增加额定的弱模型来纠正它们的预测。 训练算法波及从一个决策树开始,在训练数据集中找到那些被谬误分类的例子,并为这些例子减少更多的权重。另一棵树在雷同的数据上训练,只管当初由误分类谬误加权。反复此过程,直到增加了所需数量的树。 如果训练数据点被谬误分类,则该训练数据点的权重会减少(晋升)。应用新的权重构建第二个分类器,这些权重不再相等。同样,谬误分类的训练数据的权重减少,并反复该过程。— Multi-class AdaBoost, 2009. 该算法是为分类而开发的,波及组合集成中所有决策树所做的预测。还为回归问题开发了一种相似的办法,其中应用决策树的平均值进行预测。每个模型对集成预测的奉献依据模型在训练数据集上的性能进行加权。 新算法不须要弱假如准确性的先验常识。相同,它适应这些准确性并生成加权少数假如,其中每个弱假如的权重是其准确性的函数。— A Decision-Theoretic Generalization of on-Line Learning and an Application to Boosting, 1996. 当初咱们相熟了 AdaBoost 算法,让咱们看看如何在 Python 中拟合 AdaBoost 模型。 ...

November 16, 2021 · 2 min · jiezi

关于算法:程序员开源新项目碾压价值-75-亿的官方版皆因孩子的-IT-灾难校务系统太垃圾

无处不在的开源,为科技领域带来微小改革和翻新的同时,平安问题也成为寰球关注的焦点。最近,来自瑞典斯德哥尔摩市的程序员 Landgren ,就因为看不惯自家孩子学校的 IT 零碎(Skolplattform),拉上其余家长一起重构了一个开源的版本 Öppna skolplattformen,由此引发了一场和市政府的“拉锯战”。 Landgren 是瑞典翻新征询公司 Iteam 的开发人员兼首席执行官,作为三个孩子的父亲,他每天都在破费贵重的工夫试图让斯德哥尔摩市的官网学校零碎 Skolplattform 失常运行,他心愿 Öppna Skolplattformen 的到来能改善 Skolplattform 失败的中央。 一场由 “IT 劫难”校务零碎引发的拉锯战而这个被称为“Skolplattform”的学校 IT 零碎,是由瑞典在 2013 年破费约10 亿瑞典克朗(约 1.17 亿美元)洽购的,目前已在斯德哥尔摩市 600 所幼儿园和 177 所学校利用。该零碎由 18 个独立模块形成,有 5 个外包技术公司独特保护,次要用来注销缺勤、记录问题等,旨在让斯德哥尔摩 500000 多名学生、老师和家长的生存变轻松。 “但这个平台惟一的问题,就是它不起作用”,Landgren 评估称。 Skolplattform 耗资超过 10 亿瑞典克朗(约 1.17 亿美元),但未能达到其最后的指标。家长和老师埋怨该零碎的复杂性,该零碎的启动被推延,有报告称项目管理不善,并被称为 IT 劫难(Android 版本的应用程序均匀仅1.2星级。) 通过翻阅有数简单的菜单,Landgren 能够看到他的孩子们在学校做什么。在 2018 年 8 月推出两年后,Skolplattform 零碎始终是瑞典首都成千上万家长的眼中钉。“所有的用户和家长都很怄气,”Landgren 说,这个零碎体验十分差,比方弄清楚孩子们在健身器材里须要什么就是一件十分麻烦的事,还有“该怎么报告孩子生病这件事”几乎是一场噩梦。 Landgren 认为,Skolplattform 不应该是这样的。 2020 年 10 月 23 日,Landgren 在推特上公布了一款帽子设计,下面印有“Skrota Skolplattformen”字样,大抵翻译为“学校平台上的垃圾”。他开玩笑说,他应该在接孩子放学时戴上这顶帽子。几周后,戴着那顶帽子,他决定本人解决事件。他说:“出于我本人的挫败感,我刚刚开始创立本人的应用程序。”。 ...

November 15, 2021 · 1 min · jiezi

关于算法:Conways-Problem

Lab 4 - Conways ProblemConway’s ProblemIn this lab you will write a program to solve Conway’s problem.DescriptionYou will again use the IPC implementation under UNIX and the ezipc.h library to solve the problem. Ifezipc is not used, points will be taken off. You may use SHOW() and SET() only for debugging purposes.PurposeConway's Problem: Write a program to read 80-column cards and write them as 125-character lines withthe following changes. After every card image the string <EOL> is inserted. Every adjacent pair ofasterisks ** is replaced by a #.Of course Conway's problem can be solved by a single sequential program. However, it is difficult to besure that you have taken care of all special cases such as pairs of asterisks at the end of a card and soon.The problem has an elegant solution with three concurrent processes. One process producer readscards and inserts the string <EOLN> when necessary and passes characters through a one-characterbuffer to a process squash. squash, which knows nothing about 80-column cards, simply looks fordouble asterisks and passes a stream of modified characters to a process print. print takes thecharacters and prints them as 125-character lines.Program GuidlinesWrite a program to solve Conway's problem with three separate processes for the producer, squasherand printer as described above using three concurrent processes with the following modifications: ...

November 13, 2021 · 2 min · jiezi

关于算法:主宰这个世界的-10-大算法

本文作者:claudio,煎蛋00 前言Reddit有篇帖子介绍了算法对咱们当初生存的重要性,以及哪些算法对现代文明所做奉献最大。这个表单并不残缺,很多与咱们密切相关的算法都没有提到,如机器学习和矩阵乘法,欢送你持续补充。 如果对算法有所理解,读这篇文章时你可能会问“作者晓得算法为何物吗?”,或是“Facebook的‘信息流’(News Feed)算是一种算法吗?”,如果“信息流”是算法,那就能够把所有事物都归结为一种算法。满腹经纶,联合那篇帖子,接下来我试着解释一下算法是什么,又是哪些算法正在主导咱们的世界。 01 什么是算法?简而言之,任何定义明确的计算步骤都可称为算法,承受一个或一组值为输出,输入一个或一组值。(起源:homas H. Cormen, Chales E. Leiserson 《算法导论第3版》) 能够这样了解,算法是用来解决特定问题的一系列步骤(不仅计算机须要算法,咱们在日常生活中也在应用算法)。算法必须具备如下3个重要个性: 有穷性,执行无限步骤后,算法必须停止。确切性,算法的每个步骤都必须确切定义。可行性,特定算法须能够在特定的工夫内解决特定问题。其实,算法尽管广泛应用在计算机领域,但却齐全源自数学。实际上,最早的数学算法可追溯到公元前1600年-Babylonians无关求因式分解和平方根的算法。 那么又是哪10个计算机算法造就了咱们明天的生存呢?请看上面的表单,排名不分先后: 1、归并排序(MERGE SORT)、疾速排序(QUICK SORT)和沉积排序(HEAP SORT) 哪个排序算法效率最高?这要看状况。这也就是我把3种算法放在一起讲的起因,可能你更罕用其中一种,不过它们各有千秋。 归并排序算法,是目前为止最重要的算法之一,是分治法的一个典型利用,由数学家John von Neumann于1945年创造。 疾速排序算法,联合了汇合划分算法和分治算法,不是很稳固,但在解决随机列阵(AM-based arrays)时效率相当高。 沉积排序,采纳优先伫列机制,缩小排序时的搜寻工夫,同样不是很稳固。 与晚期的排序算法相比(如冒泡算法),这些算法将排序算法提上了一个大台阶。也多亏了这些算法,才有明天的数据挖掘,人工智能,链接剖析,以及大部分网页计算工具。 2、傅立叶变换和疾速傅立叶变换 这两种算法简略,但却相当弱小,整个数字世界都离不开它们,其性能是实现工夫域函数与频率域函数之间的互相转化。能看到这篇文章,也是托这些算法的福。 因特网,WIFI,智能机,座机,电脑,路由器,卫星等简直所有与计算机相关的设施都或多或少与它们无关。不会这两种算法,你基本不可能拿到电子,计算机或者通信工程学位。(USA) 3、迪杰斯特拉算法 (Dijkstra’s algorithm) 能够这样说,如果没有这种算法,因特网必定没有当初的高效率。只有能以“图”模型表示的问题,都能用这个算法找到“图”中两个节点间的最短距离。 尽管现在有很多更好的办法来解决最短门路问题,但代克思托演算法的稳定性仍无奈取代。 4、RSA非对称加密算法毫不夸大地说,如果没有这个算法对密钥学和网络安全的奉献,现在因特网的位置可能就不会如此之高。当初的网络毫无安全感,但遇到钱相干的问题时咱们必须要保障有足够的安全感,如果你感觉网络不平安,必定不会傻乎乎地在网页上输出本人的银行卡信息。 RSA算法,密钥学畛域最牛叉的算法之一,由RSA公司的三位创始人提出,奠定了当今的密钥钻研畛域。用这个算法解决的问题简略又简单:保障平安的状况下,如何在独立平台和用户之间分享密钥。 5、哈希平安算法(Secure Hash Algorithm)确切地说,这不是一种算法,而是一组加密哈希函数,由美国国家标准技术研究所首先提出。无论是你的利用商店,电子邮件和杀毒软件,还是浏览器等等,都应用这种算法来保障你失常下载,以及是否被“中间人攻打”,或者“网络钓鱼”。 6、整数质因子合成算法(Integer factorization)这其实是一个数学算法,不过曾经广泛应用与计算机领域。如果没有这个算法,加密信息也不会如此平安。通过一系列步骤将,它能够将一个合成数分解成不可再分的数因子。 很多加密协议都采纳了这个算法,就比方刚提到的RSA算法。 7、链接剖析算法(Link Analysis) 在因特网时代,不同入口间关系的剖析至关重要。从搜索引擎和社交网站,到市场剖析工具,都在不遗余力地寻找因特网的正真结构。链接剖析算法始终是这个畛域最让人费解的算法之一,实现形式不一,而且其自身的个性让每个实现形式的算法产生同化,不过基本原理却很类似。 链接剖析算法的机制其实很简略:你能够用矩阵示意一幅“图“,造成本征值问题。本征值问题能够帮忙你剖析这个“图”的构造,以及每个节点的权重。这个算法于1976年由Gabriel Pinski和Francis Narin提出。 谁会用这个算法呢?Google的网页排名,Facebook向你发送信息流时(所以信息流不是算法,而是算法的后果),Google+和Facebook的好友举荐性能,LinkedIn的工作举荐,Youtube的视频举荐,等等。 普遍认为Google是首先应用这类算法的机构,不过其实早在1996年(Google 问世2年前)李彦宏就创立的“RankDex”小型搜索引擎就应用了这个思路。而Hyper Search搜索算法建设者马西莫·马奇奥里也曾应用过相似的算法。这两个人都起初都成为了Google历史上的传奇人物。 8、比例微积分算法(Proportional Integral Derivative Algorithm) 飞机,汽车,电视,手机,卫星,工厂和机器人等等事物中都有这个算法的身影。 简略来讲,这个算法次要是通过“管制回路反馈机制”,减小预设输入信号与实在输入信号间的误差。只有须要信号处理,或电子系统来管制自动化机械,液压和加热零碎,都须要用到这个算个法。 没有它,就没有现代文明。 9、数据压缩算法数据压缩算法有很多种,哪种最好?这要取决于利用方向,压缩mp3,JPEG和MPEG-2文件都不一样。 哪里能见到它们?不仅仅是文件夹中的压缩文件。你正在看的这个网页就是应用数据压缩算法将信息下载到你的电脑上。除文字外,游戏,视频,音乐,数据贮存,云计算等等都是。它让各种零碎更轻松,效率更高。 10、随机数生成算法 到现在,计算机还没有方法生成“正真的”随机数,但伪随机数生成算法就足够了。这些算法在许多畛域都有利用,如网络连接,加密技术,平安哈希算法,网络游戏,人工智能,以及问题剖析中的条件初始化。 逆锋起笔是一个专一于程序员圈子的技术平台,你能够播种最新技术动静、最新内测资格、BAT等大厂的教训、精品学习材料、职业路线、副业思维,微信搜寻逆锋起笔关注!

November 12, 2021 · 1 min · jiezi

关于算法:详解低延时高音质回声消除与降噪篇

在实时音频互动场景中,除了咱们上一篇讲到的编解码会影响音质与体验,在端上,降噪、回声打消、自动增益模块同样起着重要作用。在本篇内容中咱们将次要围绕回声打消和降噪模块,讲讲实时互动场景下的技术挑战,以及咱们的解决思路与实际。 回声打消的三大算法模块优化在语音通信零碎中,回声打消(Echo Cancellation)始终扮演着外围算法的角色。一般来说,回声打消的成果受诸多因素的影响,包含: 声学环境,包含反射,混响等;通话设施自身声学设计,包含音腔设计以及器件的非线性失真等;零碎性能,处理器的计算能力以及操作系统线程调度的能力。声网回声打消算法在设计之初,就将算法性能、鲁棒性和普适性作为最终的优化指标,这一点对于一个优良的音视频 SDK 来说至关重要。 首先,回声是怎么产生的?简略来讲,就是你的声音从对方的扬声器收回,这个声音又被他的麦克风给收录了进去,这个被麦克风收录的声音又传回到你这一端,你就听到了回声。为了打消回声,咱们就要设计一个算法将这个声音信号从麦克风信号中去除掉。 那么声学回声打消模块(AEC, Acoustic Echo Cancellation)是如何打消回声的呢?具体的步骤见如下简图所示: 第一步须要找到参考信号/扬声器信号(蓝色折线)跟麦克风信号(红色折线)之间的提早,也就是图中的 delay=T。第二步依据参考信号预计出麦克风信号中的线性回声成分,并将其从麦克风信号中减去,失去残差信号(彩色折线)。第三步通过非线性的解决将残差信号中的残余回声给彻底克制掉。与以上的三个步骤绝对应,回声打消也由三个大的算法模块组成: 提早预计(Delay Estimation)线性自适应滤波器(Linear Adaptive Filter)非线性解决(Nonlinear Processing)其中「提早预计」决定了AEC的上限,「线性自适应滤波器」决定了 AEC 的下限,「非线性解决」决定了最终的通话体验,特地是回声克制跟双讲之间的均衡。 注:双讲是指在交互场景中,互动单方或多方同时讲话,其中一方的声音会受到克制,从而呈现断断续续的状况。这是因为回声打消算法“矫枉过正”,打消了局部不该去除的音频信号。接下来,咱们先围绕这三个算法模块,别离讲讲其中的技术挑战与优化思路。 一、提早预计受具体零碎实现的影响,当把参考信号与麦克风信号别离送入 AEC 模块进行解决之时,它们所存入的数据 buffer 之间存在一个工夫上的提早,即咱们在上图中看到的“delay=T”。假如这个产生回声的设施是一部手机,那么声音从它的扬声器收回后,一部分会通过设施外部传导到麦克风,也可能会通过外部环境传回到麦克风中。所以这个提早就蕴含了设施采集播放 buffer 的长度,声音在空气中传输的工夫,也蕴含了播放线程与采集线程开始工作的时间差。正是因为影响提早的因素很多,因而这个提早的值在不同零碎,不同设施,不同 SDK 底层实现上都各不相同。它在通话过程中兴许是一个定值,也有可能会中途变动(所谓的 overrun 和 underrun)。这也是为什么一个 AEC 算法在设施 A 上可能起作用,但换到另一个设施上可能成果会变差。提早预计的精确性是 AEC 可能工作的先决条件,过大的预计偏差会导致 AEC 的性能急剧下降,甚至无奈工作,而无奈疾速跟踪时延变动是呈现偶现回声的重要因素。 加强提早预计算法鲁棒性 传统算法通常通过计算参考信号跟麦克风信号之间的相关性来决定提早。相关性的计算能够放在频域上,典型的就是 Binary Spectrum 的办法,通过计算单频点上的信号能量是否超过肯定门限值,理论将参考信号跟麦克风信号映射成了两维的0/1数组,而后通过一直挪动数组偏移来找到提早。最新的 WebRTC AEC3 算法通过并行的多个NLMS线性滤波器来寻找提早,这个办法在检测速度及鲁棒性方面都获得了不错的成果,然而计算量十分大。当在时域上计算两个信号的相互关时,一个显著的问题是语音信号蕴含大量的谐波成分并且具备时变个性,它的相干信号经常呈现出多峰值的特色,有的峰值并不代表真正的提早,并且算法容易受到噪声烦扰。 声网提早预计算法通过升高信号之间的相关性(de-correlate),可能无效克制 local maxima 的值以大大加强算法的鲁棒性。如下图所示,右边是原始信号之间的相互关,左边是声网SDK解决后的相互关,可见信号的预处理大大加强了提早预计的鲁棒性: 算法自适应,升高计算量 通常提早预计算法为了升高计算量的须要,会事后假如回声信号呈现在某个较低的频段内,这样就能够将信号做完下采样之后再送入提早预计模块,升高算法的计算复杂度。然而面对市面上数以万计的设施及各种路由,以上的假如往往并不成立。下图是 VivoX20 在耳机模式下麦克风信号的频谱图,可见回声都集中在 4kHz 以上的频段内,传统的算法针对这些 case 都会导致回声打消模块的生效。声网提早预计算法会在全频段内搜寻回声呈现的区域,并自适应地抉择该区域计算提早,确保算法在任何设施,路由下都有准确的提早预计输入。 图:VivoX20 接入耳机后的麦克风信号 动静更新音频算法库,晋升设施覆盖率 为了确保算法的继续迭代改良,声网保护了一个音频算法的数据库。咱们应用大量不同测试设施,在不同声学环境下采集到了各种参考信号和麦克风信号的组合,而它们之间的提早全副通过离线解决的形式进行标定。除了实在采集的数据,数据库中也蕴含了大量仿真的数据,包含不同的谈话人,不同的混响强度,不同的底噪程度,以及不同的非线性失真类型。为了掂量提早预计算法的性能,参考信号与麦克风信号之间的提早能够随机的变动,用以察看算法对突发提早变动的响应。 所以判断一个提早预计算法的优劣,还须要考查: ...

November 12, 2021 · 1 min · jiezi

关于算法:CS-440-Search-Problems-in-AI

CS 440: INTRODUCTION TO ARTIFICIAL INTELLIGENCE FALL 2021Assignment 2Search Problems in AIDeadline: November 12th, 11:55pm.Perfect score: 70.Assignment Instructions:Teams: Assignments should be completed by teams of up to three students. You can work on this assignment individuallyif you prefer. No additional credit will be given for students that complete an assignment individually. Make sure to writethe name and RUID of every member of your group on your submitted report.Submission Rules: Submit your reports electronically as a PDF document through Canvas (canvas.rutgers.edu).Each team of students should submit only a single copy of their solutions and indicate all team members on theirsubmission. Failure to follow these rules will result in lower grade for this assignment.Late Submissions: No late submission is allowed. 0 points for late assignments.Extra Credit for LATEX: You will receive 10% extra credit points if you submit your answers as a typeset PDF (usingLATEX, in which case you should also submit electronically your source code). There will be a 5% bonus for electronicallyprepared answers (e.g., on MS Word, etc.) that are not typeset. If you want to submit a handwritten report, scan it andsubmit a PDF via Canvas. We will not accept hardcopies. If you choose to submit handwritten answers and we are not ableto read them, you will not be awarded any points for the part of the solution that is unreadable.Precision: Try to be precise. Have in mind that you are trying to convince a very skeptical reader (and computer scientistsare the worst kind...) that your answers are correct.Collusion, Plagiarism, etc.: Each team must prepare its solutions independently from other teams, i.e., without usingcommon notes, code or worksheets with other students or trying to solve problems in collaboration with other teams. Youmust indicate any external sources you have used in the preparation of your solution. Do not plagiarize online sources andin general make sure you do not violate any of the academic standards of the department or the university. Failure to followthese rules may result in failure in the course.Problem 1 (10 points): Trace the operation of A? search (the tree version) applied to the problem of getting to Bucharestfrom Lugoj using the straight-line distance heuristic. That is, show the sequence of nodes that the algorithm will con-sider and the f , g, and h score for each node. You don’t need to draw the graph, just right down a sequence of ...

November 12, 2021 · 6 min · jiezi

关于算法:小白KMP算法-讲清楚next数组生成代码

KMP算法解说的很多,清晰的很少,在此写一个汪汪都能看懂的通俗易懂直观的精讲。文末会给出学习倡议。 KMP算法的由来和本文术语解释KMP算法的中文名称为疾速模式匹配算法,是为了疾速解决在一个字符串中查找另一个字符串的问题。(为了不便形容,要找到的那个字符串叫模式串,要搜寻的那个范畴叫文本串。比方要求在字符串abbaf中找到字符串baf,baf就是模式串,abbaf就是文本串)。 针对这种问题,咱们其实很容易想到一种暴力的算法,那就是一个一个比。不难发现,遇到不匹配的状况时,模式串每次都是傻傻的挪一下,而后再一位一位地去比拟。 暴力太傻了吧,所以就有了KMP算法,让模式串迈开腿,可能大步往前走。但大步走也不是瞎走,不然走过了相等的村就没有相等的店了,得有点策略地走,于是有了next数组。这个数组的名字起的其实还是有点形象的,代表比到某一位不匹配了下一个比哪一位,像一个领导手册似的。 为什么要有next数组以及对他的直观了解next数组就是一个模式串的行为领导手册。当红色的C和A不匹配时,黄色的AB和AB曾经比拟过了,而模式串p中橙色和黄色局部是相等的,那挺好,黄色AB都跟文本串比过了,橙色的AB就能够省点事,这样间接比拟绿色箭头处就能够了。 那咱们怎么决定从哪一位开始比拟呢。这里就引入了前后缀的问题。要找到模式串p中不匹配地位A后面的子串"ABCAB"中雷同的前缀和后缀,这个雷同的局部就是能够偷懒不必比的局部了。那如果雷同的前缀和后缀有很多取哪个呢?那必定取最长的呀,这样就能偷更多懒,下一轮不必比的就更多了。 所以,为了晓得如何偷懒,咱们定义了一个没有名字的表,这个表通知咱们以某个地位的字符结尾的字符串,最长的雷同前后缀的长度是多少。 看下图了解最长雷同前后缀。 那为啥要晓得长度呢?长度其实就是下一次的下标。以下图为例,A后面以B为结尾的字符串ABCAB的最长雷同前后缀的长度为2,那下一轮比拟的就是2地位的C,后面的不必比了。那么这个时候next数组就出场了,他就和这个不出名的表有关系,但又不齐全一样,但实质上next都是由这张表变来的。 理论实现时依据须要可能把这个表的所有元素-1,也可能所有元素右移之类的(右移的话AC不匹配时就不必看前一位的next了,间接看本人地位的就行,因为他人的右移到本人的地盘了)。我也不晓得为啥就要-1之类的,除了让KMP更难了解以外,如同啥用没有。 本文就不进行这些花里胡哨的操作了。 精髓!next数组的代码实现 图预警到当初大部分人预计都能手写一个模式串的next的数组了,毕竟肉眼看最长的雷同前后缀也还行。然而看到代码实现的时候还是会懵的不行,这是因为真的太奇妙了,其中甚至用到了递归的思路。为了好了解,我就间接将前文图中推导的表作为next数组。 递归思路如何画图了解1.定义两个指针,cur是指向以后地位的,代表要求以cur地位字符结尾的最长雷同前后缀,recur有两个含意,可能是上一轮循环之后传过来的(代表以前一个字符结尾的最长雷同前后缀),也可能是递归的时候递归到的,反正也不必管这么多,反正recur在赋值给next时候就会指向最长雷同前缀的下一位。 2.画图了解递归的思路 如图显示的是进入某一轮循环,cur=17,recur=8时递归代码的执行过程。 next[cur-1]= next[16] = 8代表红色的两个框雷同(时刻牢记next的含意) 如果这个时候s[cur] == s[recur]阐明next[cur] = recur+1=9,示意最长雷同前后缀长度为9。如果这个时候s[cur] != s[recur]阐明next[cur] <= recur,这里就要用到递归了。红色框中字符相等,咱们求的最长雷同后缀是以cur结尾的那一撮,那就能够转化为求recur-1结尾的最长雷同前后缀,即next[recur-1]。依据next[recur-1]=next[7]的值3能够晓得右边两个绿框雷同,所以图中四个绿框就都雷同了。然而咱要的其实还是左右边上的两个绿框相等。接下来就还是循环第一步,recur指针移到新的红色地位。如果这时next[cur] == next[recur]的话,next[cur] = recur+1=4。如果不相等,那recur还要递归挪动,直到recur = 0时不能再挪动或者遇到相等的状况。void getNext(int* next,string& s){ int recur = 0; next[0] = recur; for(int cur = 1;cur < s.size();cur++){ while(recur > 0 && s[cur] != s[recur]){ recur = next[recur-1];//递归局部 } if(s[cur] == s[recur]){//recur=0或者相等的时候 recur++; } next[cur] = recur; } }计算next时初始化值如何确定另外,代码的初始条件也不能看着答案想当然。next[0]=0是因为只有s[0]一个元素时,不存在最长雷同前后缀。j的初始化有两种方法能够思考,一种是察看for循环中的next[i]=j,所以next[0]=0时j就是0。也能够在计算next[1]的时候看看,须要j是几能力失去正确答案。 ...

November 12, 2021 · 1 min · jiezi

关于算法:小白完全背包

在了解齐全背包问题问题之前,必须先深刻理解01背包的思路。参考链接:https://blog.csdn.net/qq_4247... 齐全背包的递推关系乍一看与01背包大差不差,然而如果不能深刻了解细节,那么在面对口试和面试中的各种齐全背包变形问题时,就会大刀阔斧。 很多人都不会做动静布局问题,我认为所谓触类旁通,就是要形神兼备,不仅仅是记住他的样子,还要深刻思考这个样子的来历,这才是动静布局的真正外延,本人悟明确了,能力在遇到新题的时候应答自若。 齐全背包问题形容与举例最经典的齐全背包问题形容是,有一个限重W的背包,有好几种分量为weight,价值为value的物品供你筛选,要在不超过背包限重的前提下,奇妙地抉择物品(每个物品没有数量限度),使得背包外面的物品价值最大。 题目举例:W = 4 weight=[1,3,4] value=[15,20,30]举个例子比照01背包和齐全背包在递推关系上的不同咱们间接用一维dp数组去了解两种背包问题的差别,初始化是全0开始,看看第一轮迭代的时候有啥差别。 在01背包问题中,当只有weight[0]=1,value[0]=15的物品能够抉择时,dp的第一次迭代是这样的。只有限度>=1,因为物品只有一件,所以最大价值都是15。这就是为什么01背包中咱们得倒着遍历。 dp[j] = max(dp[j],dp[j-weight[i]]+value[i]) 当限重为4时 dp[4] = max(dp[4],dp[4-weight[0]]+value[0])=max(dp[4],dp[3]+15)=15;倒着算的话dp[3]还没算是0呢,天然就能失去15的正确后果。 而在齐全背包问题中,weight[0]=1,value[0]=15的物品能够抉择屡次,dp的第一次迭代是这样的。限重1,2,3,4别离是weight[0]的1234倍,天然能够失去15,30,45,60的价值。那这个时候遍历就得正着来了。 dp[j] = max(dp[j],dp[j-weight[i]]+value[i]) 当限重为4时 dp[4] = max(dp[4],dp[4-weight[0]]+value[0])=max(dp[4],dp[3]+15)=60;正着算的话dp[3]之前曾经算完了是45,天然就能失去60的正确后果。 遍历形式的不同就解决了物品有一个还是多个的问题,还是很神奇的。其实起因次要是如果正着遍历,前面dp[j]用到了后面算过的值,那就意味着这个物品不论曾经被拿过了还是没拿过,你这次是新拿的。就像上文dp[3] = 45,代表物品拿过了3次,你这次还能再拿。 如果还是不够了解,能够从二维dp数组的代码解说局部一探到底。 二维dp求解齐全背包以下代码的精髓所在是二维dp数组递推关系的区别。 01背包的递推关系是 dp[i][j] = max(dp[i][j],dp[i-1][j-weight[i]]+value[i]); 齐全背包的递推关系是 dp[i][j] = max(dp[i][j],dp[i][j-weight[i]]+value[i]); 这里max括号的第二项,一个i,一个i-1就是了解重点所在 i-1代表挑了这件物品,就只有i-1件能够挑了i代表挑了这件物品,还是有i件能够挑,只不过限重变小了而已#include <iostream>#include <vector>using namespace std;int main(){ int W = 4;//限重 int weight[3] = {1,3,4};//物品分量 int value[3] = {15,20,30};//物品价值 vector<vector<int>> dp(3,vector<int>(W+1,0)); //3*5的dp //初始化 限重为0价值全0 //递推 for(int i = 0;i < 3;i++){ for(int j = 0;j <= W;j++){ if(i != 0) dp[i][j] = dp[i-1][j];//不挑该物品 至多能实现后面0-(i-1)件物品的最大价值 if(j >= weight[i]) //挑该物品 dp[i][j] = max(dp[i][j],dp[i][j-weight[i]]+value[i]); } } //打印下dp for(int i = 0; i < 3;i++){ for(int j = 0;j <=4;j++){ cout << dp[i][j] << " "; } cout << endl; } cout << dp[2][4];//最终后果 return 0;}手推一下dp数组的迭代过程加深了解 ...

November 12, 2021 · 1 min · jiezi

关于算法:小白01背包-物品一件一件增加背包一点一点变大

01背包问题的材料看下来,我总结了一句话,物品一件一件减少,背包一点一点变大。 01背包问题形容最根本的01背包问题形容是,有一个限重W的背包,有好几件分量为weight,价值为value的物品供你筛选,要在不超过背包限重的前提下,奇妙地抉择物品,使得背包外面的物品价值最大。面试口试遇到的是01背包问题的应用题,重点在于把原始问题转化为背包问题,就跟做数学题套公式有点像,把题目中的已知条件跟背包限重W,以及物品的分量weight和价值value对应起来,问题就会迎刃而解。动归三部曲因为01背包问题过于常见,递推公式很容易就能背下来,有人写dp时对初始化也比拟佛系,思考深度不够。然而深刻理解01背包问题的推导和初始化,对了解动静布局的实质意义重大。 题目举例:W = 4 weight=[1,3,4] value=[15,20,30]1.定义dp数组这时须要把物品一件一件减少,背包一点一点变大这句话放在心里。 一共有三件物品能够选,所谓物品一件一件减少就是这样,第一次没物品能够挑,第二次1件物品能够挑,第三次2件物品能够挑... 每步都多出了一件物品供本人筛选,那本人就能够决定,放进去还是不放了。限重为4,所谓背包一点一点变大就是这样,4的限重太大,先从限重为0开始算起,直到达到4为止。最终dp是一个3*5的数组,dp[i][j]的含意就是有0-i件物品供你筛选,放入容量为j的背包能取得的最大价值。 (对于动静布局问题的剖析,要始终牢记dp的含意) 那最初的后果就是有0-2件物品供你筛选,放入容量为4的背包能取得的最大价值,天然是数组右下角那个格子dp[2][4]了。 2.递推公式递推公式怎么去想呢?外围就是每次多了件物品能够挑,要辨别这个物品到底要不要放进背包。 这个物品要dp[i][j] = dp[i-1][j] 比如说0-2件物品供你挑,限重j,那你决定不要第2件物品,那好,背包限重没变,这个时候背包的价值就是0-1件物品供你挑,限重j时计算的最大价值dpi-1(也能够了解成,这个物品要是不拿,就跟没他没什么区别,所以还是之前没他时候,即i-1时的最大价值)。 这个物品不要dp[i][j] = dp[i-1][j-weight[i]]+value[i] 比如说0-2件物品供你挑,限重j,那你决定要第2件物品,那好,这个时候背包装的价值必定先把这件物品的价值给算上,那剩下的价值呢,就给0-1件物品去实现吧,只不过因为我放了第2件物品,背包的限重变少了weight[i]。 取最大价值 可挑可不挑,那就看看哪个价值大就选哪个作为最大价值。递推的程序就是下图了 3. 初始化要初始化的中央就是递推不到的地位,而后算别的dp[i][j]的时候须要用到的值。图中就是第0列和第0行。 第0列 限重0,无论多少物品那都没的放,价值必定为0,所以第0列全0。第0行 有第0件物品能够挑,那如果限重>=这个物品,就代表物品能够放进去,价值就是这个物品的值。 C++代码实现 含具体正文#include <iostream>#include <vector>using namespace std;int main(){ int W = 4;//限重 int weight[3] = {1,3,4};//物品分量 int value[3] = {15,20,30};//物品价值 vector<vector<int>> dp(3,vector<int>(W+1,0)); //3*5的dp //初始化 for(int i = 0;i < 3;i++){ dp[i][0] = 0; } for(int j = 1;j <= W;j++){ if(j >= weight[0]) dp[0][j] = value[0]; } //递推 for(int i = 1;i < 3;i++){ for(int j = 1;j <= 4;j++){ dp[i][j] = dp[i-1][j];//不拿这件物品 if(j >= weight[i])//下标不越界 或者说之后限重>=物品能力拿物品 //拿这件物品和不拿这件物品 找最大 dp[i][j] = max(dp[i-1][j],dp[i-1][j-weight[i]]+value[i]); } } //打印下dp for(int i = 0; i < 3;i++){ for(int j = 0;j <=4;j++){ cout << dp[i][j] << " "; } cout << endl; } cout << dp[2][4];//最终后果 return 0;}手推一次dp数组加深了解 为优化打基础手推时,发现能够先把上一行的数据整体挪动下来,当限重>=该物品分量时再思考如果筛选这个物品价值是多少,选更大价值即可(要是限重小了那这个物品必定不能放,只能从上一行移下来了)。 ...

November 12, 2021 · 1 min · jiezi

关于算法:利用二分法求单调函数解python

一个简略的python二分法求解函数 # 二分法from typing import Callabledef bisection(function:Callable[[float],float],a:float,b:float)->float: # Callable示意回调函数 # 找出令函数在[a,b]区间内是0的值 start:float=a end:float=b if function(a)==0: return a elif function(b)==0: return b elif( function(a)*function(b)>0 ): raise ValueError("找不到解") else: mid:float=start+(end-start)/2.0 while abs(start-mid)>10**-7: #这个循环就是一直二分的过程。最细精度管制在10的-7次 if function(mid)==0: return mid elif function(mid)*function(start)<0: end=mid else: start=mid mid=start+(end-start)/2.0 return middef f(x:float)->float: return x**3-2*x-5if __name__=="__main__": print(bisection(f,1,1000)) import doctest doctest.testmod()

November 11, 2021 · 1 min · jiezi

关于算法:万物智连的未来分几步走

工信部公开材料显示,我国已累计建设5G基站91.6万座,占寰球的70%,5G连接数超过3.65亿,占寰球的80%。以后我国5G倒退已走在世界前列,5G利用倒退迈入“无人区”,须要翻新和摸索。 工信部等十部门联结公布的《5G利用“扬帆”行动计划(2021-2023年)》提出指标:将来三年5G行业利用是倒退重点,5G行业赋能要实现5G在大型工业企业渗透率达到35%;重点行业5G示范利用标杆数达到100个;5G物联网终端用户数年均增长率达到200%。 为实现5G行业利用的规模化落地,实现5G从生产边缘环境到生产外围环节的浸透,3GPP R16规范商用部署火烧眉毛。展锐R15 V510平台反对SA和NSA网络,可实现eMBB场景在智能手机和数传物联市场的疾速落地。展锐5G NB-IoT 平台V8811将NB-IoT接入5G核心网,引领5G mMTC场景利用的倒退。随着展锐5G R16 Ready平台V516的推出,展锐成为寰球首家反对5G eMBB+uRLLC+mMTC全场景的芯片平台供应商,展锐的5G产品组合能够帮忙运营商和垂直行业通过5G一张网即可实现eMBB+uRLLC+mMTC三大利用场景,助力产业搭档实现5G行业利用的疾速落地及规模复制。 【第一阶段:探索期】 5G赋能万物互联分为三个阶段。第一阶段行业探索期,次要利用5G大带宽个性,实现5G与高清视频利用交融。超高清视频利用可分为上行和上行两大类,5G上行利用次要实现云端超高清视频内容在智能手机,高清数字电视,VR等设施上的播放与显示。随着5G能力的晋升,立体视频继续疾速向高分辨率,高亮度和广色域,以及高帧率方向演进,同时视频体验将从单维逐渐扩大到多维,5G高新视频(云游戏,VR视频、互动视频和沉迷式视频)成为将来上行超高清视频次要的翻新方向。5G上行利用次要随同AI技术的倒退,从传统的监督行业,向字符识别、人脸识别、行为剖析、物体剖析等智能化方向倒退,对视频流的清晰度以及晦涩度提出了更高的要求。 在5G倒退的第一阶段,无论是上行还是上行,R15 eMBB曾经能够满足这些超高清视频利用需要。上行终端状态次要是5G智能手机和CPE,展锐保持价值发明和技术引领,在2020年联结运营商寰球首发5G云手机及反对网络切片的5G CPE。上行终端状态次要是5G DTU和DVR,展锐5G R15解决方案在智慧物流,采矿等畛域曾经实现了无人巡检 、实时监控、实时调度等场景利用。 【第二阶段:高速发展期】 第二阶段是行业高速发展期,5G全面赋能产业数字化须要深刻到行业现场、到工业产线、到企业园区。R16为5G+物联网能力加强版本,相较5G R15规范版本,做了很多加强。在5G扬帆起航的初期,近程管制和配电自动化两大行业利用无望率先冲破,实现商用落地及规模化复制。 近程管制是5G+工业互联网服务于生产外围环节中的典型场景,也是工业生产中保障人员平安、晋升生产效力、实现生产单元帮助的必要伎俩。以后工业上大多数近程管制还是基于有线网络,尽管有线网络稳固,但也限度了生产的灵活性,同时也在肯定水平上限度了生产过程的管制范畴。在工业生产中某些低温、低空、环境指标差等不合适人工作业的场合,比方在某些厂区进行喷漆作业,须要近程管制机器人将人从有毒无害环境中解放出来。还有一些工作人工无奈实现,比方工厂内大件货物或港口集装箱的装卸,都须要近程管制机械来实现。在近程管制场景中,一方面能够利用eMBB的高速率满足高清视频回传的要求,另一方面能够应用uRLLC+IIoT满足近程管制对低时延和高牢靠的要求。展锐5G R16 Ready平台V516反对eMBB+uRLLC+IIoT,助力搭建园区5G虚构专网,构建5G LAN产线内网,提供低时延高牢靠无线网络连贯,全方位晋升自动化生产能力,打造真正的5G全连贯工厂。 另一个典型场景是5G+智能电网中的配电自动化。通过5G低时延、高牢靠、高精度授时个性保障差动爱护业务信号的传输,从而实现配电网络的差动爱护管制。差动爱护管制能够通过继电保护自动装置检测配电线路或设施状态信息,疾速实现配电网线路区段或配网设施的故障判断及精确定位,疾速隔离配网线路故障区段或故障设施,并对非故障区域复原供电。展锐在2020年基于5G R15现网环境下,与合作伙伴验证了微秒级的高精度授时性能,将供电复原工夫从分钟级缩短至秒级。展锐5G R16 Ready平台V516将时钟同步工夫从微秒级进一步晋升到纳秒级,无望进一步晋升故障隔离工夫,大幅升高供电复原工夫, 实现停电零感知。 主动驾驶,静止管制还有近程医疗等行业利用目前仍处于探索期,随着V2X、TSN、eURLLC等5G技术的进一步倒退,无望在将来逐渐成为事实。 【第三阶段:海量物联网暴发期】 第三个阶段是海量物联网暴发期间,产业中有观点认为mMTC会先于uRLLC实现商用。实际上早在2020年7月,国际电信联盟(ITU)就曾经发表认可NB-IoT可满足IMT 2020 5G技术标准中mMTC的指标要求。所以NB-IoT曾经升级为5G规范用于实现mMTC海量物联场景。展锐在2020年公布了业界首款5G R16 NB-IoT芯片平台V8811,能够与 5G NR 网络共存并接入 5G 核心网。让NB-IoT终端产品从传统的动态利用向动静利用降级,进而将最终将低功耗窄带物联网产品带入5G新纪元,更好的满足mMTC场景需要。在3GPP R17定义Redcap轻量版5G探讨中,展锐踊跃推动20MHz带宽能力,最终获3GPP投票通过,将来将进一步推动5G从网关级向管制末梢浸透,实现海量物联网利用与连贯。 参考文献: [1]工业和信息化部.5G利用“扬帆”行动计划(2021-2023年)[R/OL].(2021-07-05) [2]工业互联网产业联盟. 5G与工业互联网交融利用倒退白皮书[R/OL].(2019-10-31) [3]国家广播电视总局. 5G高新视频-VR视频技术白皮书(2020)[R/OL].(2020-09-07) [4]国家广播电视总局. 5G高新视频-沉迷式视频技术白皮书(2020)[R/OL].(2020-09-07) [5]国家广播电视总局. 5G高新视频-互动视频技术白皮书(2020)[R/OL].(2020-09-07) [6]国家广播电视总局. 5G高新视频-云游戏技术白皮书(2020)[R/OL].(2020-09-07)

November 11, 2021 · 1 min · jiezi

关于算法:全真互联时代腾讯发力数实融合四大引擎

“后疫情时代”,数字经济正在成为推动全球化倒退的新引擎。腾讯正踊跃拥抱产业互联网,挖掘数字化新动能,立足劣势能力,继续助力各行各业,发力用户、技术、平安和生态四大引擎,减速打造线上线下一体化、数字技术与真实世界交融的“全真互联”。以后,数字经济曾经成为“后疫情时代”全球化倒退的新引擎,我国也已将“迎接数字时代”晋升至国家策略层面。刚刚过来的2021腾讯数字生态大会上,腾讯就邀请了业内泛滥业余大咖,独特探讨数实交融新趋势与新机遇,同时也带来了一系列“减速数实交融”的重磅计划,为地区各畛域数字化建设注入强劲能源。 发力数实交融 腾讯主推“四大引擎”随着数字经济的不断深入倒退,社会各行业“数实交融”已成为大趋势。据中国信通院数据显示,2019年我国数字经济已达35.8万亿,占GPD的36.2%;2020年则达到39.2万亿元,占GDP的38.6%,同比增长9.7%。接下来,随着相干利好政策的一直出台,预计我国数字经济也将继续向着良好的势头倒退。 本次大会上,腾讯公司高级执行副总裁、云与智慧产业事业群总裁汤道生也别离从社会公共服务、智能制作和消费市场这三个方面,就数字技术和产业互联网的倒退对社会和经济倒退的强助力做了主题分享。他认为,“对实体产业的价值助力是掂量产业互联网倒退的重要规范”。 近年来,腾讯正踊跃拥抱产业互联网,已在工业、农业、政务、医疗、教育、出行、金融、批发等30多个行业,与9000家合作伙伴,打造了超过400个行业解决方案。接下来,为继续一直助力各行各业,挖掘数字化新动能,腾讯将立足劣势能力,打造用户、技术、平安和生态四大引擎: 一、打造用户引擎,将用户了解引入产业研发、生产、营销、服务,助力企业服务于人,激活增长;二、打造技术引擎,将前沿数字技术与产业落地交融,为产业降级提供更好用、易用的工具;三、打造平安引擎,以云原生、零信赖为外围,塑造产业互联网时代的平安底座,让有数据的中央就有平安守护;四、打造生态引擎,通过数字化技术和资源的普惠凋谢,让“数字化营养”滋润产业全生态链条。 数实交融技术底座:“全真互联”以后,生产互联网和产业互联网的蓬勃发展,让线上线下一体化、数字技术与真实世界交融的“全真互联”时代减速到来。会上,腾讯公司副总裁、云与智慧产业事业群COO兼腾讯云总裁邱跃鹏就对“全真互联”时代须要关注的三大技术趋势做了分享: 一、算力将延长到网络的每一个角落,变得无处不在;二、云原生的重要性会进一步凸显,开发者和企业须要更懂得借助云来实现高效数字化转型;三、超高清、超低延时的网络传输是确保用户沉迷式体验的根底。 目前,腾讯云正在海量算力、实时剖析、极致传输三个方向上,一直夯实全真互联的技术根底。其中,芯片是是产业互联网最外围的基础设施。据理解,腾讯已面向AI计算、视频解决、高性能网络这三个存在强烈需要的场景,研发推出了AI推理芯片紫霄、视频转码芯片桑田、智能网卡芯片玄灵。 作为以后数实交融的要害因素,平安议题经常被人们所提起。对此,腾讯副总裁、腾讯平安总裁丁珂也从平安厂商与客户共建、企业业务倒退与平安共建、平安生态共建三个维度,为咱们带来了业余解读。他示意,平安是数字经济衰弱可继续倒退的根底保障,也是所有企业及政府的“必答题”,而腾讯正在依附本身积攒的技术、人才和行业平安建设教训,来实现平安共建,为经济可继续倒退和人们的美好生活提供松软保障。 摸索数实交融:腾讯勇当数字经济倒退“排头兵”为进一步推动数字经济的倒退,基于云计算、大数据、AI等技术的科技企业正在勇当“数字技术激发产业新能效”的排头兵。近年来,腾讯也在积极探索数实交融新门路,目前腾讯云已在互联网、金融、教育、政务等方面获得了不少业务停顿。 相干数据显示,腾讯云已服务了国内超过90%的音视频公司、超过80%的头部游戏公司以及绝大多数电商平台;客户笼罩银行、保险、证券、生产金融、产业金融等各细分畛域;助力超过30个部委、20个省、500个市县数字化转型;助力超十万所大学建设智慧校园。 作为数实交融的典型场景,智慧交通出行及智慧批发畛域也是产业互联网的重要落地畛域。会上,腾讯副总裁、腾讯智慧交通和出行总裁及腾讯副总裁、腾讯智慧批发产研总裁别离对相干议题作了分享,并带来一系列推动行业模型转变、助力城市的高效治理的计划布局及落地成绩。 特地是在实体经济方面,数字科技更是当下这个时代助力企业增长、发明更高价值的新引擎。对此议题,腾讯副总裁、腾讯智慧工业和服务业总裁李强也别离从组织高效、生产智能、流程优化和供应链协同四个方面来谈腾讯反对实体企业数字化。他示意,“将实体经济与数字经济减速实交融,不仅是新的经济增长点,也是传统产业数字化转型的支点”。 此外,腾讯微信事业群副总裁、企业微信负责人黄铁鸣也带来了企业微信连贯在农业和政务场景方面的分享。他示意,连贯,能带来信赖、翻新和倒退。连贯意味着洞察市场需求,捕捉翻新灵感,连贯也在助力社会的倒退。 《数字化转型指数报告2021》:全方位出现数实交融新特色为减速实现产业互联网数实交融,本次大会上,腾讯研究院还联手腾讯云重磅公布了《数字化转型指数报告2021》。 该报告显示,在数实交融已成为国家中长期重大策略的前提下,全国数字化转型指数继续走高,在2021年一季度达到307.26,同比增长207.4%,全国用云量(云计算指数)和赋智量(AI指数)持续增长,年增长量别离达57%和93%。 另外,广东、上海、北京是全国数字化转型指数排在三甲的省市。河南、湖北、湖南指数规模和增速均位列全国前十,成为“双强”省份,其中,2021年第一季度,湖北因为数字化助力抗疫复原的突出成绩,首次跻身全国前十。 该报告表明,数字原生行业的数字化规模显著当先于传统行业,其中电商、金融、文创三大细分行业规模最大、最具典型性,成为推动核心城市产业数字化倒退的中坚力量。但随同新型基础设施减速遍及,传统行业的数字化转型也出现高速增长态势。在过来一年增速排名前十的行业中,广电、医疗、制作、教育、批发和能源等传统行业占据6席,其中广电行业规模同比增长近300%位居各行业之首。 深度交融数字技术:全新办会模式及参会体验作为一场年度科技大展,本次”2021腾讯数字生态大会上就深度交融了腾讯的相干数字技术,让观众参会的同时,也能更间接感触数字技术带来的全新体验。 本次大会开设了40场行业及产品专场,涵盖了金融、智慧教育、智慧医疗、智慧批发、智慧交通、智能制作等诸多腾讯明星业务,在这里各行业的合作伙伴能够独特分享行业新机遇,发展深刻单干。 比方为大会定制开发在线数字化签约的工具“腾讯电子签”,包含腾讯云外围单干签约及碳中和、智慧地产、智能终端、智能传媒专场签约,都是通过腾讯电子签实现,签约单方在iPad上签名,电子合同主动存档,无需签订纸质文件。 因为其端到端60-80ms的低时延,因而线上观众也能通过云渲染计划打造的沉迷式云展厅,随时随地通过手机、微信小程序等轻量级终端享受高清高帧率体验,近程来感触现场展区的魅力。 此外,此次大会还在腾讯会议网络研讨会(webniar)实现办会,用户通过线上腾讯会议网络研讨会性能,就能够实时观看生态大会的40个论坛。而腾讯云AI数智人、腾讯同传、腾讯云企点的能力植入,也让腾讯仅用一场大会,就能间接展现产业数字化带来的全新高效工作与便当生存。 写在最初:在AI、云计算等数字技术的一直演变下,社会经济型态正减速重构,咱们的社会也正疾速步入数字经济时代。而在数实交融的浪潮中,腾讯正在携手各行业乘风破浪一直摸索,投入到社会经济腾飞倒退中,为我国打造“数字强国”提供助力!

November 11, 2021 · 1 min · jiezi

关于算法:AI-收藏夹-Vol001当你的语音助手不再温顺

人工智能是一门交融了计算机科学、图形学、生物学、语言学等学科的前沿科学。随着电子硬件的倒退和算力的晋升,人工智能的技术实践逐步走向落地,各种利用和构想层出不穷,丰盛了其外延和内涵。 「AI 收藏夹」将会与大家分享一些 AI 畛域实用和乏味的文章和工具,与大家一起见证技术的翻新与改革。 文章0 1 用卷积神经网络(CNNs)鉴定油画 2017 年 11 月 15 日,一幅耶稣的肖像在纽约以 4.503 亿美元的价格成交,这是迄今为止最低廉的易手画作。然而,很多专家对这幅画的真伪提出质疑,指出画作通过修复,或非自己所做。 确定一件艺术品是否是真迹,须要对艺术家的格调和技巧进行精微的判断,这项工作很适宜交给卷积神经网络(CNNs)。上 图就是将神经网络应用于伦勃朗的画中。寒色局部示意,机器学习画师作品后判断该局部画作更有可能是真迹[1]。  在医学方面,微小的组织学样本全幻灯片图像可能有数十亿像素大小,其中的细节信息同样十分丰盛。科学家们正在尝试应用卷积神经网络自动化剖析病理图像,捕捉肿瘤细胞的表征。 0 2 在将来 还会有「婚礼摄像师」这个职业吗? 这篇文章[2]提出了一个构想:咱们能够用 AI 主动解决视频剪辑。 让咱们设想一下这个场景:婚礼上,亲朋好友们用手机录下现场的精彩霎时,他们在同一个 App 里进行实时合作,AI 会主动依据光线、机位、声音成果检测每一段视频的品质,并主动剪辑其中精彩的段落。当新人接吻时,AI 还会辨认到须要特写的场景,给手机一个反馈,触发手机拉近特写。这种多机位拍摄、多人合作的摄影模式,让摄影成为一种社交体验。你会期待这种「摄影社交」吗? 0 3 李逵变李鬼? AI 扭转视频制作范式 设想一下,你输出几行文字,一个明星就会在几秒钟内说出这些话。 计算机图形学家 Maneesh Agrawala 创立了一个视频编辑软件,只有有短缺的原始视频,他就能让任何一个人说出他们没有说过的话。这些视频十分真切,被称为「深度伪造」(Deepfake)。有了这项技术,电视和电影能够防止低廉的重拍,声带受损的人能够用这项技术复原他们天然的声音[3]……不过,对于「深度伪造」的伦理边界在哪里?这也是值得咱们思考的问题。 0 4 用 AI 预测事变热点 通过剖析过来四年的路况数据,AI 剖析并预测出多个事变高风险区域(如右侧中部的圆点所示),而实际上这些中央暂未呈现过事变。随后几年,这些中央真的出车祸了。 这篇论文名为《基于卫星图像和 GPS 轨迹的高分辨率交通事故危险地图推断》[4]。作者应用 AI 剖析大量的卫星地图、 GPS 轨迹、路线地图和历史事变,生成了一张高分辨率的事变危险地图。 0 5 Feminist 机器人挑战咱们的性别偏见 你有没有留神到,语音助手的声音默认都是女声?面对羞辱,语音助手能够出击和显得「不温柔」吗? 在这篇文章[5]中,作者做了一个儿童试验:女性语音助手将会出击那些含有性别歧视的语言。人机交互或者有可能纠正性别偏见、影响人的行为,而这个试验自身也正代表了一种立场。 工具0 1 DeepFaceLive 实时换脸 ...

November 11, 2021 · 1 min · jiezi

关于算法:COMP3121

COMP3121Assignment 4COMP3121/9101 21T3Released November 3, due November 17In this assignment we apply maximum flow. There are five problems, for a total of 100marks.Your solutions must be typed, machine readable PDF files. All submissions will bechecked for plagiarism!For each question requiring you to design an algorithm, you must justify the correct-ness of your algorithm. If a time bound is specified in the question, you also must arguethat your algorithm meets this time bound.Partial credit will be awarded for progress towards a solution. ...

November 11, 2021 · 5 min · jiezi

关于算法:第四范式OpenMLDB在金融风控数据库重计算优化实践

近日,在DataFunSummit:智能金融在线峰会上,第四范式平台架构师陈迪豪以《OpenMLDB风控数据库计算优化》为主题,重点介绍了第四范式开源机器学习数据库OpenMLDB在金融畛域的利用,以及底层时序特色的解决、窗口的计算优化细节等,让用户能够了解风控数据库的技术架构,理解底层基于窗口的计算性能优化点,以及性能优化的实现细节。 一.风控场景特色设计基于机器学习的智能风控数据库,逐步取代了人工审核和专家规定,成为准确性更高、更牢靠的风控系统,前面会介绍一下风控场景下智能风控平台的设计以及它的特色设计。 首先是风控系统的演变,大家曾经理解了,从最早的人工审核,获得了肯定的成果,但老本较高,效率较低。进入21世纪,行业内开始利用计算机自动化能力与专家规定相结合的形式,解决效率低、自动化较差的问题,然而它同时呈现容易误杀,用户体验较差,无奈用于事中拦挡,准确率低的问题。近几年,各大金融机构和互联网金融企业的风控系统开始采纳基于机器学习的形式来实现。 首先利用从海量的数据中训练失去机器学习模型,比如说传统的LR模型,还有更简单的DNN都能够实现更高准确率,还能够依据不同的利用场景,实现千人千面的模型预测。机器学习的特点就是隐蔽性更强,准确性更高,迭代速度更快,也逐步成为智能风控系统必不可少的技术撑持。 从成果来看,在某国有银行的线上非自己交易欺诈防控场景中,OpenMLDB上线当前在召回率0.5左右的状况下,预测准确率晋升了316%;在事中交易欺诈检测场景中,相比应用专家规定的事中反欺诈检测,误报率在召回54%左右的时候,整体误报率降落了33%。 智能风控系统是联合过来的一些专家规定和最新的机器学习模型来实现的一个平台。蓝色局部是银行外部已有的业务零碎,有黑白名单,有一些内部数据如时序数据等都能够通过数仓导到咱们决策平台,它不会全副依赖模型,而是联合专家规定,由规定引擎和模型预估服务来独特合作,做出最终的决策。 模型局部是传统的机器学习流程,比如说离线数据局部,实现数据导入和数据预处理、特色抽取、模型训练以及后续的模型上线以及模型自学习、模型更新等等性能。 这是一套残缺的智能风控系统,咱们明天介绍的是OpenMLDB在这套零碎里最底层的离线数据管理以及在线的特色查问服务。 风控场景下简单的特色工程咱们看一下风控场景它的特色有哪些特点,首先是用户的交易信息以及用户的属性是十分重要的。时序特色在风控场景外面也是特地重要的,用户在不同的窗口,前一天、前七天、前一个月、前三个月,这些窗口都蕴含了很重要的信息特色,咱们对于不同的数据,因为它的交易次数,交易的金额在不同的历史窗口外面,也是须要计算出不同的特色过去。 还有就是交易的金额最大值和最小值,交易的地点信息等,都蕴含一些间断行为特色。所以,咱们在构建一个风控场景下的机器学习模型时,特色设计是比较复杂的,须要思考特色时序相干的计算,最大的难点在于这些特色由科学家设计进去当前,须要在在线零碎从新实现。 离线的实现传统做法是用OLAP或者MPP零碎,Spark、Flink等自身就反对SQL规范的滑动窗口。但在线是很难实现的,每一个离线的特色都须要翻译到在线。如果咱们的建模计划批改了或者新增一些特色,在线也须要做新增特色的开发。新增在线特色开发与离线基于MPP零碎是两套计算逻辑和执行引擎,表白优化也不一样,须要大量的人工做离线在线的特色一致性校验。 OpenMLDB为特色计算提供更优的撑持OpenMLDB能够解决这个问题,它针对AI场景做了特色优化,既实现了离线存储特色计算的优化,还实现了在线业务在毫秒级别的实时查问。 首先,OpenMLDB是针对AI场景的特色计算引擎,能够面向机器学习利用提供正确高效的数据供应,无论是离线数据还是在线数据,底层都有一致性同步的,这个与后面提到的HTAP有点相似。然而咱们的在线数据是一个高性能的内存时序存取接口,能够毫秒级别实现时序数据供应。要实现在线离线特色计算一致性和存储一致性,这是由对立的执行引擎来实现,由对立的基于(LLVM JIT)实现的SQL优化器,离线和在线应用雷同的执行引擎,能力把离线在线的特色算进去,而不须要人工校验翻译,同时也反对了机器学习场景的非凡批表操作,以及非凡的特色抽取函数等。 其次,OpenMLDB也是高性能的OLTP和MPP执行引擎,反对高性能在线时序数据的读写和复原。它的读写性能十分高,而且是针对时序数据做优化,这是目前业界无论是OLTP还是TSDB这些时序数据库都不能达到毫秒级别的性能。在硬件的优化与反对上,OpenMLDB可在Memory和PMEM存储介质上应用,PMEM是英特尔提供的全新存储介质,它的老本会比内存更低,而且是一种可长久化的全新存储介质,咱们针对PMEM也做了优化,数据恢复速度是它原来的十倍以上。此外,OpenMLDB离线批处理性能比业界支流MPP零碎晋升6倍以上。大家都晓得像Spark、Presto等分布式系统,自身的性能优化是十分好的,有很好的执行引擎,然而它没有针对AI场景做非凡优化。下图是咱们理论场景验证的性能图,纵坐标是运行工夫,OpenMLDB比咱们测试的最新版Spark性能晋升十倍以上。 二.并行计算优化OpenMLDB是如何为这些风控特色做计算优化的呢?首先从并行计算优化开始介绍。大家应用OpenMLDB进行大规模特色抽取的时候,相比业界支流的MPP零碎有数倍的性能晋升,得益于底层计算优化实现。 在大规模数据处理系统里,在2000年开始呈现了Hadoop,2010年当前开始风行Spark、Presto、Flink等,能够应用内存做Shuffle防止落盘,其计算性能相比Hadoop又数倍甚至数十倍性能晋升。现在,第四范式OpenMLDB在一些大规模数据处理上,会比Spark和Presto性能晋升更多,以下会具体介绍底层的优化细节。 OpenMLDB的右边是一些外围零碎,反对数据引入,它的外层用户有JDBC或者Pytho SDK等编程接口,底层是自研实现的SQL Parser,也蕴含自定义的一些Optimizer,后端实现了基于LLVM的执行引擎,它能够针对不同的硬件做优化,比如说X86、ARM架构等,当前也能够基于LLVM PTX后端实现GPU硬件加速。 底层包含两个执行引擎,一个是Realtime executor,这个是跟传统的OLTP零碎一样,能够提供超高性能的时序特色读写性能。第二局部是Massive parallel executor,和传统的MPP零碎相似,反对OLAP的大数据处理场景。底层是对立的存储引擎,应用OpenMLDB来做特色抽取,还反对导出开源的机器学习数据格式,比如说Tensorflow、LightGBM都能够间接应用OpenMLDB的数据做模型训练。因为离线在线一致性等个性,每个特色不须要在线做额定的翻译开发,能够间接上线了。 多窗口并行优化为什么OpenMLDB的批处理模式比最新的Spark 3.1还能快数倍?第一个优化点是多窗口并行优化。 下面是一个简略的SELECT语句,依据W1、W2做窗口聚合计算,这两个窗口定义是不一样,如果一样的话,生成的逻辑打算就会做合并优化。然而因为它的Partition key不一样,这个SELECT翻译进去的逻辑打算就是和右边一样的。首先数据是从T1表过去的,下面有两个Window的串行计算,简直所有开源分布式数据处理框架都是这样实现的。这种实现的难度较低,遇到多个窗口也是串行计算,把W2的后果和T1须要的列筛选进去再做W1就能够了。 然而,在这里会呈现资源节约的状况,因而还有很大的优化空间。这两个窗口计算自身不肯定会用满所有的计算资源,实践上应该能够并行计算来实现更高的性能,如果有一个窗口有数据歪斜的问题,即时第二个窗口很快就能够实现,它也必须等第一个窗口做完才能够开始。所以,它的整体计算工夫是间接累加的,W1须要多少工夫,W2须要多少工夫,加起来就是它的总运行工夫。 OpenMLDB多窗口并行优化的实现,会把串行的构造做成并行化,DataProvider节点右边和左边别离是两个WindowAgg节点,这两个节点没有相互依赖,运行时只有资源足够能够并行计算。当然即时实现了并行计算,优化后它的后果与串行执行后果也是统一的。 这种并行是怎么实现的呢?后面用户通过咱们的SQL parser编译,能够失去一个优化后的逻辑打算。最底层是一个DataProvider节点,优化后是一个并行的构造。咱们执行的时候先把须要的数据取出来,而后再做第二个WindowAgg,它们之间并没有相互依赖,数据也不须要读两份,而是都依赖于DATA PROVIDER节点。为了实现并行窗口数据的合并,须要再加一个JOIN节点。后面的简略列筛选节点,自身没有性能耗费,只是在逻辑打算里示意我计算时须要输出哪些列,在理论计算的时候,它不须要对整行数据进行编解码和传输。 数据过去当前咱们把两个节点数据做并行计算,计算后通过拼表操作拼接进去,最初再PROJECT须要的列,除了做Window咱们尽管还减少了拼表操作,但优化了多个Window的执行。如果有间断的Window,咱们就能够把它都做成间断的并行优化。 尽管实现逻辑看起来比较简单,只是把串行构造并行化,但当初大家都没有这样实现,次要起因是这种优化的实现细节还是比较复杂的。咱们晓得像第一个窗口,在做W1窗口聚合的时候,首先须要对于窗口的name、age这些列保留进去,有这两列能力做分区排序,还有age须要做聚合。 W1和W2的要求是不一样的,每个窗口计算出来只保留age列是不够的,实际上是这种串行的执行,T1做完了W2窗口的时候,并不是只保留W2算进去的列,还保留W1列,甚至所有的须要列,输入W2当前才能够做W1。做并行的时候,每个窗口只须要输入它本人的列就能够了,然而窗口的分区键是不一样,分布式数据外面每个分区内的数据也不一样,不能间接依照雷同程序做简略拼接,因而实现上咱们有一些新增列的操作,对所有数据都会给它调配一个索引列。 代码实现就须要八步,每一步都绝对简单。这里简略介绍一下,大家能够从OpenMLDB开源的代码外面能够看到具体的实现(OpenMLDB开源地址:https://github.com/4paradigm/...)。 首先是拿到一个逻辑打算,咱们就要给它做剖析,咱们要晓得哪些Window节点是须要并行优化的,而且并行优化的节点列数不一样,这个节点在解决的时候,实现的办法和一般Window也是不一样的。 遍历LastJoin1节点,找到所有ConcatJoin节点, 这里只有ConcatJoin3节点,存到一个List<PhysicalJoinNode>中。以ConcatJoin3节点开始,进行先序遍历,这时开始打标记,创立一个惟一的index column name,设置到标记的Map中。遍历ConcatJoin3的子节点,每一个节点都设置标记的Map,其中key为node id,value就是后面生成的index column name。在遍历子节点的过程中,还须要查看找到ConcatJoin3的下一个公共子节点,也就是这里的SimpleProject6,并且设置到标记Map中。在理论运行节点时,通过后序遍历逻辑打算来执行,对于SimpleProject6节点,在运行右边的逻辑时须要提前依据标记Map来增加一个index column,这时后果不能缓存,因为在计算左边时不能返回增加index column的DataFrame。两头节点如WindowProject4和WindowProject5,依据标记Map的信息理解到曾经增加了index column,在做窗口计算和编解码时须要去掉index column。在ConcatJoin3节点计算时,则能够应用last join或者left join实现,并且须要依据标记Map把index column列给去掉。其余节点,如LastJoin1、SimpleProject2、DataProvider7和SimpleProject8,都按旧逻辑失常运行。须要留神的是,第六步是所有带索引列的输入。如果还有其余节点,须要的是没有索引列的输入,这个节点会有两个输入。WindowProject4和WindowProject5这两个节点曾经打了标签,晓得本人是什么节点,在计算的时候须要去掉索引列。因为在这个节点,自身没有被优化之前,它的计算是输出多少列就解决多少列,然而在被并行优化当前,它在执行C函数的时候须要先去掉索引列,然而输入的时候又要把索引列加进去。 在下面的SQL例子,W1和W2只做一个特色的计算,他们只输入各自的后果列和一个索引列。拿到这两个输出表后咱们要做一个拼表操作,因为他们都有一个惟一的索引ID,即时做完窗口计算后索引也是不变的。咱们基于后面的索引列,做一个拼表,用last join或者left join实现即可,这两个节点不受优化影响,执行逻辑和以前一样,无论是输出还是输入,最终的表和之前的未优化是一样的。 咱们看一下多窗口并行优化的成果。首先从逻辑上就能够看到,如果你有两个窗口,计算资源足够的话,两个窗口并行计算,它的计算耗时应该是能够缩小运行工夫较短的那个窗口的,在并行优化当前短的窗口耗时就被忽略了。相似木桶效益,整个用户的耗时瓶颈是在最长的窗口外面。再加上做LLVM的窗口计算逻辑优化,咱们最终优化后的工夫就能够降到很低了。 并行优化性能如图所示,这里列举了三个性能测试场景,和最新的MPP System进行比照,基于窗口并行优化后的OpenMLDB与开源MPP零碎性能能够是原来的5.3倍,相比OpenMLDB自身性能也在2倍左右。 三.窗口歪斜优化OpenMLDB在窗口数据歪斜上也有大量优化实现。首先介绍一下数据歪斜和窗口数据歪斜的根底,数据歪斜是大数据处理场景下常见的一个景象,某一个分区或某一个key的数据量十分大,和其余的分区数据量不成比例。例如用户在统计这种游戏用户信息的时候,针对游戏用户的男女做一个分区解决,很可能就呈现歪斜的状况,比如说男性用户会比拟多,而这个数据因为是依照性别来分区的,性别的类型也不会有很多,分区数就会很少。也就导致咱们做分区聚合的时候,并发度也会非常少。 数据歪斜会导致数据分区和其余分区的运算后果产生较大差距,换句话说就是歪斜数据分区的计算工作与其cpu资源重大不匹配。最终会造成多等一的状况——多个小数据量的分区计算结束后期待歪斜的大数据量分区,只有歪斜分区计算结束能力输入后果。这对效率来说是微小的劫难。比如说64核,每个分区繁多解决,每个工作是20个核,工夫就比拟长。多个小数据分区结束后须要期待大数据辨别,只有歪斜分区计算结束能力输入后果,性能是无限的。 数据歪斜有几个计划。比如说每个分区做一个(reduce),分区之间没有关系,我给数据分成128个分区,这样就能够把所有的CPU资源用满了,每个分区用完了当前做聚合就能够失去后果。 在机器学习的特色计算中,窗口计算下呈现数据歪斜,某个分区数据过多,产生歪斜问题的时候,是不能够应用咱们方才说的传统的数据歪斜优化计划的。咱们通过数据加一个前缀,前缀能够分出更多的分区,为什么不能够这样做呢?因为窗口的计算是依赖于前后数据的,是基于某一个数据的前后数据做聚合。如果咱们把数据强行分成男性用户十个分区,第一个分区计算有可能是对的,然而第二个分区依赖于上一个分区的数据,所以在传统的实现上,无论是SparkSQL、FlinkSQL等等都没有对这个数据做优化。 OpenMLDB提出了一个基于Spark的窗口数据歪斜优化计划,对数据做一个裁减,如果不裁减间接分区的话,会导致不同数据计算的窗口不准,后果也不统一。咱们在做完了数据裁减当前,再依据新的分区键及工夫片做新的分区,并行度就会更高。 这是一个窗口歪斜的典型场景,在咱们的训练数据外面,数据只有两个性别,男和女。在这个场景下,咱们对男和女做一个Window特色的话,分区键只有两个值,实际上只有两个分区。也就是说这一个SQL场景,咱们基于分区键来做聚合,实现上只会有两个分区,无论你的Hadoop集群有一百还是一千CPU,Spark工作只能分成两个Task去解决,整个工作耗时就在歪斜分区上了。 窗口数据歪斜优化计划,常见的是做重分区。这里也是相似的原理,如果分成四个分区当前,并行度就会更高。咱们常见的办法是加前缀,比如说对所有男性,咱们加不同的前缀1和2。加完前缀当前,咱们对加完前缀的key再做分区,并行1的场景并行就能够变成2,这是传统的解决方案,但并不能解决窗口计算,也就是不能解决时序特色计算的歪斜问题。 假如这是一个时序特色,输出和输入都是四行,每一行假如它的窗口是某个用户前两条数据,到本人这一条数据,它的窗口数据先进行分区。第一条数据后面没有数据,计算是正确的。第二条数据它只有一条数据,而且在这个分区外面能够找到这个数据,前两条后果是统一的,第三条开始就不统一了。在本来的表外面,都是男性,后面有两条数据,应该在聚合计算的时候,应该要蕴含前两个数据。然而咱们做了重分区当前,在这个分区外面后面是没有数据的,窗口计算只计算了单条,输入后果优化前后是不统一的。 OpenMLDB的解决方案是通过四步来实现。从最终的后果优化能够看到,优化前是并行度为2,优化后并行度为4,至多能够晋升一倍。 ...

November 10, 2021 · 1 min · jiezi

关于算法:R语言中的BP神经网络模型分析学生成绩

原文链接:http://tecdat.cn/?p=19936 原文出处:拓端数据部落公众号在本教程中,您将学习如何在R中创立神经网络模型。 神经网络(或人工神经网络)具备通过样本进行学习的能力。人工神经网络是一种受生物神经元零碎启发的信息处理模型。它由大量高度互连的解决元件(称为神经元)组成,以解决问题。它遵循非线性门路,并在整个节点中并行处理信息。神经网络是一个简单的自适应零碎。自适应意味着它能够通过调整输出权重来更改其内部结构。 该神经网络旨在解决人类容易遇到的问题和机器难以解决的问题,例如辨认猫和狗的图片,辨认编号的图片。这些问题通常称为模式识别。它的利用范畴从光学字符识别到指标检测。 本教程将涵盖以下主题: 神经网络概论正向流传和反向流传激活函数R中神经网络的实现案例利弊论断神经网络概论神经网络是受人脑启发执行特定工作的算法。它是一组连贯的输出/输入单元,其中每个连贯都具备与之关联的权重。在学习阶段,网络通过调整权重进行学习,来预测给定输出的正确类别标签。 人脑由数十亿个解决信息的神经细胞组成。每个神经细胞都认为是一个简略的解决零碎。被称为生物神经网络的神经元通过电信号传输信息。这种并行的交互零碎使大脑可能思考和解决信息。一个神经元的树突接管来自另一个神经元的输出信号,并依据这些输出将输入响应到某个其余神经元的轴突。 树突接管来自其余神经元的信号。单元体将所有输出信号求和以生成输入。当总和达到阈值时通过轴突输入。突触是神经元相互作用的一个点。它将电化学信号传输到另一个神经元。 x1,x2 .... xn是输出变量。w1,w2 .... wn是各个输出的权重。b是偏差,将其与加权输出相加即可造成输出。偏差和权重都是神经元的可调整参数。应用一些学习规定来调整参数。神经元的输入范畴能够从-inf到+ inf。神经元不晓得边界。因而,咱们须要神经元的输出和输入之间的映射机制。将输出映射到输入的这种机制称为激活函数。 前馈和反馈人工神经网络人工神经网络次要有两种类型:前馈和反馈人工神经网络。前馈神经网络是非递归网络。该层中的神经元仅与下一层中的神经元相连,并且它们不造成循环。在前馈中,信号仅在一个方向上流向输入层。 反馈神经网络蕴含循环。通过在网络中引入环路,信号能够双向流传。反馈周期会导致网络行为依据其输出随工夫变动。反馈神经网络也称为递归神经网络。 激活函数激活函数定义神经元的输入。激活函数使神经网络具备非线性和可表白性。有许多激活函数: 辨认函数 通过激活函数 Identity,节点的输出等于输入。它完满拟合于潜在行为是线性(与线性回归类似)的工作。当存在非线性,独自应用该激活函数是不够的,但它仍然能够在最终输入节点上作为激活函数用于回归工作。。在 二元阶梯函数(Binary Step Function)中,如果Y的值高于某个特定值(称为阈值),则输入为True(或已激活),如果小于阈值,则输入为false(或未激活)。这在分类器中十分有用。S形函数 称为S形函数。逻辑和双曲正切函数是罕用的S型函数。有两种:Sigmoid函数 是一种逻辑函数,其中输入值为二进制或从0到1变动。tanh函数 是一种逻辑函数,其输入值在-1到1之间变动。也称为双曲正切函数或tanh。ReLU函数又称为修改线性单元(Rectified Linear Unit),是一种分段线性函数,其补救了sigmoid函数以及tanh函数的梯度隐没问题。它是最罕用的激活函数。对于x的负值,它输入0。 在R中实现神经网络创立训练数据集咱们创立数据集。在这里,您须要数据中的两种属性或列:特色和标签。在下面显示的表格中,您能够查看学生的专业知识,沟通技能得分和学生问题。因而,前两列(专业知识得分和沟通技能得分)是特色,第三列(学生问题)是二进制标签。 #创立训练数据集# 在这里,把多个列或特色组合成一组数据test=data.frame(专业知识,沟通技能得分)让咱们构建神经网络分类器模型。首先,导入神经网络库,并通过传递标签和特色的参数集,数据集,暗藏层中神经元的数量以及误差计算来创立神经网络分类器模型。``````# 拟合神经网络nn(问题~专业知识+沟通技能得分, hidden=3,act.fct = "logistic",                linear.output = FALSE)这里失去模型的因变量、自变量、损失_函数、_激活函数、权重、后果矩阵(蕴含达到的阈值,误差,AIC和BIC以及每次反复的权重的矩阵)等信息: $model.list$model.list$response\[1\] "问题"$model.list$variables\[1\] "专业知识"     "沟通技能得分"$err.fctfunction (x, y) {    1/2 * (y - x)^2}$act.fctfunction (x) {    1/(1 + exp(-x))}$net.result$net.result\[\[1\]\]            \[,1\]\[1,\] 0.980052980\[2,\] 0.001292503\[3,\] 0.032268860\[4,\] 0.032437961\[5,\] 0.963346989\[6,\] 0.977629865$weights$weights\[\[1\]\]$weights\[\[1\]\]\[\[1\]\]           \[,1\]        \[,2\]       \[,3\]\[1,\]  3.0583343  3.80801996 -0.9962571\[2,\]  1.2436662 -0.05886708  1.7870905\[3,\] -0.5240347 -0.03676600  1.8098647$weights\[\[1\]\]\[\[2\]\]           \[,1\]\[1,\]   4.084756\[2,\]  -3.807969\[3,\] -11.531322\[4,\]   3.691784$generalized.weights$generalized.weights\[\[1\]\]            \[,1\]       \[,2\]\[1,\]  0.15159066 0.09467744\[2,\]  0.01719274 0.04320642\[3,\]  0.15657354 0.09778953\[4,\] -0.46017408 0.34621212\[5,\]  0.03868753 0.02416267\[6,\] -0.54248384 0.37453006$startweights$startweights\[\[1\]\]$startweights\[\[1\]\]\[\[1\]\]           \[,1\]        \[,2\]       \[,3\]\[1,\]  0.1013318 -1.11757311 -0.9962571\[2,\]  0.8583704 -0.15529112  1.7870905\[3,\] -0.8789741  0.05536849  1.8098647$startweights\[\[1\]\]\[\[2\]\]           \[,1\]\[1,\] -0.1283200\[2,\] -1.0932526\[3,\] -1.0077311\[4,\] -0.5212917$result.matrix                                  \[,1\]error                      0.002168460reached.threshold          0.007872764steps                    145.000000000Intercept.to.1layhid1      3.058334288专业知识.to.1layhid1       1.243666180沟通技能得分.to.1layhid1  -0.524034687Intercept.to.1layhid2      3.808019964专业知识.to.1layhid2      -0.058867076沟通技能得分.to.1layhid2  -0.036766001Intercept.to.1layhid3     -0.996257068专业知识.to.1layhid3       1.787090472沟通技能得分.to.1layhid3   1.809864672Intercept.to.问题          4.0847555221layhid1.to.问题          -3.8079690871layhid2.to.问题         -11.5313215341layhid3.to.问题           3.691783805绘制神经网络让咱们绘制您的神经网络模型。 # 绘图神经网络plot(nn) 创立测试数据集创立测试数据集:专业知识得分和沟通技能得分 # 创立测试集test=data.frame(专业知识,沟通技能得分)预测测试集的后果应用计算函数预测测试数据的概率得分。 ## 应用神经网络进行预测Pred$result0.99282020800.33355439250.9775153014当初,将概率转换为二进制类。 # 将概率转换为设置阈值0.5的二进制类别pred <- ifelse(prob>0.5, 1, 0)pred101预测后果为1,0和1。 利弊神经网络更灵便,能够用于回归和分类问题。神经网络非常适合具备大量输出(例如图像)的非线性数据集,能够应用任意数量的输出和层,能够并行执行工作。 还有更多可供选择的算法,例如SVM,决策树和回归算法,这些算法简略,疾速,易于训练并提供更好的性能。神经网络更多的是黑盒子,须要更多的开发工夫和更多的计算能力。与其余机器学习算法相比,神经网络须要更多的数据。NN仅可用于数字输出和非缺失值数据集。一位驰名的神经网络钻研人员说:  “神经网络是解决任何问题的第二好的办法。最好的办法是真正了解问题。” 神经网络的用处神经网络的个性提供了许多利用方面,例如: 模式识别: 神经网络非常适合模式识别问题,例如面部辨认,物体检测,指纹识别等。异样检测: 神经网络善于异样检测,它们能够轻松检测出不适宜惯例模式的异样模式。工夫序列预测: 神经网络可用于预测工夫序列问题,例如股票价格,天气预报。自然语言解决: 神经网络在自然语言解决工作中提供了宽泛的利用,例如文本分类,命名实体辨认(NER),词性标记,语音辨认和拼写查看。 最受欢迎的见解 1.r语言用神经网络改良nelson-siegel模型拟合收益率曲线剖析 2.r语言实现拟合神经网络预测和后果可视化 3.python用遗传算法-神经网络-含糊逻辑控制算法对乐透剖析 4.用于nlp的python:应用keras的多标签文本lstm神经网络分类 5.用r语言实现神经网络预测股票实例 6.R语言基于Keras的小数据集深度学习图像分类 7.用于NLP的seq2seq模型实例用Keras实现神经机器翻译 8.python中基于网格搜索算法优化的深度学习模型剖析糖 9.matlab应用贝叶斯优化的深度学习

November 9, 2021 · 1 min · jiezi

关于算法:R语言极值理论-EVTPOT超阈值GARCH-模型分析股票指数VaR条件CVaR多元化投资组合预测风险测度分析

原文链接:http://tecdat.cn/?p=24182 概要本文用 R 编程语言极值实践 (EVT) 以确定 10 只股票指数的危险价值(和条件 VaR)。应用 Anderson-Darling 测验对 10 只股票的组合数据进行正态性测验,并应用 Block Maxima 和 Peak-Over-Threshold 的 EVT 办法预计 VaR/CvaR。最初,应用条件异向性 (GARCH) 解决的狭义自回归来预测将来 20 天后指数的将来值。本文将确定计算危险因素的不同办法对模型后果的影响。 极值实践(最后由Fisher、Tippett和Gnedenko提出)表明,独立同散布(iid)变量样本的分块最大值的散布会收敛到三个极值散布之一。 最近,统计学家对极其值建模的趣味又有了新的变动。极限值剖析已被证实在各种危险因素的案例中很有用。在1999年至2008年的金融市场动荡之后,极值剖析取得了有效性,与之前的危险价值剖析不同。极限值代表一个零碎的极其稳定。极限值剖析提供了对极其事件的概率、规模和爱护老本的关系进行建模的能力。   参考https://arxiv.org/pdf/1310.3222.pdf https://www.ma.utexas.edu/mp_arc/c/11/11-33.pdf http://evt2013.weebly.com/uploads/1/2/6/9/12699923/penalva.pdf Risk Measurement in Commodities Markets Using Conditional Extreme Value Theory   第 1a 局部 - 工作目录、所需的包和会话信息为了开始剖析,工作目录被设置为蕴含股票行情的文件夹。而后,装置所需的 R 编程语言包并蕴含在包库中。R 包包含极值实践函数、VaR 函数、工夫序列剖析、定量交易剖析、回归剖析、绘图和 html 格局的包。 library(ggplot2)library(tseries)library(vars)library(evd)library(POT)library(rugarch)  第 1b 节 - 格式化专有数据用于此剖析的第一个文件是“Data_CSV.csv”。该文件蕴含在 DAX 证券交易所上市的 15 家公司的股票代码数据,以及 DAX 交易所的市场投资组合数据。从这个数据文件中选出了 10 家公司,这些公司最近十年的股价信息是从谷歌财经下载的。 第 1c 节 - 下载股票代码数据股票价格数据下载并读入 R 编程环境。收益率是用“开盘价/收盘价 ”计算的,十家公司的数据合并在一个数据框中,(每家公司一列)。 ...

November 9, 2021 · 3 min · jiezi

关于算法:FE5226风险管理

Foundations of a Risk Management SystemFE5226 Group ProjectFabio Cannizzoversion: 2021-08-28AbstractThis source code constitutes the foundation of a risk management system. It can load trades from a database,compute the price of trades and their sensitivities with respect to risk factors and construct market objects on demand.A real risk management system entails of many more features, e.g. sophisticate market objects and pricing models;efficient algorithms to avoid unnecessary recomputations when calculating Greeks; support for a large number of tradetypes; extensive set of tools to orchestrate recomputations and post-process their results (e.g. P&L explain, VaR,PFE, XVA); tools to manage life-cycle of trades; connections to external databases and systems of various nature;client-server pricing APIs; connections to cash flow management systems and payment systems; support for parallelcomputations (thread safety).All these features can be implemented as modifications or extensions of the code provided. You are supposed tocarry out various improvements and extensions as specified below.1 LicenseThe license for the source code is in the main directory. Please read the license file.2 Source code organization and build instructionsAll source code files are in the subdirectory src. Source files with names matching the patterns Demo.cpp or Test.cppcontain the main routine for separate programs. The other cpp files are library components used by the variousprograms.The target platform is x86 64 (64 bits). The C++ language standard used is: C++17. In Visual Studio you must:• Select platform ”x64” (the default is ”x86”, i.e. 32 bits).• Go to the property page for the project (right click on the project from solution explorer), select ”all platform”and ”all configurations”, then navigate the configuration tree to C++/AllOptions and set:– C++ language standard: C++17– Disable language extensions: yes– Treat all errors as warnings: yes– Warning level: W3The src subdirectory also contains a Makefile for gcc compilation. If you use Visual Studio, you need to: create a newsolution; in the solution add one console project for each cpp file with name Demo.cpp or Test.cpp; in each projectalso add all other cpp files (except the ones with name Demo.cpp or Test.cpp), so that in each project you have oneand only one cpp file containing the function main. You can work in ”Debug” mode, which allows you to execute codestep by step and use breakpoints, but when you are finished with development and want to test the performance of yourfinal program you should use ”Release” mode. The language standard can be selected from the project configuration(right click on the project in the Solution Explorer pane, then select C++/Lanugage/C++LanguageStandards). Notethat this must be repeated for all modes (debug and release).A number of txt files are given. portfolio 0.txt and risk factors 0.txt work with the program in its current state.portfolio i.txt and risk factors i.txt work after completion of the first i tasks. If a file with appropriate enumeration ismissing, you can use the last one available (e.g. in task 11, you can use risk factors 5.txt)To run the program type from the command line:DemoRisk -p portfolio.txt -f risk factors.txtTo run the program directly from inside Visual Studio, you can specify the working directory where your txt filesare located and the command line arguments (portfolio.txt risk factors.txt) in the Debugging section of the projectconfiguration.13 What to doYou have to complete sequentially all tasks mentioned in section 6. After completing each task you should testcorrectness of your work by succesfully running the commandDemoRisk portfolio i.txt risk factors i.txtand comparing the output of your program with the output given in output i.txt. To compare files you can use the freeWindows program WinMerge, or sdiff on Linux. Your goal is to generate an output file identical to the one provided.4 Marking criteriaMarking is going to be based on the following criteria.4.1 Correctly follow submission instructions (-2 marks)By simply following correctly submission procedures described in section 5, you get full marks. Otherwise, up to 2marks are subtracted from your total mark. While this seems trivial, every year some student group fails to do this, soplease be careful.4.2 Coding style (3 marks)Follow good practice• correct use of indentation (configure your editor to convert tab to spaces and to use tabs of 4 characters)• if called with no arguments or with incorrect arguments, the program must produce an explanation of the correctcommand line syntax required to invoke the program• proper choices of variable and function names• appropriate use of source code comments• avoid code duplication (do not copy and paste, introduce new functions as appropriate)• code robustness (e.g. assert function arguments are valid)• code conciseness (do not do in 10 lines what you could do in one line)• do not reinvent the wheel (use library functions when available)• minimal changes to original files: only add or modify the lines of code strictly necessary, do not insert unnecessarywhitespaces (you can use WinMerge to view the difference between your files and the original ones, or use git,which is excellent for checking differences). I will use WinMerge to check differences.4.3 Date class correctness (2 marks)I will look at you date class implementation and the test, focusing on correctness. I will run your date class againstmy test.4.4 Basic correctness (5 marks)If your code compiles I will run your DemoRisk with the given trade portfolio and market data and compare youroutput with mine using WinMerge. If there is a no difference, you get full marks. Note that if your code does notcompile, you will get zero marks. The command line help message should also be correct (include all accepted commandline arguments).4.5 Performance (4 marks)I create a very large test portfolio (millions of trades). As simple way to do this is to simply copy the given test setportfolio many times in a bigger file. If your DemoRisk runs in a time comparable or better than my own implementation,you get full marks. If section 4.4 fails, here you get zero marks. Common mistakes that can make your program slow are:poor choice of data structures and redundant calculations (in particular, for market objects, do as much calculationsas possible when you construct the objects, and reuse this information when pricers query the market data objects).4.6 Advanced correctness (4 marks)I create an extended set of test test files, with more currencies and more special cases than what covered by the sampletest files. This may include expired trades (i.e. trades where the last payment date is before the pricing date, whichshould generate an error), missing market data (e.g. a missing FX spot), missing fixings and other corner cases. Ifyour DemoRisk runs correctly reproducing the output file provided you get full marks. I will compare your output withmine using WinMerge. If section 4.4 fails, here you get zero marks.24.7 GCC build (3 marks)Before submitting, verify that your program compiles and run also with the g++ compiler. To do that on Windows64 bits you can:• download setup-x86 64.exe from https://www.cygwin.com/instal...• Run the installer. When you install, select at least the packages ”gcc-g++” and ”make”.• launch cygwin and type the command cygpath -w $(pwd).• Copy your cpp and h files and the Makefile I provided to the directory revealed by the previous command• Type ”make”• If all is well, you should see all your files compiling without errors and an executable file created.• Test the executable file from the command line.5 Submission instructions• After completing all tasks you need to zip and submit all files with extension .h and .cpp.• Do not submit any other file (e.g. txt files, visual studio project files, object files, executable files, output files).• Files should be zipped without directory path. I.e. your zip file should contain file1.cpp, file2.cpp, ..., notdirname\file1.cpp, dirname\file2.cpp, ....• You need to include in the zip file also a file with name GROUP.TXT containing team members. The file mustcontains the student IDs separated by a newline, i.e.studentID1studentID2...• Submit only a zip file, other formats are not allowed (e.g. arj, 7z)• Submit only only once.• Only one member of the team must submit, not all members.6 Tasks6.1 Improve the Date classThe most common operations performed with the Date class when pricing are comparison (e.g. <, ==, >) andcomputation of distance between two dates. The current internal representation of the date class is not optimal forthese operations.Refactor the Date class by modifying the current internal representation, which entails of the 4 data members day,month, year and is leap, to a single data member of type unsigned with name serial, representing the number of dayselapsed since 1-Jan-1900. This allows to speed up the operations mentioned above and reduce memory footprint.Change the serialization format to be based directly on serial, so that no extra work is necessary when saving orloading from a file.When the Date class is constructed from the arguments day, month and year, you need to generate the equivalentserial number. When converting to a string in calendar format for display to the screen, you need to convert serialon-the-fly into day, month and year.6.2 Write a test for the Date classComplete the program in TestDate.cpp, so that it tests the correctness of the Date class. It should perform the followingtests: ...

November 9, 2021 · 19 min · jiezi

关于算法:一文搞懂动态规划

前言大家好,我是bigsai,好久不见,甚是惦记(天天惦记)! 很久前就有小伙伴被动静布局所折磨,的确,很多题动静布局的确太难看出了了,甚至有的题看了题解了解起来都吃力半天。 动静布局的范畴尽管的确是很广很难,然而从整个动静布局呈现的频率来看,这几种根底的动静布局了解容易,学习起来压力不大,并且呈现频率十分高。 这几个常见的动静布局有:间断子数组最大和,子数组的最大乘积,最长递增子序列(LIS),最长公共子序列(LCS),最长公共子串,最长公共子串,不同子序列。 首发公众号bigsai,谢绝未分割转载什么是动静布局首先很多人问,何为动静布局?动静布局(Dynamic Programming,DP)是运筹学的一个分支,是求解决策过程最优化的过程。艰深一点动静布局就是从下往上(从前向后)阶梯型求解数值。 那么动静布局和递归有什么区别和分割? 总的来说动静布局从前向后,递归从后向前,两者策略不同,并且个别动静布局效率高于递归。 不过都要思考初始状态,上上层数据之间的分割。很多时候用动静布局能解决的问题,用递归也能解决不过很多时候效率不高可能会用到记忆化搜寻。 不太明确? 就拿求解斐波那契额数列来说,如果间接用递归不优化,那么复杂度太多会进行很多反复的计算。 然而利用记忆化你能够了解为一层缓存,将求过的值存下来下次再遇到就间接应用就能够了。 实现记忆化搜寻求斐波那契代码为: static long F(int n,long record[]){ if(n==1||n==2) {return 1;} if(record[n]>0) return record[n]; else record[n]=F(n-1,record)+F(n-2,record); return record[n];}public static void main(String[] args) { int n=6; long[] record = new long[n+1]; System.out.println(F(n,record));}而动静布局的形式你能够从前往后逻辑解决,从第三个开始每个dp都是前两个dp之和。 public int fib(int n) { int dp[]=new int[n+1]; dp[0]=0; dp[1]=1; for(int i=2;i<n+1;i++){ dp[i]=dp[i-1]+dp[i-2]; } return dp[n]; }当然动静布局也能有很多空间优化,有些只用一次的值,你能够用一些变量去代替。有些二维数组很大也能够用一维数组交替代替。当然动静布局专题很大,有很多比方树形dp、状压dp、背包问题等等经常出现在比赛中,能力无限这里就将一些呈现口试高频的动静布局! 间断子数组最大和给定一个整数数组 nums ,找到一个具备最大和的间断子数组(子数组起码蕴含一个元素),返回其最大和。 示例: 输出: [-2,1,-3,4,-1,2,1,-5,4]输入: 6解释: 间断子数组 [4,-1,2,1] 的和最大,为 6。dp的办法就是O(n)的办法。如果dp[i]示意以第i个结尾的最大序列和,而这个dp的状态方程为: ...

November 9, 2021 · 2 min · jiezi