如何编程实现基于信息熵进行划分选择的决策树算法,并为表4.3中数据生成一棵决策树?
表4.3在哪里
用sklearn基本只要几行
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier, plot_tree
# 加载鸢尾花数据集
iris = load_iris()
# 构建决策树分类器
dt = DecisionTreeClassifier(criterion='entropy')
# 训练模型
dt.fit(iris.data, iris.target)
# 可视化决策树
plot_tree(dt, filled=True)
如何理解基于图的推荐算法的原理?
如果将个性化推荐算法放到二分图模型上,那么给用户u推荐物品的任务就可以转化为度量用户顶点vuv_uvu和与vuv_uvu没有边直接相连的物品节点在图上的相关性,相关性越高的物品在推荐列表中的权重就越高。
度量图中两个顶点之间相关性的方法主要取决于下面3个因素:①两个顶点之间的路径数;②两个顶点之间路径的长度;③两个顶点之间的路径经过的顶点。
而相关性高的一对顶点一般具有如下特征:①两个顶点之间有很多路径相连;②连接两个顶点之间的路径长度都比较短;③连接两个顶点之间的路径不会经过出度比较大的顶点。
如何计算图中顶点之间相关性?
这里介绍两种方法:①基于随机游走的PersonalRank算法;②基于矩阵论设计算法。
接下来介绍计算图中顶点之间相关性的方法之一:基于随机游走的PersonalRank算法。
PersonalRank算法原理解释如下:假设要给用户u进行个性化推荐,可以从用户u对应的节点vu开始在用户物品二分图上进行随机游走。游走到任何一个节点时,首先按照概率α决定是继续游走,还是停止这次游走并从vu节点开始重新游走。如果决定继续游走,那么就从当前节点指向的节点中按照均匀分布随机选择一个节点作为游走下次经过的节点。这样,经过很多次随机游走后,每个物品节点被访问到的概率会收敛到一个数。最终的推荐列表中物品的权重就是物品节点的访问概率。
PersonalRank算法描述成公式,如下:
PR(v)={α∑v′∈in(v)PR(v′)∣out(v′)∣(v≠vu)(1−alpha)+α∑v′∈in(v)PR(v′)∣out(v′)∣(v=vu) PR(v)=\begin{split} \begin{cases} \displaystyle \alpha\sum_{v'\in{in(v)}}\frac{PR(v')}{|out(v')|} & (v\ne v_u) \\ \displaystyle (1-alpha)+\alpha\sum_{v'\in{in(v)}}\frac{PR(v')}{|out(v')|} & (v= v_u) \end{cases} \end{split} PR(v)=⎩⎨⎧αv′∈in(v)∑∣out(v′)∣PR(v′)(1−alpha)+αv′∈in(v)∑∣out(v′)∣PR(v′)(v=vu)(v=vu)
PersonalRank的时间复杂度非常高,不仅无法在线提供实时推荐,甚至离线生成推荐结果也很耗时。这里给出两种解决方案。第一种很容易想到,就是减少迭代次数,在收敛之前就停止。这样会影响最终的精度,但一般来说影响不会特别大。
另一种方法就是从矩阵论出发,重新设计算法,具体方法如下:
第一步,令M为用户物品二分图的转移概率矩阵
M(v,v′)=1∣out(v)∣ M(v,v')=\frac{1}{|out(v)|} M(v,v′)=∣out(v)∣1
第二步,迭代公式转化为:
r=(1−α)r0+αMTr=(1−α)(1−αMT)−1r0 \begin{align} r &=(1-\alpha)r_0+\alpha M^Tr \\ &=(1-\alpha)(1-\alpha M^T)^{-1}r_0 \end{align} r=(1−α)r0+αMTr=(1−α)(1−αMT)−1r0
第三步,对稀疏矩阵1−αMT1-\alpha M^T1−αMT快速求逆