数学基础
- 线性代数
- 概率论与随机过程
- 数值计算
- 蒙特卡洛方法与 MCMC 采样
- 机器学习方法概论
统计学习
深度学习
- 深度学习简介
- 深度前馈网络
- 反向传播算法
- 正则化
- 深度学习中的最优化问题
- 卷积神经网络
- CNN:图像分类
- 循环神经网络 RNN
- Transformer
- 一、Transformer [2017]
- 二、Universal Transformer [2018]
- 三、Transformer-XL [2019]
- 四、GPT1 [2018]
- 五、GPT2 [2019]
- 六、GPT3 [2020]
- 七、OPT [2022]
- 八、BERT [2018]
- 九、XLNet [2019]
- 十、RoBERTa [2019]
- 十一、ERNIE 1.0 [2019]
- 十二、ERNIE 2.0 [2019]
- 十三、ERNIE 3.0 [2021]
- 十四、ERNIE-Huawei [2019]
- 十五、MT-DNN [2019]
- 十六、BART [2019]
- 十七、mBART [2020]
- 十八、SpanBERT [2019]
- 十九、ALBERT [2019]
- 二十、UniLM [2019]
- 二十一、MASS [2019]
- 二十二、MacBERT [2019]
- 二十三、Fine-Tuning Language Models from Human Preferences [2019]
- 二十四 Learning to summarize from human feedback [2020]
- 二十五、InstructGPT [2022]
- 二十六、T5 [2020]
- 二十七、mT5 [2020]
- 二十八、ExT5 [2021]
- 二十九、Muppet [2021]
- 三十、Self-Attention with Relative Position Representations [2018]
- 三十一、USE [2018]
- 三十二、Sentence-BERT [2019]
- 三十三、SimCSE [2021]
- 三十四、BERT-Flow [2020]
- 三十五、BERT-Whitening [2021]
- 三十六、Comparing the Geometry of BERT, ELMo, and GPT-2 Embeddings [2019]
- 三十七、CERT [2020]
- 三十八、DeCLUTR [2020]
- 三十九、CLEAR [2020]
- 四十、ConSERT [2021]
- 四十一、Sentence-T5 [2021]
- 四十二、ULMFiT [2018]
- 四十三、Scaling Laws for Neural Language Models [2020]
- 四十四、Chinchilla [2022]
- 四十七、GLM-130B [2022]
- 四十八、GPT-NeoX-20B [2022]
- 四十九、Bloom [2022]
- 五十、PaLM [2022] (粗读)
- 五十一、PaLM2 [2023](粗读)
- 五十二、Self-Instruct [2022]
- 句子向量
- 词向量
- 传统CTR 预估模型
- CTR 预估模型
- 一、DSSM [2013]
- 二、FNN [2016]
- 三、PNN [2016]
- 四、DeepCrossing [2016]
- 五、Wide 和 Deep [2016]
- 六、DCN [2017]
- 七、DeepFM [2017]
- 八、NFM [2017]
- 九、AFM [2017]
- 十、xDeepFM [2018]
- 十一、ESMM [2018]
- 十二、DIN [2017]
- 十三、DIEN [2019]
- 十四、DSIN [2019]
- 十五、DICM [2017]
- 十六、DeepMCP [2019]
- 十七、MIMN [2019]
- 十八、DMR [2020]
- 十九、MiNet [2020]
- 二十、DSTN [2019]
- 二十一、BST [2019]
- 二十二、SIM [2020]
- 二十三、ESM2 [2019]
- 二十四、MV-DNN [2015]
- 二十五、CAN [2020]
- 二十六、AutoInt [2018]
- 二十七、Fi-GNN [2019]
- 二十八、FwFM [2018]
- 二十九、FM2 [2021]
- 三十、FiBiNET [2019]
- 三十一、AutoFIS [2020]
- 三十三、AFN [2020]
- 三十四、FGCNN [2019]
- 三十五、AutoCross [2019]
- 三十六、InterHAt [2020]
- 三十七、xDeepInt [2023]
- 三十九、AutoDis [2021]
- 四十、MDE [2020]
- 四十一、NIS [2020]
- 四十二、AutoEmb [2020]
- 四十三、AutoDim [2021]
- 四十四、PEP [2021]
- 四十五、DeepLight [2021]
- 图的表达
- 一、DeepWalk [2014]
- 二、LINE [2015]
- 三、GraRep [2015]
- 四、TADW [2015]
- 五、DNGR [2016]
- 六、Node2Vec [2016]
- 七、WALKLETS [2016]
- 八、SDNE [2016]
- 九、CANE [2017]
- 十、EOE [2017]
- 十一、metapath2vec [2017]
- 十二、GraphGAN [2018]
- 十三、struc2vec [2017]
- 十四、GraphWave [2018]
- 十五、NetMF [2017]
- 十六、NetSMF [2019]
- 十七、PTE [2015]
- 十八、HNE [2015]
- 十九、AANE [2017]
- 二十、LANE [2017]
- 二十一、MVE [2017]
- 二十二、PMNE [2017]
- 二十三、ANRL [2018]
- 二十四、DANE [2018]
- 二十五、HERec [2018]
- 二十六、GATNE [2019]
- 二十七、MNE [2018]
- 二十八、MVN2VEC [2018]
- 二十九、SNE [2018]
- 三十、ProNE [2019]
- Graph Embedding 综述
- 图神经网络
- 一、GNN [2009]
- 二、Spectral Networks 和 Deep Locally Connected Networks [2013]
- 三、Fast Localized Spectral Filtering On Graph [2016]
- 四、GCN [2016]
- 五、神经图指纹 [2015]
- 六、GGS-NN [2016]
- 七、PATCHY-SAN [2016]
- 八、GraphSAGE [2017]
- 九、GAT [2017]
- 十、R-GCN [2017]
- 十一、 AGCN [2018]
- 十二、FastGCN [2018]
- 十三、PinSage [2018]
- 十四、GCMC [2017]
- 十五、JK-Net [2018]
- 十六、PPNP [2018]
- 十七、VRGCN [2017]
- 十八、ClusterGCN [2019]
- 十九、LDS-GNN [2019]
- 二十、DIAL-GNN [2019]
- 二十一、HAN [2019]
- 二十二、HetGNN [2019]
- 二十三、HGT [2020]
- 二十四、GPT-GNN [2020]
- 二十五、Geom-GCN [2020]
- 二十六、Graph Network [2018]
- 二十七、GIN [2019]
- 二十八、MPNN [2017]
- 二十九、UniMP [2020]
- 三十、Correct and Smooth [2020]
- 三十一、LGCN [2018]
- 三十二、DGCNN [2018]
- 三十三、AS-GCN
- 三十四、DGI [2018]
- 三十五、DIFFPOLL [2018]
- 三十六、DCNN [2016]
- 三十七、IN [2016]
- 图神经网络 2
- 图神经网络 3
- 推荐算法(传统方法)
- 一、Tapestry [1992]
- 二、GroupLens [1994]
- 三、ItemBased CF [2001]
- 四、Amazon I-2-I CF [2003]
- 五、Slope One Rating-Based CF [2005]
- 六、Bipartite Network Projection [2007]
- 七、Implicit Feedback CF [2008]
- 八、PMF [2008]
- 九、SVD++ [2008]
- 十、MMMF 扩展 [2008]
- 十一、OCCF [2008]
- 十二、BPR [2009]
- 十三、MF for RS [2009]
- 十四、 Netflix BellKor Solution [2009]
- 推荐算法(神经网络方法 1)
- 一、MIND [2019](用于召回)
- 二、DNN For YouTube [2016]
- 三、Recommending What Video to Watch Next [2019]
- 四、ESAM [2020]
- 五、Facebook Embedding Based Retrieval [2020](用于检索)
- 六、Airbnb Search Ranking [2018]
- 七、MOBIUS [2019](用于召回)
- 八、TDM [2018](用于检索)
- 九、DR [2020](用于检索)
- 十、JTM [2019](用于检索)
- 十一、Pinterest Recommender System [2017]
- 十二、DLRM [2019]
- 十三、Applying Deep Learning To Airbnb Search [2018]
- 十四、Improving Deep Learning For Airbnb Search [2020]
- 十五、HOP-Rec [2018]
- 十六、NCF [2017]
- 十七、NGCF [2019]
- 十八、LightGCN [2020]
- 十九、Sampling-Bias-Corrected Neural Modeling [2019](检索)
- 二十、EGES [2018](Matching 阶段)
- 二十一、SDM [2019](Matching 阶段)
- 二十二、COLD [2020 ] (Pre-Ranking 模型)
- 二十三、ComiRec [2020](https://www.wenjiangs.com/doc/0b4e1736-ac78)
- 二十四、EdgeRec [2020]
- 二十五、DPSR [2020](检索)
- 二十六、PDN [2021](mathcing)
- 二十七、时空周期兴趣学习网络ST-PIL [2021]
- 推荐算法之序列推荐
- 一、FPMC [2010]
- 二、GRU4Rec [2015]
- 三、HRM [2015]
- 四、DREAM [2016]
- 五、Improved GRU4Rec [2016]
- 六、NARM [2017]
- 七、HRNN [2017]
- 八、RRN [2017]
- 九、Caser [2018]
- 十、p-RNN [2016]
- 十一、GRU4Rec Top-k Gains [2018]
- 十二、SASRec [2018]
- 十三、RUM [2018]
- 十四、SHAN [2018]
- 十五、Phased LSTM [2016]
- 十六、Time-LSTM [2017]
- 十七、STAMP [2018]
- 十八、Latent Cross [2018]
- 十九、CSRM [2019]
- 二十、SR-GNN [2019]
- 二十一、GC-SAN [2019]
- 二十二、BERT4Rec [2019]
- 二十三、MCPRN [2019]
- 二十四、RepeatNet [2019]
- 二十五、LINet(2019)
- 二十六、NextItNet [2019]
- 二十七、GCE-GNN [2020]
- 二十八、LESSR [2020]
- 二十九、HyperRec [2020]
- 三十、DHCN [2021]
- 三十一、TiSASRec [2020]
- 推荐算法(综述)
- 多任务学习
- 系统架构
- 实践方法论
- 深度强化学习 1
- 自动代码生成
工具
- CRF
- lightgbm
- xgboost
- scikit-learn
- spark
- numpy
- matplotlib
- pandas
- huggingface_transformer
- 一、Tokenizer
- 二、Datasets
- 三、Model
- 四、Trainer
- 五、Evaluator
- 六、Pipeline
- 七、Accelerate
- 八、Autoclass
- 九、应用
- 十、Gradio
Scala
- 环境搭建
- 基础知识
- 函数
- 类
- 样例类和模式匹配
- 测试和注解
- 集合 collection(一)
- 集合collection(二)
- 集成 Java
- 并发
一、Scala 特点
可以从
https://docs.scala-lang.org/api/all.html
查询scala doc
文档。Scala
允许添加新的数据类型,这些新加的类型用起来和内建的类型一样。Scala
也允许添加新的控制结构,其用法也和内建的控制结构一样。
1.1 面向对象&函数式
Scala
同时支持面向对象编程和函数式编程。Scala
中,一切value
都是对象,每个操作都是方法调用。如:+
都是方法调用,1+2
实际上是调用了Int
类定义的、一个叫做+
的方法。- 与
Scala
不同,Java/C++
中的基本数据类型都不是对象,在这些语言中允许不是对象的value
存在。 - 与
Scala
不同,Java/C++
中允许不以任何对象的成员形式存在的静态字段和静态方法。
另外,在
Scala
中可以定义名字像操作符的方法,这样就可以用操作符表示法来调用。如:obj ! msg
,!
就是自定义的一个方法的名字。而且,
Scala
中函数就是对象,函数的类型是一个可以被继承的类,函数本身就是这个类的对象。- 与
函数式编程有两大核心理念:
函数是一等公民,其地位与整数、字符串等相同。
- 可以将函数作为参数传递给其它函数,也可以返回函数作为某个函数的返回值,也可以将函数保存在变量里。
- 可以在函数中定义另一个函数,就像在函数中定义整数一样。
- 可以在定义函数时不指定名字,这称作函数字面量,就像整数字面量
10
一样。
与
Scala
不同,Java/C/C++
中的函数是二等公民。程序中的操作应该将输入值映射成输出值,而不是原地修改数据。即:方法调用不应该产生副作用,方法只能通过接收入参、返回结果这两种方式与外部环境通信。
不可变数据结构是函数式编程的基础之一,
Scala
类库在Java API
的基础上定义了更多的不可变数据类型。如:不可变列表、不可变元组、不可变set
、不可变map
。函数式编程鼓励采用不可变数据结构和
referential transparent
的方法。referential transparent
方法指的是:对任何给定的输入,该方法调用都可以直接被其结果替换,同时不会影响程序的语义。如:c=f(a)
,假设f(a)
的结果是100
,则该语句用c=100
替换不会对程序有任何影响。
1.2 Scala 优势
Scala
与Java
高度兼容。Scala
运行在标准的Java
平台上,可以和所有Java
类库无缝协作:Scala
程序会被编译成JVM
字节码,因此Scala
程序运行期性能通常与Java
程序相差无几。Scala
代码可以调用Java
方法、访问Java
字段、从Java
类继承、实现Java
接口。这并不需要任何特殊的语法或者额外的代码。Scala
重度复用了Java
的数据类型。如:Scala
的Int
是用Java
的基本类型int
实现的。Scala
的Float
是用Java
的基本类型float
实现的。Scala
的Boolean
是用Java
的基本类型boolean
实现的。Scala
的数组被映射成Java
的数组。Scala
的字符串字面量是一个java.lang.String
。Scala
抛出的异常必须是java.lang.Throwable
的子类。
基本上所有的
Java
基本数据类型在Scala
包中都有对应的类,当Scala
代码编译成Java
字节码时,Scala
编译器会尽量使用Java
基本数据类型从而达到更优的性能。也可以在
Java
中调用Scala
的代码。但是由于Scala
比Java
表达能力更为丰富,因此Scala
某些高级特性需要经过加工之后才能映射到Java
。
Scala
程序通常都很短。与Java
相比,Scala
代码行数可以相差一个量级。更少的代码不仅意味着更少的打字,也意味着更少的bug
和更容易阅读与理解。Scala
更少的代码归因于以下几点:Scala
语法避免了Java
程序中的一些样板代码boilerplate
。如:Scala
中分号是可选的,通常大家也不写分号。Scala
代码支持类型推断,因此冗余的类型信息可以去掉,这使得代码更为紧凑。Scala
提供了大量工具来定义功能强大的类库,使得代码更加精炼。
Scala
是静态类型的,它拥有非常先进的静态类型系统。Scala
通过类型推断避免了代码中到处是类型声明,从而导致代码过于罗嗦的问题。Scala
通过模式匹配、创建新类型、类型组合的方式灵活的使用类型。
静态类型系统的优点:
可以证明某些运行期错误不可能发生。
- 虽然这种保障比较简单,但这是真正的保障,不是单元测试所能提供的。
- 静态类型系统不能代替单元测试,但是它可以减少单元测试的数量。
可以安全的对代码进行重构。
静态类型系统是程序化的文档,编译器会检查其正确性。
1.3 语法风格
Scala
的注释风格与Java
相同:行内注释//
,行间注释/*....*/
。Scala
推荐的代码缩进风格是:每个层级缩进2
个空格。Scala
的包和Java
的包很类似,它们都将全局命名空间划分为多个区域,提供了信息隐藏的机制。Scala
命令行参数可以通过args
数组获取,数组下标从0
开始。- 第
0
个参数是真正的命令行参数,而不是脚本文件名。 Scala
数组的索引是圆括号args(0)
,这与Java
不同(Java
是args[0]
)。
- 第
在
Scala
中,每条语句最后的分号通常是可选的:如果当前行只有一条语句,则分号不是必须的;如果当前行有多条语句,则分号是必须的。val s1="hello" ; println(s1) // 必须有分号 println("world") // 不必有分号
如果一条语句跨越多行,则大多数情况下直接换行即可,
Scala
会自动断句:xxxxxxxxxx
if (x<2) println("1") else println("2")但是有时候会产生意外的效果:
xxxxxxxxxx
x +y会被解析成两条语句
x
和+y
。如果希望编译器解析成单条语句x+y
,则有两种做法:使用圆括号:
xxxxxxxxxx
(x +y)将
+
放到行尾。当使用中缀操作符(如+
)来串接表达式时,Scala
风格是将操作符放到行尾:xxxxxxxxxx
x + y
分号推断规则:除非以下任意一条为
true
,否则代码行的末尾就被当作分号处理:- 当前行以一个不能作为语句结尾的词结尾,如:英文句点
.
,中缀操作符。 - 下一行以一个不能作为语句开头的词开头。
- 当前行的行尾出现在圆括号
()
或者方括号[]
内,因为圆括号、方括号不能包含多条语句。
- 当前行以一个不能作为语句结尾的词结尾,如:英文句点
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论