在之前我也看了很多人写的推荐系统的博客,理论的、算法的都有,多是个人的理解和感悟,虽然很深刻,但是对于自己而言还是不成系统,于是我参考大牛项亮编著的《推荐系统实践》将该领域知识系统整理一遍,与大家一起学习。
本系列对应的代码请查看https://github.com/wangyuyunmu/Recommended-system-practice

前面总结推荐系统常用的数据、算法、架构,但是都是在讨论TopN推荐,本文总结评分预测问题。


目录

  • 1,离线实验方法
  • 2,评分预测算法
    • 2.1 平均值
      • 2.1.1 全局平均
      • 2.1.2 用户评分平均值
      • 2.1.3 用户评分平均值
      • 2.1.4 用户分类对物品分类的平均值
    • 2.2 基于邻域的方法
    • 2.3 隐语义模型与矩阵分解
      • 2.3.1 传统的SVD分解
      • 2.3.2 Simon Funk的SVD分解(又名LFM)
      • 2.3.3 加入偏置后的LFM
      • 2.3.4 SVD++(考虑邻域影响的LFM)
    • 2.4 加入时间信息
      • 2.4.1 基于邻域的模型融合时间信息
      • 2.4.2 基于矩阵分解的模型融合时间信息
    • 2.5 模型融合
      • 2.5.1 模型级联融合
      • 2.5.2 模型加权融合

TopN即给定一个用户,如何给他生成一个长度为N的推荐列表,使该推荐列表能够尽量满足用户的兴趣和需求。实际系统绝大多数情况下就是给用户提供一个包括N个物品的个性化推荐列表。

但是推荐系统研究最早是评分预测问题开始的。评分预测问题最基本的数据集就是用户评分数据集。该数据集由用户评分记录组成,每一条评分记录是一个三元组(u,i,r)(u,i, r)(u,i,r),表示用户 uuu 给物品 iii 赋予了评分 rrr,本章用ruir_{ui}rui​表示用户u对物品i的评分。

因为用户不可能对所有物品都评分,因此评分预测问题就是如何通过已知的用户历史评分记录预测未知的用户评分记录。 比如下图所示:
我们希望能够给出一个分数表明我们认为用户是否会喜欢这部电影,同时这个分数也可以帮助用户绝是否要看这部电影。因此,如何提高这个分数的预测精度就是评分预测要解决的问题。

1,离线实验方法

一般评分预测问题都是离线实验,在给定用户评分数据集后,研究人员会将数据集按照一定的方式分成训练集和测试集,然后根据测试集建立用户兴趣模型来预测测试集中的用户评分。一般用均方根误差RMSE度量预测的精度。
RMSE=∑(u,i)∈T(rui−r^ui)∣Test∣RMSE = \frac{\sum_{(u,i)\in T}(r_{ui}-\hat{r}_{ui})}{|Test|}RMSE=∣Test∣∑(u,i)∈T​(rui​−r^ui​)​
划分训练集与测试集:
1)如果与时间无关的任务,可以以均匀分布随机划分数据集。
2)如果时域时间相关的任务,需要将用户的旧行为作为训练集,新行为作为测试集。

2,评分预测算法

2.1 平均值

最简单的,利用平均值预测用户对物品的评分。

2.1.1 全局平均

它的定义为训练集中所有评分记录的评分平均值。
r^ui=∑(u,i)∈trainrui∑(u,i)∈train1\hat{r}_{ui}=\frac{\sum_{(u,i)\in{train}}r_{ui}}{\sum_{(u,i)\in{train}}1}r^ui​=∑(u,i)∈train​1∑(u,i)∈train​rui​​

2.1.2 用户评分平均值

定义为用户u在训练集中所有评分的平均值。
r^u=∑i∈N(u)rui∑i∈N(u)1\hat{r}_u=\frac{\sum_{i\in N(u)}r_{ui}}{\sum_{i\in N(u)}1}r^u​=∑i∈N(u)​1∑i∈N(u)​rui​​

2.1.3 用户评分平均值

定义为物品i在训练集中接受的所有评分的平均值
r^i=∑u∈N(i)rui∑u∈N(i)1\hat{r}_i = \frac{\sum_{u\in{N(i)}}r_{ui}}{\sum_{u\in{N(i)}}1}r^i​=∑u∈N(i)​1∑u∈N(i)​rui​​
以上三种平均值预测,分别是从0维度、用户维度、物品维度进行计算。

2.1.4 用户分类对物品分类的平均值

我们可以利用训练集中同类用户对同类物品评分的平均值预测用户对物品的评分。
r^ui=∑(v,j)∈Train,ϕ(u)=ϕ(v),ϕ(i)=ϕ(j)rvj∑(v,j)∈Train,ϕ(u)=ϕ(v),ϕ(i)=ϕ(j)1\hat{r}_{ui}=\frac{\sum_{(v,j)\in{Train},\phi(u)=\phi(v),\phi(i)=\phi(j)}r_{vj}}{\sum_{(v,j)\in{Train},\phi(u)=\phi(v),\phi(i)=\phi(j)}1}r^ui​=∑(v,j)∈Train,ϕ(u)=ϕ(v),ϕ(i)=ϕ(j)​1∑(v,j)∈Train,ϕ(u)=ϕ(v),ϕ(i)=ϕ(j)​rvj​​
上式进一步对用户维度和物品维度进行粒度划分,相似用户、相似物品。这是一种普遍意义的表达方式,比如用户类别为u,不区分物品类别,就成了用户评分平均值

用户类别、物品类别如何划分?可以从如下角度区分。
1)用户和物品的平均分
计算用户或者物品的评分平均分,排序,分成N份。

    #对于每个用户,用户对物品评价的平均分进行排名。这里区别于用户活跃度。def __init__(self, records):Cluster.__init__(self, records)vote, cnt = {}, {}for r in records:if r.test: continueif r.user not in vote:vote[r.user] = 0cnt[r.user] = 0vote[r.user] += r.ratecnt[r.user] += 1# 按照物品平均评分进行分组for user, v in vote.items():c = v / (cnt[user] * 1.0)self.group[user] = int(c * 2)

2)用户活跃度和物品流行度
用户行为的物品数量定义活跃度,给物品评分的用户数目定义流行度。

    # 按照用户活跃度进行分组,用户id对应不同的group。def __init__(self, records):Cluster.__init__(self, records)activity = {}for r in records:if r.test: continueif r.user not in activity:activity[r.user] = 0activity[r.user] += 1# 按照用户活跃度进行分组k = 0for user, n in sorted(activity.items(), key=lambda x: x[-1], reverse=False):c = int((k * 5) / len(activity))self.group[user] = ck += 1

2.2 基于邻域的方法

基于用户的邻域算法和基于物品的邻域算法都可以应用到评分预测中。

基于用户的邻域算法认为,预测一个用户对一个物品的评分,需要考虑和这个用户相似用户对该物品的评分。
r^ui=rˉu+∑v∈S(u,K)∩N(i)wuv(rvi−rˉv)∑v∈S(u,K)∩N(i)∣wuv∣\hat{r}_{ui} = \bar{r}_{u}+\frac{\sum_{v\in{S(u,K)\cap N(i)}}w_{uv}(r_{vi}-\bar{r}_v)}{\sum_{v\in{S(u,K)\cap N(i)}}|w_{uv}|}r^ui​=rˉu​+∑v∈S(u,K)∩N(i)​∣wuv​∣∑v∈S(u,K)∩N(i)​wuv​(rvi​−rˉv​)​
公式的解释:用户u对物品i的预测值,包含两部分:1)用户u本身的评分习惯rˉu\bar{r}_urˉu​;2)与用户u相关的用户v的评分(去除v的评分习惯)的期望值。
这里用户的相关性不再是通过用户行为极计算,用皮尔逊相关系数计算。
wuv=∑i∈I(rui−rˉu)(rvi−rˉv)∑i∈I(rui−rˉu)2(rvi−rˉv)2w_{uv}=\frac{\sum_{i\in I}(r_{ui}-\bar{r}_u)(r_{vi}-\bar{r}_v)}{\sqrt{\sum_{i\in I}(r_{ui}-\bar{r}_u)^2(r_{vi}-\bar{r}_v)^2}}wuv​=∑i∈I​(rui​−rˉu​)2(rvi​−rˉv​)2​∑i∈I​(rui​−rˉu​)(rvi​−rˉv​)​
同样的基于物品的邻域算法,预测用户u对物品i的评分时,会参考用户u对物品i相似的物品j的评分:
r^ui=rˉi+∑j∈S(i,K)∩N(u)wij(ruj−rˉj)∑j∈S(i,K)∩N(u)∣wij∣\hat{r}_{ui} = \bar{r}_{i}+\frac{\sum_{j\in{S(i,K)\cap N(u)}}w_{ij}(r_{uj}-\bar{r}_j)}{\sum_{j\in{S(i,K)\cap N(u)}}|w_{ij}|}r^ui​=rˉi​+∑j∈S(i,K)∩N(u)​∣wij​∣∑j∈S(i,K)∩N(u)​wij​(ruj​−rˉj​)​

对于物品相似度w的计算一般有三种方法:
1)余弦相似度
wij=∑u∈Uruiruj∑u∈Urui2∑u∈Uruj2w_{ij}=\frac{\sum_{u\in U}r_{ui}r_{uj}}{\sqrt{\sum_{u\in U}r_{ui}^2}\sqrt{\sum_{u\in U}r_{uj}^2}}wij​=∑u∈U​rui2​​∑u∈U​ruj2​​∑u∈U​rui​ruj​​
2)皮尔逊系数
wij=∑u∈U(rui−rˉi)(ruj−rˉj)∑u∈U(rui−rˉi)2∑u∈U(ruj−rˉj)2w_{ij}=\frac{\sum_{u\in U}(r_{ui}-\bar{r}_i)(r_{uj}-\bar{r}_j)}{\sqrt{\sum_{u\in U}(r_{ui}-\bar{r}_i)^2\sqrt{\sum_{u\in U}(r_{uj}-\bar{r}_j)^2}}}wij​=∑u∈U​(rui​−rˉi​)2∑u∈U​(ruj​−rˉj​)2​​∑u∈U​(rui​−rˉi​)(ruj​−rˉj​)​
3)改进的余弦相似度
wij=∑u∈U(rui−rˉu)(ruj−rˉu)∑u∈U(rui−rˉu)2∑u∈U(ruj−rˉu)2w_{ij}=\frac{\sum_{u\in U}(r_{ui}-\bar{r}_u)(r_{uj}-\bar{r}_u)}{\sqrt{\sum_{u\in U}(r_{ui}-\bar{r}_u)^2\sqrt{\sum_{u\in U}(r_{uj}-\bar{r}_u)^2}}}wij​=∑u∈U​(rui​−rˉu​)2∑u∈U​(ruj​−rˉu​)2​​∑u∈U​(rui​−rˉu​)(ruj​−rˉu​)​
三种方法不分优劣,根据不同的情况效果也不一样。

2.3 隐语义模型与矩阵分解

隐含类别模型(Latent Class Model)、隐语义模型(Latent Factor Model)、pLSA、LDA、Topic Model、Matrix Factorization、Factorized Model。

以上这些算法本质上是同一种思想体系。推荐领域提的最多的是隐语义模型与矩阵分解模型,他们解决的问题都是通过降维的方法将评分矩阵补全。

用户的评分行为可以表示成一个评分矩阵R,其中R[u][i]就是用户u对物品i的评分。但是,用户不会对所有的物品评分,所以这个矩阵里有很多元素都是空的,这些空的元素称为缺失值(missing value)。因此,评分预测从某种意义上说就是填空。

2.3.1 传统的SVD分解

补全一个矩阵要对矩阵造成比较小的扰动,怎样算扰动小呢?一般意义来说,补全后矩阵的特征值变化不大,则扰动较小。所以最早的矩阵分解模型都是从SVD分解开始的。

首先将矩阵R中的缺失值简单的填充,比如平均值,得到R’,然后对矩阵进行SVD分解:
R′=UTSVR'=U^TSVR′=UTSV选取最大的f个奇异值组成对角矩阵S’
Rf′=UfTSfVfR'_f=U_f^TS_fV_fRf′​=UfT​Sf​Vf​即用户u对物品i的评分预测矩阵。

该方法很难再实际系统应用,缺点:
1)该方法首先需要用一个简单的方法补全稀疏评分矩阵。其实,一般的评分矩阵95%都是缺失的,如果补全,就成了稠密矩阵,存储空间很大。
2)SVD分解计算复杂,速度慢。

2.3.2 Simon Funk的SVD分解(又名LFM)

为了解决SVD的两个缺点,提出了LFM,从矩阵分解的角度说,如果我们将评分矩阵R分解为两个低维矩阵相乘:
R^=PTQ\hat{R}=P^TQR^=PTQ那么,对于用户u和物品i的评分的预测值可以通过以下公式计算:
r^ui=∑fPufQif\hat{r}_{ui}=\sum_fP_{uf}Q_{if}r^ui​=f∑​Puf​Qif​那么,Simon Funk的思想很简单:可以直接通过训练集中的观察值利用最小化RMSE学习P、Q矩阵
C(p,q)=∑(u,i)∈Train(rui−∑f=1Fpufqif)2+λ(∣∣pu∣∣2+∣∣qi∣∣2)C(p,q)=\sum_{(u,i)\in Train}(r_{ui}-\sum_{f=1}^Fp_{uf}q_{if})^2+\lambda(||p_u||^2+||q_i||^2)C(p,q)=(u,i)∈Train∑​(rui​−f=1∑F​puf​qif​)2+λ(∣∣pu​∣∣2+∣∣qi​∣∣2)其中的梯度优化方法参考推荐系统3——隐语义分析(LFM)

LFM提出以后获得了巨大成功,后来的很多模型都是对LFM的修修补补。

2.3.3 加入偏置后的LFM

r^ui=u+bu+bi+puTqi\hat{r}_{ui}=u+b_u+b_i+p_u^Tq_ir^ui​=u+bu​+bi​+puT​qi​
这个预测公式加入了三项:
uuu: 训练集中所有记录的评分的全局平均分。从整体数据集分布的角度给出平均分,作为一个基准,有些数据集评分比较高,有的普遍低
bub_ubu​,用户偏置,每个用户的评分习惯
iui_uiu​,物品偏置,每个物品自身的品质因素。

2.3.4 SVD++(考虑邻域影响的LFM)

前面的LFM模型中并没有显式地考虑用户的历史行为对用户评分预测的影响,SVD++将用户的历史评分加入到LFM模型中。

在介绍SVD++之前,我们首先讨论一下如何将基于邻域的方法也像LFM那样设计成一个可以学习的模型:
1)itemCF
r^ui=1N(u)∑j∈N(u)wijruj\hat{r}_{ui}=\frac{1}{\sqrt{N(u)}}\sum_{j\in N(u)}w_{ij}r_{uj}r^ui​=N(u)​1​j∈N(u)∑​wij​ruj​w的优化方法如下:
C(w)=∑(u,i)∈Train(rui−∑j∈N(u)wijruj)2+λwij2C(w)=\sum_{(u,i)\in Train}(r_{ui}-\sum_{j\in N(u)}w_{ij}r_{uj})^2+\lambda w_{ij}^2C(w)=(u,i)∈Train∑​(rui​−j∈N(u)∑​wij​ruj​)2+λwij2​个人觉得这里的1N(u)\frac{1}{\sqrt{N(u)}}N(u)​1​权值没必要再这里体现。这里的权值,先不用管,首先从loss函数上看,并没有这个系数,说明优化的时候没有考虑,实际预测的时候加的,为什么会加,往后看。

对比公式:
LFM计算u对i预测值,需要同时优化用户u与隐语义f、隐语义与物品item之间的关系。
ItemCF计算u与i的相关性,需要考虑用户u与item j、item j与item i之间的相关性(cos)。
ItemCF计算u对i的预测值,计算所有与用户物品j相关的i的系数、用到u对i的评分。

改进1)
这里w是一个比较稠密的矩阵,如果物品有n个,其参数的个数将会是nn个,参数多,容易过拟合。这里对矩阵w进行分解,参数降低到2n*F个。
r^ui=1N(u)∑j∈N(u)xiTyj=1N(u)xiT∑j∈N(u)yj\hat{r}_{ui}=\frac{1}{\sqrt{N(u)}}\sum_{j\in N(u)}x_{i}^Ty_{j}=\frac{1}{\sqrt{N(u)}}x_{i}^T\sum_{j\in N(u)}y_{j}r^ui​=N(u)​1​j∈N(u)∑​xiT​yj​=N(u)​1​xiT​j∈N(u)∑​yj​

改进2):
将本模型与LFM相加,得到如下模型:
r^ui=u+bu+bi+puTqi+1N(u)xiT∑j∈N(u)yj\hat{r}_{ui}=u+b_u+b_i+p_u^Tq_i + \frac{1}{\sqrt{N(u)}}x_{i}^T\sum_{j\in N(u)}y_{j}r^ui​=u+bu​+bi​+puT​qi​+N(u)​1​xiT​j∈N(u)∑​yj​为了不增加太多参数,令x=q得到最终的SVD++模型(这里pq是一个标量):
r^ui=u+bu+bi+qiT(pu+1N(u)∑j∈N(u)yj)\hat{r}_{ui}=u+b_u+b_i+q_i^T(p_u + \frac{1}{\sqrt{N(u)}}\sum_{j\in N(u)}y_{j})r^ui​=u+bu​+bi​+qiT​(pu​+N(u)​1​j∈N(u)∑​yj​)现在来看SVD++模型,公式在隐语义项中添加yjy_jyj​,yjy_jyj​为隐藏的“评价了电影 j”反映出的个人喜好偏置,其中设置了收缩因子,收缩因子取集合大小的根号是一个经验公式,并没有理论依据。

2.4 加入时间信息

利用时间信息的方法也主要分成两种,一种是将时间信息应用到基于邻域的模型中,另一种是将时间信息应用到矩阵分解模型中。下面将分别介绍这两种算法。

2.4.1 基于邻域的模型融合时间信息

将时间信息融入到基于邻域的模型itemCF中。
r^uit=∑j∈N(u)f(wij,Δt)ruj∑j∈N(u)f(wij,Δt)\hat{r}_{uit}=\frac{\sum_{j\in{N(u})}f(w_{ij},\Delta t)r_{uj}}{\sum_{j\in{N(u})}f(w_{ij},\Delta t)}r^uit​=∑j∈N(u)​f(wij​,Δt)∑j∈N(u)​f(wij​,Δt)ruj​​这里Δt\Delta tΔt是用户对物品i和物品j评论的时间差,w是ij的相似度:

f(wij,Δt)=σ(δwijexp(−∣Δt∣β)+γ)f(w_{ij},\Delta t)=\sigma(\delta w_{ij}exp(\frac{-|\Delta t|}{\beta})+\gamma)f(wij​,Δt)=σ(δwij​exp(β−∣Δt∣​)+γ)σ(x)=11+exp(−x)\sigma(x)=\frac{1}{1+exp(-x)}σ(x)=1+exp(−x)1​

2.4.2 基于矩阵分解的模型融合时间信息

引入时间信息后,矩阵不再是二维的,变成了一个三维的矩阵。
没有时间信息的时候,BiasSVD的公式如下。
r^ui=u+bu+bi+puTqi\hat{r}_{ui}=u+b_u+b_i+p_u^Tq_ir^ui​=u+bu​+bi​+puT​qi​分解来看,其中包含了二维矩阵的0矩阵分解uuu、一维矩阵分解bub_ubu​,bib_ibi​,二维矩阵分解pqpqpq加入时间信息后我们可以对用户—物品—时间三维矩阵做如下分解:
r^uit=u+bu+bi+bt+puTqi+xuTyt+siTzt+∑fgufhifltf\hat{r}_{uit}=u+b_u+b_i+b_t+p_u^Tq_i + x_u^Ty_t + s_i^Tz_t + \sum_fg_{uf}h_{if}l_{tf}r^uit​=u+bu​+bi​+bt​+puT​qi​+xuT​yt​+siT​zt​+f∑​guf​hif​ltf​

SVD++模型的基础上也可以引入时间效应

这里, utu tut 是用户所有评分的平均时间。period(t)考虑了季节效应,可以定义为时刻t所在的月份。该模型同样可以通过随机梯度下降法进行优化。

2.5 模型融合

Netflix Prize的最终获胜队伍通过融合上百个模型的结果才取得了最终的成功。由此可见模型融合对提高评分预测的精度至关重要。本节讨论模型融合的两种不同技术。

2.5.1 模型级联融合

假设已经有一个预测器rˆ(k ) ,对于每个用户—物品对(u, i)都给出预测值,那么可以在这个预测器的基础上设计下一个预测器rˆ(k +1)来最小化损失函数:
C=∑(u,i)∈Train(rui−r^ui(k)−r^ui(k+1))C=\sum_{(u,i)\in Train}(r_{ui}-\hat{r}_{ui}^{(k)}-\hat{r}_{ui}^{(k+1)})C=(u,i)∈Train∑​(rui​−r^ui(k)​−r^ui(k+1)​)由上面的描述可以发现,级联融合很像Adaboost算法。和Adaboost算法类似,该方法每次产生一个新模型,按照一定的参数加到旧模型上去,从而使训练集误差最小化。不同的是,这里每次生成新模型时并不对样本集采样,针对那些预测错的样本,而是每次都还是利用全样本集进行预测,但每次使用的模型都有区别

2.5.2 模型加权融合

假设我们有K个不同的预测器,如何将他们的结果组合在一起?
最简单的方法就是线性融合:
r^=∑k=1Kαkr^(k)\hat{r}=\sum_{k=1}^K\alpha_{k}\hat{r}^{(k)}r^=k=1∑K​αk​r^(k)由此看来,模型的训练过程分为两步。第一步训练每个模型,第二步训练模型的权值。所以一般会将训练集分成两部分,一部分做模型训练,一部分做权值训练

除了线性融合,还有很多复杂的融合方法,比如利用人工神经网络的融合算法。其实,模型融合问题就是一个典型的回归问题,因此所有的回归算法都可以用于模型融合。

推荐系统10——评分预测问题相关推荐

  1. python对电影进行预测评分_推荐系统—影视评分预测

    本文根据Andrew Ng的 Machine Learning 的课写就. ======================================= 一.预测电影评分 ============= ...

  2. 推荐系统实践读书笔记-08评分预测问题

    推荐系统实践读书笔记-08评分预测问题 本书到目前为止都是在讨论TopN推荐,即给定一个用户,如何给他生成一个长度为N的推荐列表,使该推荐列表能够尽量满足用户的兴趣和需求.本书之所以如此重视TopN推 ...

  3. 推荐系统- 评分预测问题

    内容来源<推荐系统实践> 目前为止都是在讨论TopN推荐,即给定一个用户,如何给他生成一个长度为N的推荐 列表,使该推荐列表能够尽量满足用户的兴趣和需求.本书之所以如此重视TopN推荐,是 ...

  4. 黑马推荐系统项目实战【四】CF的评分预测

    User-based CF评分预测 Item-based CF的评分预测  下面是模拟的小案例(分别采用上面的公式) import pandas as pdusers = ["User1&q ...

  5. ML之回归预测:利用FSR/RiR/BasisExpand/ Lasso/DT/RF/GB算法对红酒品质wine数据集实现红酒口感评分预测(实数值评分预测)

    ML之回归预测:利用FSR/RiR/BasisExpand/ Lasso/DT/RF/GB算法对红酒品质wine数据集实现红酒口感评分预测(实数值评分预测) 目录 输出结果 设计思路 T1.FSR(前 ...

  6. EL之RF(RFR):利用RandomForestRegressor对回归问题(实数值评分预测)建模(调2参)

    EL之RF(RFR):利用RandomForestRegressor对回归问题(实数值评分预测)建模(调2参) 目录 输出结果 设计思路 核心代码 输出结果 设计思路 核心代码 mseOos = [] ...

  7. ML之回归预测之BE:利用BE算法解决回归(实数值评分预测)问题—线性方法解决非线性问题

    ML之回归预测之BE:利用BE算法解决回归(实数值评分预测)问题-线性方法解决非线性问题 目录 输出结果 设计思路 代码实现 输出结果 设计思路 代码实现 for row in xList:newRo ...

  8. ML之PLiR之Glmnet:利用Glmnet算法求解ElasticNet回归类型问题(实数值评分预测)

    ML之PLiR之Glmnet算法:利用Glmnet算法求解ElasticNet回归类型问题(实数值评分预测) 目录 输出结果 1.Glmnet算法 实现代码 输出结果 0 2 1 2 2 2 3 3 ...

  9. Python数据分析高薪实战第十二天 网络服务用户流失预测分析和国产电视剧评分预测分析

    29 综合实战:网络服务用户流失预测与分析 绝大多数互联网公司都面临一个非常重要的问题:用户流失问题.随着互联网和移动互联网的充分发展,发展新用户(也就是一般所说的拉新)的成本越来越高,往往要几块或者 ...

最新文章

  1. NS2安装错误系列(1)
  2. java httpclient put_[工具类-HttpClientUtils]HttpClient之GET PUT DELETE POST
  3. 距离算法在概率统计C语言,基于CBM-TOF探测器无触发数据获取系统的压缩算法-应用概率统计.PDF...
  4. 经常收到信用卡邀请短信,但为什么总是办不下来?
  5. Dubbo-go 服务代理模型
  6. 成为最大的独立开源公司,对SUSE意味着什么? | 人物志
  7. class CT where T : new() 泛型类约束
  8. 代码审计之CVE-2017-6920 Drupal远程代码执行漏洞学习
  9. 1.4信息系统基础-软件构件技术知识
  10. @column注解_SpringBoot 注解方式快速整合Mybatis
  11. JAVA Metrics 度量工具使用介绍
  12. Google Cloud
  13. HTML caption文字颜色,HTML caption align 属性 - HTML 颜色参考手册 - 自强学堂
  14. 2022年北京购房攻略三 (政策篇)
  15. [Android Traffic] android 流量计算方法
  16. 电脑桌面切屏的快捷键
  17. 如何解决打开keil工程软件闪退问题
  18. 自定义TextView支持第三方字体库(以隶书为例)
  19. 2022年最流行的几款软件缺陷管理工具
  20. 2D游戏比3D游戏哪个更好做?游戏行业什么职业最吃香?

热门文章

  1. C++ 面向对象、内存管理
  2. 欧姆龙CP系列PLC以太网通讯连接SCADA介绍
  3. oracle 文本转数字,Oracle:需要将数值转换为文本并保留 - 已解决
  4. c语言程序设计教程这本书,C语言程序设计教程资料(20201209225632).pdf
  5. 网络连接感叹号上不了网怎么办
  6. C++ ARX二次开发视图
  7. 网站使用CDN加速的5个优势
  8. forEach空指针异常问题
  9. 利用python爬虫大量爬取网页图片
  10. chia官方矿池常见问题