FM模型的FM使用了隐向量特征交叉。
deep设置了3层。层数要根据具体网络,如GCN就不能太深,否则会导致拉普拉斯平滑问题。这里设置3层解决非线性的问题。
其实就是青蛙跳台阶的题目:
d p [ i ] dp[i] dp[i]是青蛙跳上一个n
级的台阶总共跳法数。
class Solution {
public:
int numWays(int n) {
vector<int>dp(n+1,0);
if(n==0) return 1;//否则当n=0时下面这句的dp[1]就访问越界了
dp[0]=dp[1]=1;
for(int i=2;i<=n;i++){
dp[i]=(dp[i-1]+dp[i-2])% 1000000007;
}
return dp[n];
}
};
递归写法:
int fib(int N) {
if (N == 1 || N == 2) return 1;
return fib(N - 1) + fib(N - 2);
}
dp[i]
表示nums中以nums[i]
结尾子数组的最大子序和。dp[i - 1]
进行分类讨论:
nums[i]
加到dp[i - 1]
上(因为不管nums[i]
是大于0还是小于0,以nums[i]
为结尾的子数组的最大子序和,都是要加上这个数的,注意定义好的状态)。dp[i] = nums[i]
。dp[0] = nums[0]
。建表:
START TRANSACTION;
CREATE TABLE employee (
name text,
department text,
salary bigint
);
INSERT INTO employee VALUES ( 'alice', 'it', 1000 );
INSERT INTO employee VALUES ( 'bob', 'it', 2000 );
INSERT INTO employee VALUES ( 'david', 'it', 3000 );
INSERT INTO employee VALUES ( 'john', 'it', 2000 );
INSERT INTO employee VALUES ( 'mike', 'it', 9000 );
INSERT INTO employee VALUES ( 'henry', 'sales', 500000 );
INSERT INTO employee VALUES ( 'jason', 'sales', 9999999 );
COMMIT;
给每个部门的人,根据薪资进行部门内排序,可以使用窗口函数,对部门分类,对部门内排序DENSE_RANK
(无间隔的分级):
SELECT *, DENSE_RANK() OVER(
PARTITION BY department
ORDER BY salary DESC
) AS innerrank
FROM employee;
最后:
SELECT * FROM (
SELECT *, DENSE_RANK() OVER(
PARTITION BY department
ORDER BY salary DESC
) AS innerrank
FROM employee
) AS t WHERE innerrank <= 3;
面试官说没有学生ID,最后输出排序后的学生成绩就好。
听了就懵了,还有比快排更快的方法?!说了一个哈希表的方法(不太确定), 以学生成绩为key
值,以key
为成绩的学生个数作为哈希表的value
值。然后因为C++的STL中的map
底层用了红黑树,排序一波会更快。
去除唯一属性、处理缺失值、属性编码、数据标准化正则化、特征选择、主成分分析。
类似作QA的bert模型可以。
LR、GBDT / XGBoost分类
(1)Scala 是一门多范式(multi-paradigm)的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性。
Scala 运行在 Java 虚拟机上,并兼容现有的 Java 程序。
Scala 源代码被编译成 Java 字节码,所以它可以运行于 JVM 之上,并可以调用现有的 Java 类库。
(2)Apache Spark是用 Scala编程语言 编写的。为了用Spark支持Python,Apache Spark社区发布了一个工具PySpark。使用PySpark,也可以使用Python编程语言中的 RDD 。
(3)PySpark提供了 PySpark Shell
,它将Python API链接到spark核心并初始化Spark上下文。将Python与Spark集成就对数据科学研究更加方便。
Spark的开发语言是Scala,这是Scala在并行和并发计算方面优势的体现,这是微观层面函数式编程思想的一次胜利。此外,Spark在很多宏观设计层面都借鉴了函数式编程思想,如接口、惰性求值和容错等。
Spark是业界主流的大数据处理利器。
Spark 的架构图中:
在物理的 Worker Node 上,数据还会分为不同的 partition(数据分片),可以说 partition 是 Spark 的基础数据单元。
Spark 计算集群能够比传统的单机高性能服务器具备更强大的计算能力,就是由这些成百上千,甚至达到万以上规模的工作节点并行工作带来的。
那在执行一个具体任务的时候,Spark 是怎么协同这么多的工作节点,通过并行计算得出最终的结果呢?这里我们用一个任务来解释一下 Spark 的工作过程。
一个具体任务过程:
(1)先从本地硬盘读取文件 textFile;
(2)再从分布式文件系统 HDFS 读取文件 hadoopFile;
(3)然后分别对它们进行处理;
(4)再把两个文件按照 ID 都 join
起来得到最终的结果。
最关键的过程是要理解哪些是可以纯并行处理的部分,哪些是必须 shuffle(混洗)和 reduce 的部分:这里的 shuffle
指的是所有 partition 的数据必须进行洗牌后才能得到下一步的数据,最典型的操作就是图 2 中的 groupByKey
操作和 join
操作。以 join
操作为例,必须对 textFile 数据和 hadoopFile 数据做全量的匹配才可以得到 join
后的 dataframe
(Spark 保存数据的结构)。而 groupByKey
操作则需要对数据中所有相同的 key 进行合并,也需要全局的 shuffle 才能完成。
与之相比,map
、filter
等操作仅需要逐条地进行数据处理和转换,不需要进行数据间的操作,因此各 partition 之间可以完全并行处理。
在得到最终的计算结果之前,程序需要进行 reduce
的操作,从各 partition 上汇总统计结果,随着 partition 的数量逐渐减小,reduce
操作的并行程度逐渐降低,直到将最终的计算结果汇总到 master 节点(主节点)上。可以说,shuffle
和 reduce
操作的触发决定了纯并行处理阶段的边界。
注意:
(1)shuffle 操作需要在不同计算节点之间进行数据交换,非常消耗计算、通信及存储资源,因此 shuffle
操作是 spark 程序应该尽量避免的。shuffle
可以理解为一个串行操作,需要等到在此之前的并行工作完成之后才可以顺序开始。
(2)简述Spark 的计算过程:Stage 内部数据高效并行计算,Stage 边界处进行消耗资源的 shuffle
操作或者最终的 reduce
操作。
[1] https://zhuanlan.zhihu.com/p/341148358
[2] 一篇文章搞懂机器学习风控建模过程
[3] 风控8个场景中的机器学习应用
[4] 机器学习算法原理系列篇1:金融风控中的机器学习
[5] 数据预处理(方法总结)