数学基础
- 线性代数
- 概率论与随机过程
- 数值计算
- 蒙特卡洛方法与 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
- 并发
十、Map
Map
是由键值对组成的Iterable
。scala
的Predef
类提供了一个隐式转化, 让我们可以用key -> value
这样的写法来表示(key, value)
这样的pair
。 因此Map ( "x" -> 1, "y" -> 2)
和Map(("x",1), ("y",2))
的含义完全 相同, 但是前者更易读。与
Set
类似,Scala
也提供了可变、不可变版本的Map
。Set(),mutable.Set(),Map(),mutable.Map()
等工厂方法返回的Set
和Map
其实都是不同的类型。对于可变的
mutable.Set()
工厂方法,它返回的是mutable.HashSet
对象。对于可变的
mutable.Map()
工厂方法,它返回的是mutable.HashMap
对象。不可变的
Set()
工厂方法返回的类型取决于我们传入多少个元素。对于少于五个元素的Set
,有专门特定大小的类与之对应从而达到最佳性能;大于等于五个元素的Set
返回的是HashSet
类型。- 零个元素:
immutable.EmptySet
。 - 一个元素:
immutable.Set1
。 - 二个元素:
immutable.Set2
。 - 三个元素:
immutable.Set3
。 - 四个元素:
immutable.Set4
。 - 五个或更多元素:
immutable.HashSet
。
- 零个元素:
同理,不可变的
Map()
工厂方法返回的类型取决于我们传入多少个元素。对于少于五个元素的Map
,有专门特定大小的类与之对应从而达到最佳性能;大于等于五个元素的Map
返回的是HashMap
类型。- 零个:
immutable.EmptyMap
。 - 一个:
immutable.Map1.
。 - 二个:
immutable.Map2
。 - 三个:
immutable.Map3
。 - 四个:
immutable.Map4
。 - 五个或更多:
immutable.HashMap
。
- 零个:
默认的不可变实现可以提供最佳性能。另外,如果添加一个元素到
EmptySet
,则返回一个Set1
对象。如果从Set1
对象移除一个元素,则得到一个EmptySet
对象。可以通过
+=
和->
来向Map
中添加键值对。xxxxxxxxxx
import scala.collection.mutable val map1 = mutable.Map[Int,String]() map1 += (1 ->"1") map1 += (2 ->"2")1 -> "1"
转换成标准的方法调用,即1.->("1")
。你可以在任何对象上调用
->
方法,它返回的是一个二元元组。+=
将调用map1
对象的.+=()
方法,向map1
中添加键值对。
Map
特质和操作和Set
类似:查找:
ms get k
: 以Option
表示的、ms
中跟键k
关联的值, 如果没有对应的k
则返回None
。ms(k)
: 返回ms
中跟键k
关联的值, 如果没有对应的k
则抛出异常。ms apply k
: 等价于ms(k)
。ms getOrElse(k,d)
: 返回ms
中跟键k
关联的值, 如果没有对应的k
则返回d
。ms contains k
: 测试ms
中是否包含键k
。ms isDefinedAt k
: 等价于ms contains k
。
添加和更新:
ms + (k -> v)
: 创建一个包含ms
和给定k -> v
键值对的新的Map
。ms + (k -> v, w-> u)
: 创建一个包含ms
和给定k -> v, w -> u
键值对的新的Map
。ms + kvs
: 创建一个包含ms
和给定kvs
包含的所有键值对的新的Map
。ms updated(k,v)
: 等价于ms + (k -> v)
移除:
ms - k
: 创建一个包含ms
所有映射关系、但不包含键k
的新的Map
。ms - (k,l,m)
: 创建一个包含ms
所有映射关系、但不包含键k,l,m
的新的Map
。ms -- ks
: 创建一个包含ms
所有映射关系、但不包含ks
中所有键的新的Map
。
子集合:
ms.keys
: 返回ms
中所有键的Iterable
。ms.keySet
: 返回ms
中所有键的Set
。ms.keysIterator
: 返回一个迭代器, 该迭代器迭代时交出ms
中每个键。ms.values
: 返回ms
中所有值的Iterable
。ms.valuesIterator
: 返回一个迭代器, 该迭代器迭代时交出ms
中每个值。
变换
transform
:ms filterKeys p
: 只包含ms
中那些键满足条件p
的映射关系的Map
视图。ms mapValues f
: 通过对ms
中每个value
应用函数f
得到的Map
视图。
mutable.Map
特质的操作:添加和更新:
ms(k) = v
: 以副作用将k -> v
映射关系添加到ms
, 或者更新ms
的键k
对应的值。 也可以写作ms.update(k, v)
。ms += (k -> v)
: 以副作用的方式将k -> v
映射关系添加到ms
, 返回ms
本身。ms += (k1 -> v1, k2 -> v2)
: 以副作用的方式将k1 -> v1, k2 -> v2
映射关系添加到ms
, 返回ms
本身。ms ++= kvs
: 以副作用的方式将kvs
中的映射关系添加到ms
, 并返回ms
本身。ms put (k, v)
: 将k -> v
映射关系添加到ms
中, 并以Option
的方式返回之前与k
关联的值。ms getOrElseUpdate(k, d)
: 如果键k
在ms
中有定义, 则返回关联的值。否则用k -> d
更新ms
并返回d
。
移除:
ms -= k
: 以副作用的方式移除键k
的映射关系, 并返回ms
本身。ms -= (l, k, m)
: 以副作用的方式从ms
移除给定键的映射关系, 并返回ms
本身。ms --= ks
: 以副作用的方式从ms
移除ks
中所有键的映射关系, 并返回ms
本身。ms remove k
: 从ms
中移除键k
的映射关系并以Option
的形式返回键k
之前关联的值。ms retrain p
: 仅保留ms
中那些键满足条件p
的映射关系。ms.clear()
: 从ms
中移除所有的映射关系。
变换和克隆
ms transform f
: 用函数f
变化ms
中所有关联的key-value
的pair
对。f
的输入包括key
和value
。ms.clone
: 返回跟ms
包含相同映射关系的新的可变映射。
和
Set
一样,Map
的添加和移除操作涉及到对象的拷贝, 因此不常用。相比之下,mutable.Map
的添加和移除使用得更多。mutable.Map.getOrElseUpdate
适合用作对cache
的映射的访问:xxxxxxxxxx
def f(x :String) :String = { .... // 这里需要经历一个开销巨大的计算, 如连接数据库或者发送网络请求 } val cache = collection.mutable.Map[String, String]() def cachedF(s : String) = cache.getOrElseUpdate(s, f(s))注意:
getOrElseUpdate
方法的第二个参数是传名by-name
的, 因此只有当getOrElseUpdate
需要第二个参数的值时,f(s)
的计算才会真正执行。有时候我们需要迭代器按照特定顺序迭代的
Set
或Map
,对此Scala
提供了SortedSet
和SortedMap
这两个Trait
。这些Trait
被TreeSet
和TreeMap
类实现,这些实现采用红黑树来保持元素(对于TreeSet
)或者键(对于Map
)的顺序,具体顺序由Ordered Trait
决定,Set
元素的类型或者Map
键的类型必须都混入了Ordered Trait
或者能够被隐式转换为Ordered
。这两个类只有不可变的版本。
xxxxxxxxxx
import scala.collection.immutable.{TreeSet,TreeMap} val ts = TreeSet(1,9,2,4,8) val tm = TreeMap(1 -> "a",9 -> "b", 2 -> "c")可变集合类型和不可变集合类型的选择:
通常首选采用不可变集,因为不可变集合容易理解和使用。
在元素不多的情况下,不可变集合通常比可变集合更紧凑。
- 一个空的可变
Map
,如果按照默认的HashMap
实现,会占用80
字节,每增加一项需要额外的1.6
字节。 - 而一个空的不可变
Map
是个单例对象,它被所有引用共享,因此使用它本质上只需要一个指针的大小。
因此对于小型的
Map
和Set
,不可变版本比可变版本紧凑的多,可以节省大量空间,并带来重要的性能优势。- 一个空的可变
Scala
提供了一些语法糖来让不可变Set
和可变Set
的切换更加容易。如:虽然不可变
Set
不支持+=
操作,但是Scala
提供了一个变通途径:只要看到a += b
而a
并不支持+=
方法,则Scala
尝试将其解读为a = a + b
。此时a
必须被声明为var
而不是val
。xxxxxxxxxx
val a = Set(1,2,3) var c = Set(1,2,3) a + = 4 // 不支持 c + = 4 // 等价于 c = c + 4, c 指向一个新的 Set同样的思想适合所有以
=
结尾的方法。 这时候只需要将Set
替换为mutable.Set
就能够用很小的代价来替换到可变Set
的版本。这样的特殊语法不仅适合于
Set
,它也适合于Map
、以及所有的值类型。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论