数学基础
- 线性代数
- 概率论与随机过程
- 数值计算
- 蒙特卡洛方法与 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 集合框架
很多不同的集合实现都支持相同的操作。如果对于每种集合类型我们都重新实现这些方法,将产生大量重复的代码,其中大部分代码都是从其他地方拷贝过来的。
随着时间推进,某些集合类库中某个部分添加了新的操作、或者修改了原有操作,这将导致这些代码和其他地方拷贝的代码出现不一致。
为解决该问题,
scala
设计了集合框架,其目标是尽可能避免重复,在尽量少的地方定义每个操作。设计思路是:在集合 “模板” 中实现大多数操作,并由各个基类和实现implementation
灵活地继承。
7.1. 集合构建器
几乎所有的集合操作都是用遍历器
traversal
和构建器builder
来实现的。Traversal
的foreach
方法解决了遍历的部分。Builder
类的实例解决了构建集合的部分。
下面给出了
Builer
类的一个简化版的示例:xxxxxxxxxx
package scala.collection.generic class Builder[-Elem, +To] { def += (elem: Elem): this.type def result(): To def clear() def mapResult[NewTo](f: To => NewTo): Builder[Elem, NewTo]=... }其中
Elem
为元素类型,To
是返回的集合类型。可以用
b += x
向构建器b
添加元素x
;也可以一次性添加多个元素,如b += (x, y)
以及b ++ xs
。result()
方法从构建器中返回一个集合。在获取result
之后,构建器的状态是未定义的,可以调用clear()
方法将它重设为新的空状态。通常,一个构建器可以引用另一个构建器来组装某个集合的元素,不过需要对另外这个构建器的结果进行变换(比如给它一个不同的类型),因此可以通过
Builer
的mapResult
方法来简化。例如,
ArrayBuffer
本身就是一个构建器,因此对它调用result
方法会返回本身。如果希望用ArrayBuffer
来创建一个数组的构建器,则可以用mapResult
:xxxxxxxxxx
val buf = new ArrayBuffer[Int] val bldr = buf mapResult(_.toArray) // builder 为一个 Builder[Int, Array[Int]]
7.2 抽取公共操作
scala
集合遵循“相同结果类型”的原则:只要有可能,对集合的变换操作将交出相同类型的集合。如:filter
操作应用于List
将返回List
类型,应用于Map
将返回Map
类型。scala
集合类库是通过使用所谓的实现特质implementation traits
中的泛型构建器和遍历器来避免代码重复、并达成“相同结果类型” 原则的。这些特质的命名中都带有Like
后缀。例如IndexedSeqLike
是IndexedSeq
的实现特质,TraversableLike
是Traversable
的实现特质。诸如Traversable
或IndexedSeq
这样的集合类的具体方法的实现,都是从这些特质中继承下来的。实现特质不同于一般的集合,它们有两个类型参数:它们不仅在集合元素的类型上是参数化的,它们在集合的表示类型(
representation type
,也就是底层的集合,比如Traversable
类型默认的底层集合为List
) 上也是参数化的。例如,
TraversableLike
特质为:xxxxxxxxxx
trait TraversableLike[+Elem, +Repr] {...}类型参数
Elem
表示集合的元素类型,类型参数Repr
为集合的表示类型。对于
Repr
并没有什么限制,它可以被实例化为不是TraversableLike
的子类,例如String
或者Array
也可以作为Repr
的类型实例化。我们以
filter
为例,这个操作定义在TraversableLike
特质中,只定义了一次,但是对所有集合类都可用。x package scala.collection trait TraversableLike[+Elem, +Repr]{ def newBuiler: Builer[Elem, Repr] // 延迟实现 def foreach[U](f: Elem => U) // 延迟实现 ... def filter(p: Elem => Boolean): Repr = { val b = newBuiler foreach{ elem => if(p(elem)) b += elem} b.result } }
该特质声明了两个抽象方法:
newBuiler
和foreach
,这些方法在具体的集合类中实现。filter
操作对于所有使用这些方法的集合的实现方式都是一致的。- 它首先使用
newBuiler
构造出一个新的、表示类型为Repr
的构建器。 - 然后使用
foreach
遍历当前集合中的所有元素,如果元素满足给定的前提条件,则将该元素添加到构建器中。 - 最后,构建器收集到的元素通过构建器的
result
方法,以Repr
集合类型的实例返回。
- 它首先使用
集合的
map
操作要更复杂一些,因为map
操作的返回类型不一定是原始的集合类型。举个例子:
xxxxxxxxxx
import collection.immutable.BitSet val bits = BitSet(1,2,3) bits map (_ * 2) // 结果是一个 BitSet bits map (_.toFloat) // 结果是一个 Set[Float]可以看到,
map
操作的返回类型取决于传入的函数。Scala
解决该问题的方法是重载:不是Java
采用的那种简单的重载(那样不够灵活),而是隐式参数提供的更系统化的重载。下面给出TraversableLike
的map
实现:xxxxxxxxxx
def map[B, That](f: Elem => B)(implicit bf: CanBuildFrom[Repr, B, That]):That = { val b = bf(this) for (x <- this) b += f(x) b.result }这里主要区别在于:
filter
用的是TraversableLike
的抽象方法newBuilder
,而map
用的是一个以额外的隐式参数的形式传入的、类型为CanBuildFrom
的构建器工厂bf
。CanBuildFrom
特质的定义为:xxxxxxxxxx
package scala.collection.generic trait CanBuildFrom[-From, -Elem, +To]{ // 创建新的构建器 def apply(from: From): Builder[Eleem, To] }该特质代表了构建器工厂,有三个类型参数:
Elem
表示要构建的集合的元素类型,To
表示要构建的集合类型(即:目标集合类型),From
表示从哪个集合来构建。通过定义正确的构建器工厂的隐式定义,可以按需定制正确的类型行为。
例如,
BitSet
类的伴生对象包含一个类型为CanBuildFrom[BitSet, Int, BitSet]
的构建器工厂。这意味着当操作一个BitSet
时,可以构造出另一个BitSet
,只要构建的集合的元素类型为Int
。如果集合类型不是
Int
,则退而求其次,采用另一个隐式构建器工厂,一个在mutable.Set
伴生对象中实现的隐式构建器工厂。这是一个更通用的构建器工厂,定义为(其中A
为泛型的类型参数):CanBuildFrom[Set[_]],A, Set[A]]
。这意味着当操作一个以Set[_]
通配类型表示的任意类型的Set
时,仍然可以构建出一个Set
,而无论元素类型A
是什么。有了这两个
CanBuildFrom
的隐式实例,就可以依赖Scala
的隐式解析规则来选取合适的、并且是最具体的那个构建器工厂了。上述机制对于静态类型的
map
处理较好,但是动态类型的map
还需要一层额外的处理机制。xxxxxxxxxx
val xs: Iterable[Int] = List(1,2,3) // xs 静态类型为 Iterable,动态类型为 List val ys = xs.map(x => x*x) // ys 的静态类型为 Iterable, 动态类型也为 ListCanBuildFrom
的apply
方法接受原始集合作为入参传入,大多数构建器工厂都将这个调用转发到原始集合的genericBuilder
方法,这个genericBuilder
方法进行调用属于该集合的构建器。即:
scala
使用静态的隐式解析规则来决定map
的类型约束,用虚拟分发来选择与这些类型约束相对应的最佳动态类型。Map/Array
都是一种函数,因为它们都继承自Function1
特质,并且有apply
方法。如:xxxxxxxxxx
val m = Map("a" -> 1, "b" -> 2) m("a") // 就像函数调用一样 val arr = Array("a","b","c") arr(0) // 就像函数调用一样如果想要自定义一个新的集合类库到框架中,需要注意如下几点:
- 决定该集合是可变的还是不可变的。
- 选择合适的特质作为集合的基础。
- 从合适的实现特质继承来实现大多数集合操作。
- 如果你想让
map
和类似操作返回你的集合类型,你需要在你的类的伴生对象中提供一个隐式的CanBuildFrom
。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论