在前面两篇文章中,分别介绍和讨论了朴素贝叶斯分类与贝叶斯网络两种分类算法。这两种算法都以贝叶斯定理为基础,可以对分类及决策问题进行概率推断。在这一篇文章中,将讨论另一种被广泛使用的分类算法——决策树(decision tree)。相比贝叶斯算法,决策树的优势在于构造过程不需要任何领域知识或参数设置,因此在实际应用中,对于探测式的知识发现,决策树更加适用。
3.2、决策树引导
通俗来说,决策树分类的思想类似于找对象。现想象一个女孩的母亲要给这个女孩介绍男朋友,于是有了下面的对话:
女儿:多大年纪了?
母亲:26。
女儿:长的帅不帅?
母亲:挺帅的。
女儿:收入高不?
母亲:不算很高,中等情况。
女儿:是公务员不?
母亲:是,在税务局上班呢。
女儿:那好,我去见见。
这个女孩的决策过程就是典型的分类树决策。相当于通过年龄、长相、收入和是否公务员对将男人分为两个类别:见和不见。假设这个女孩对男人的要求是:30岁以下、长相中等以上并且是高收入者或中等以上收入的公务员,那么这个可以用下图表示女孩的决策逻辑(声明:此决策树纯属为了写文章而YY的产物,没有任何根据,也不代表任何女孩的择偶倾向,请各位女同胞莫质问我^_^):
上图完整表达了这个女孩决定是否见一个约会对象的策略,其中绿色节点表示判断条件,橙色节点表示决策结果,箭头表示在一个判断条件在不同情况下的决策路径,图中红色箭头表示了上面例子中女孩的决策过程。
这幅图基本可以算是一颗决策树,说它“基本可以算”是因为图中的判定条件没有量化,如收入高中低等等,还不能算是严格意义上的决策树,如果将所有条件量化,则就变成真正的决策树了。
有了上面直观的认识,我们可以正式定义决策树了:
决策树(decision tree)是一个树结构(可以是二叉树或非二叉树)。其每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节 点存放一个类别。使用决策树进行决策的过程就是从根节点开始,测试待分类项中相应的特征属性,并按照其值选择输出分支,直到到达叶子节点,将叶子节点存放 的类别作为决策结果。
可以看到,决策树的决策过程非常直观,容易被人理解。目前决策树已经成功运用于医学、制造产业、天文学、分支生物学以及商业等诸多领域。知道了决策树的定义以及其应用方法,下面介绍决策树的构造算法。
3.3、决策树的构造
不同于贝叶斯算法,决策树的构造过程不依赖领域知识,它使用属性选择度量来选择将元组最好地划分成不同的类的属性。所谓决策树的构造就是进行属性选择度量确定各个特征属性之间的拓扑结构。
构造决策树的关键步骤是分裂属性。所谓分裂属性就是在某个节点处按照某一特征属性的不同划分构造不同的分支,其目标是让各个分裂子集尽可能地“纯”。尽可能“纯”就是尽量让一个分裂子集中待分类项属于同一类别。分裂属性分为三种不同的情况:
1、属性是离散值且不要求生成二叉决策树。此时用属性的每一个划分作为一个分支。
2、属性是离散值且要求生成二叉决策树。此时使用属性划分的一个子集进行测试,按照“属于此子集”和“不属于此子集”分成两个分支。
3、属性是连续值。此时确定一个值作为分裂点split_point,按照>split_point和<=split_point生成两个分支。
构造决策树的关键性内容是进行属性选择度量,属性选择度量是一种选择分裂准则,是将给定的类标记的训练集合的数据划分D“最好”地分成个体类的启发式方法,它决定了拓扑结构及分裂点split_point的选择。
属性选择度量算法有很多,一般使用自顶向下递归分治法,并采用不回溯的贪心策略。这里介绍ID3和C4.5两种常用算法。
3.3.1、ID3算法
从信息论知识中我们直到,期望信息越小,信息增益越大,从而纯度越高。所以ID3算法的核心思想就是以信息增益度量属性选择,选择分裂后信息增益最大的属性进行分裂。下面先定义几个要用到的概念。
设D为用类别对训练元组进行的划分,则D的熵(entropy)表示为:
其中pi表示第i个类别在整个训练元组中出现的概率,可以用属于此类别元素的数量除以训练元组元素总数量作为估计。熵的实际意义表示是D中元组的类标号所需要的平均信息量。
现在我们假设将训练元组D按属性A进行划分,则A对D划分的期望信息为:
而信息增益即为两者的差值:
ID3算法就是在每次需要分裂时,计算每个属性的增益率,然后选择增益率最大的属性进行分裂。下面我们继续用SNS社区中不真实账号检测的例子说明如何使用ID3算法构造决策树。为了简单起见,我们假设训练集合包含10个元素:
其中s、m和l分别表示小、中和大。
设L、F、H和R表示日志密度、好友密度、是否使用真实头像和账号是否真实,下面计算各属性的信息增益。
因此日志密度的信息增益是0.276。
用同样方法得到H和F的信息增益分别为0.033和0.553。
因为F具有最大的信息增益,所以第一次分裂选择F为分裂属性,分裂后的结果如下图表示:
在上图的基础上,再递归使用这个方法计算子节点的分裂属性,最终就可以得到整个决策树。
上面为了简便,将特征属性离散化了,其实日志密度和好友密度都是连续的属性。对于特征属性为连续值,可以如此使用ID3算法:
先将D中元素按照特征属性排序,则每两个相邻元素的中间点可以看做潜在分裂点,从第一个潜在分裂点开始,分裂D并计算两个集合的期望信息,具有最小期望信息的点称为这个属性的最佳分裂点,其信息期望作为此属性的信息期望。
3.3.2、C4.5算法
ID3算法存在一个问题,就是偏向于多值属性,例如,如果存在唯一标识属性ID,则ID3会选择它作为分裂属性,这样虽然使得划分充分纯净,但这种划分对分类几乎毫无用处。ID3的后继算法C4.5使用增益率(gain ratio)的信息增益扩充,试图克服这个偏倚。
C4.5算法首先定义了“分裂信息”,其定义可以表示成:
其中各符号意义与ID3算法相同,然后,增益率被定义为:
C4.5选择具有最大增益率的属性作为分裂属性,其具体应用与ID3类似,不再赘述。
3.4、关于决策树的几点补充说明
3.4.1、如果属性用完了怎么办
在决策树构造过程中可能会出现这种情况:所有属性都作为分裂属性用光了,但有的子集还不是纯净集,即集合内的元素不属于同一类别。在这种情况下,由于没有更多信息可以使用了,一般对这些子集进行“多数表决”,即使用此子集中出现次数最多的类别作为此节点类别,然后将此节点作为叶子节点。
3.4.2、关于剪枝
在实际构造决策树时,通常要进行剪枝,这时为了处理由于数据中的噪声和离群点导致的过分拟合问题。剪枝有两种:
先剪枝——在构造过程中,当某个节点满足剪枝条件,则直接停止此分支的构造。
后剪枝——先构造完成完整的决策树,再通过某些条件遍历树进行剪枝。
关于剪枝的具体算法这里不再详述,有兴趣的可以参考相关文献。
好文要顶 关注我 收藏该文
张兰云
粉丝 - 48 关注 - 2
+加关注
00
« 上一篇: javascript笔试题
» 下一篇: 判断整数序列是不是二叉排序树的后序遍历结果
posted @ 2012-08-29 15:37 张兰云 阅读(477) 评论(0) 编辑 收藏 举报
刷新评论刷新页面返回顶部
登录后才能查看或发表评论,立即 登录 或者 逛逛 博客园首页
【推荐】阿里云新人特惠,爆款云服务器2核4G低至0.46元/天
【推荐】天翼云-红云展翼|智领启航,云主机1核2G仅59元/年
【推荐】云产品年终特惠,腾讯云轻量应用服务器6.58元/月起
编辑推荐:
· 现代 CSS 高阶技巧,像 Canvas 一样自由绘图构建样式!
· 解读 JVM 级别本地缓存 Caffeine 青出于蓝的要诀
· 使用 C# 11 的静态接口方法改进面向约定的设计
· 玩好 .NET 高级调试,你也要会写点汇编
· MySQL 空间暴涨 150G 导致锁定,发生了什么
阅读排行:
· 【基于OpenAI的ChatGPT】搭建属于自己的微信聊天机器人(附带注册英国手机号码方式)
· 玩 ChatGPT 的正确姿势「GitHub 热点速览 v.22.49」
· 推荐一款 在线+离线数据 同步框架 Dotmim.Sync
· 瞧瞧别人家的API接口,那叫一个优雅
· 我不写单元测试,被批了
[[toc]]
Medium , #infer , #built-in
实现 TS 内置的 ReturnType<T>,但不可以使用它。
答案
Medium , #union , #built-in
不使用 Omit 实现 TypeScript 的 Omit<T, K>泛型。
Omit 会创建一个省略 K 中字段的 T 对象。
答案
Medium , #readonly , #object-keys
实现一个通用 MyReadonly2<T, K>,它带有两种类型的参数 T 和 K 。
K 指定应设置为Readonly的 T 的属性集。如果未提供 K ,则应使所有属性都变为只读,就像普通的 Readonly<T>一样。
答案
Medium , #readonly , #object-keys , #deep
实现一个通用的 DeepReadonly<T>,它将对象的每个参数及其子对象递归地设为只读。
您可以假设在此挑战中我们仅处理对象。数组,函数,类等都无需考虑。但是,您仍然可以通过覆盖尽可能多的不同案例来挑战自己。
答案
Medium , #infer , #tuple , #union
实现泛型 TupleToUnion<T>,它返回元组所有值的合集。
答案
Medium , #application
在 JavaScript 中我们很常会使用可串联(Chainable/Pipeline)的函数构造一个对象,但在 TypeScript 中,你能合理的给他附上类型吗?
在这个挑战中,你可以使用任意你喜欢的方式实现这个类型 - Interface, Type 或 Class 都行。你需要提供两个函数 option(key, value) 和 get() 。在 option 中你需要使用提供的 key 和 value 扩展当前的对象类型,通过 get 获取最终结果。
你只需要在类型层面实现这个功能 - 不需要实现任何 TS/JS 的实际逻辑。
你可以假设 key 只接受字符串而 value 接受任何类型,你只需要暴露它传递的类型而不需要进行任何处理。同样的 key 只会被使用一次。
答案
Medium , #array
实现一个通用 Last<T>,它接受一个数组 T 并返回其最后一个元素的类型。
答案
Medium , #array
实现一个通用 Pop<T>,它接受一个数组 T 并返回一个没有最后一个元素的数组。
额外 :同样,您也可以实现 Shift , Push 和 Unshift 吗?
答案
Medium , #array , #built-in
键入函数 PromiseAll ,它接受PromiseLike对象数组,返回值应为 Promise<T>,其中 T 是解析的结果数组。
答案
Medium , #union , `#map
有时,您可能希望根据某个属性在联合类型中查找类型。
在此挑战中,我们想通过在联合类型 Cat | Dog 中搜索公共 type 字段来获取相应的类型。换句话说,在以下示例中,我们期望 LookUp<Dog | Cat, 'dog'>获得 Dog , LookUp<Dog | Cat, 'cat'>获得 Cat 。
答案
Medium , #template-literal
实现 TrimLeft<T> ,它接收确定的字符串类型并返回一个新的字符串,其中新返回的字符串删除了原字符串开头的空白字符串。
答案
Medium , #template-literal
实现 Trim<T>,它是一个字符串类型,并返回一个新字符串,其中两端的空白符都已被删除。
答案
Medium , #template-literal
实现 Capitalize<T> 它将字符串的第一个字母转换为大写,其余字母保持原样。
答案
Medium , #template-iteral
实现 Replace<S, From, To> 将字符串 S 中的第一个子字符串 From 替换为 To 。
答案
Medium , #template-literal
实现 ReplaceAll<S, From, To> 将一个字符串 S 中的所有子字符串 From 替换为 To 。
答案
Medium , #arguments
实现一个泛型 AppendArgument<Fn, A>,对于给定的函数类型 Fn ,以及一个任意类型 A ,返回一个新的函数 G 。 G 拥有 Fn 的所有参数并在末尾追加类型为 A 的参数。
答案
Medium , #union
实现联合类型的全排列,将联合类型转换成所有可能的全排列数组的联合类型。
答案
https://github.com/type-challenges/type-challenges/issues/614
Note
Medium , #template-literal
计算字符串的长度,类似于 String#length 。
答案
Medium , #array
在这个挑战中,你需要写一个接受数组的类型,并且返回扁平化的数组类型。
答案
Medium , #object-keys
实现一个为接口添加一个新字段的类型。该类型接收三个参数,返回带有新字段的接口类型。
答案
Medium , #math , #template-literal
实现一个接收string,number或bigInt类型参数的 Absolute 类型,返回一个正数字符串。
答案
Medium , #union , #string
实现一个将接收到的String参数转换为一个字母Union的类型。
答案
Medium , #object
实现联合类型的全排列,将联合类型转换成所有可能的全排列数组的联合类型。
答案
Medium , #
FooBarBaz -> foo-bar-baz
答案
Medium , #object
获取两个接口类型中的差值属性。
答案
Medium , #array
在类型系统中实现类似于 Python 中 any 函数。类型接收一个数组,如果数组中任一个元素为真,则返回 true ,否则返回 false 。如果数组为空,返回 false 。
答案
Medium , #union , #utils
实现 IsNever 类型, 解析输入 T 类型为 never 返回 true 否则 返回 false
答案
Medium , #union , #utils
实现 IsUnion 类型, 解析输入 T 类型为联合类型 返回 true 否则 返回 false
答案
Medium
实现 ReplaceKeys 类型, 它将替换联合类型中类型的键值, 如果该类型没有这个Key则跳过,如果有则替换。
答案
Medium
从对象类型中排除索引签名。
答案
https://github.com/type-challenges/type-challenges/issues/3542
Medium
实现类型 PercentageParser。根据规则 /^(\+|\-)?(\d*)?(\%)?$/ 匹配类型 T。
匹配的结果由三部分组成,分别是:[ 正负号 , 数字 , 单位 ],如果没有匹配,则默认是空字符串。
答案
Medium
从字符串中剔除指定字符。
答案
Medium , Math
给定一个正整数作为类型的参数,要求返回的类型是该数字减 1。
答案
Medium , object
从 F 中选出类型相同的属性
答案
Medium , #object
保留没有在U中指定的类型的字段
答案
Medium , #template-literal
实现 StartsWith<T, U>,接收两个string类型参数,然后判断 T 是否以 U 开头,根据结果返回 true 或 false
答案
Medium , #object
实现一个通用的 PartialByKeys<T, K>,它接收两个类型参数 T 和 K 。
K 指定应设置为可选的 T 的属性集。当没有提供 K 时,它就和普通的 Partial<T>一样使所有属性都是可选的。
答案
Medium , #object
实现一个通用的 RequiredByKeys<T, K>,它接收两个类型参数 T 和 K 。
K 指定应设为必选的 T 的属性集。当没有提供 K 时,它就和普通的 Required<T>一样使所有的属性成为必选的。
答案
Medium , #readonly , object-keys
实现一个通用的类型 Mutable<T>,使类型 T 的全部属性可变(非只读)。
答案
Medium , #object
1
答案
Medium
给定只包含字符串的元组,和类型U, 递归构建对象
答案
Medium , #tuple
实现类型版本的数组反转 Array.reverse
答案
Medium , #arguments
实现类型版本的 lodash _.flip 函数
类型 FlipArguments<T> 需要函数 T 并返回一个新的函数类型。这个函数类型拥有相同的参数,但参数类型是被反转的。
答案
Medium , #array
按深度递归展平阵列。
答案
Medium
块、元素、修饰符方法 (BEM) 是 CSS 中类的流行命名约定。例如,块组件将表示为 btn ,依赖于块的元素将表示为 btn__price ,改变块样式的修饰符将表示为 btn--big 或 btn__price--warning 。实现 BEM<B, E, M>从这三个参数生成字符串联合。其中 B 是字符串文字,E 和 M 是字符串数组(可以为空)。
答案
Medium , #object
实现二叉树中序遍历的类型版本。
答案
Medium
实现类型 just-flip-object :
答案
Medium
实现泛型 Fibonacci<T> 传入数字 T 返回正确的 Fibonacci number .
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...
答案
Medium
实现类型 AllCombinations<S> 返回所有字符组合.
答案
Medium , #array
实现类型 GreaterThan<T, U> 来比较大小,就像 T >U 。不需要考虑负数
1
答案
Medium , #tuple
实现 Zip<T, U> 类型。 T, U 必须为 Tuple
答案
Medium , #tuple
实现 IsTuple , 接收类型 T 判断 T 是否为元组类型
答案
Medium , #tuple
实现 Chunk<T, N>, 它有两个必填的类型参数, T 必须为 tuple , N 必须为大于1的数字
答案
Medium , tuple
Fill , 一个常用的 JavaScript 函数, 我们用类型实现它. Fill<T, N, Start?, End?>, 它接收4个类型参数, T , N 是必填参数 T 为元组, N 为 any, Start , End 是可选参数,为大于零的数子.
为了模拟真实的功能,测试中可能会包含一些边界条件,希望大家喜欢:)
答案
Medium
实现 TrimRight<T> 它采用精确的字符串类型并返回一个删除了空格结尾的新字符串。
答案
Medium , #union , #array
实现一个像 Lodash.without 函数一样的泛型 Without<T, U>,它接收数组类型的 T 和数字或数组类型的 U 为参数,会返回一个去除 U 中元素的数组 T。
答案
Medium , template-literal
实现类型版本的 Math.trunc . 它接受字符串或数字返回整数部分,提出小数部分
答案
Medium , #array
实现类型版本的 Array.indexOf<T, U>, 它接收数组T 和 U 返回U在T中的索引值
答案
Medium , #array
实现类型版 Array.join<T, U> 接收数组T和字符串或数字 U
答案
Medium , #array
实现类型版本的 Array.lastIndexOf<T, U>, 它接收数组T 和 U 返回U在T中的反向索引值
答案
Medium , #array
实现类型版本的 Lodash.uniq , 它接收数组T,返回去重后的T
答案
Medium
实现 MapTypes<T, R> 它将对象 T 中的类型转换为类型 R 定义的不同类型,类型 R 具有以下结构。
答案
Medium , #tuple
构造一个给定长度的元组
答案
Medium
有时我们想限制数字的范围......例如。
答案
Medium , #array , #application , #string
给定一个字符串数组,进行置换和组合。它对于像video controlsList这样的类型也很有用
答案
Medium , #union
给定一个唯一元素数组,返回所有可能的子序列。
子序列是一个序列,可以通过删除一些元素或不删除任何元素而从数组中派生,而不改变其余元素的顺序。
答案
可以参考下面的路径去学习,祝你学有所成,公司最近在人工智能和自然语言处理的项目后端项目,我也是网上找了很多知识,最后给自己列了一个学习的目录,按照这个在复习并在总结,希望能帮到你:
计算机基本认知,环境搭建 python环境搭建
计算机基本认识,进制转换
python注释使用
python变量使用
python数据类型_Number
python数据类型 str字符串类型
容器类型数据list,tuple,str
容器类型数据set,dict
变量缓存机制
自动类型转换
Number强制类型转换
python运算符的使用 容器类型数据强制类型转换
字典强转等长二级容器
运算符_算数_比较
运算符_赋值_成员
运算符_身份_逻辑
运算符_位运算_优先级
python流程控制 代码块
流程控制if
多项巢状分支
循环结构while
循环判断经典题
字符串的相关操作
python循环结构
关键字continue_break_pass
for循环的遍历_range
字符串,列表内置方法
字符串函数
format字符串格式化
format特殊符号的使用
列表的操作
列表函数
字典,集合内置方法+文件操作
字典的相关函数
集合操作_函数
文件操作
文件加号模式
函数,函数参数 文件相关函数
函数
形参实参
默认形参_关键字形参
收集参数
命名关键字参数
全局/局部变量,闭包 return返回值
函数名的使用
局部变量_全局变量
函数的嵌套LEGB
关键字nonlocal
闭包函数
递归,匿名函数
locals和globals
闭包特点意义
递归含义
斐波那契_尾递归
匿名函数lambda
迭代器,高阶函数 迭代器
高阶函数_map
高阶函数_reduce
高阶函数_sorted
高阶函数_filter
推导式 列表推导式
推导式题
集合_字典推导式
生成器表达式
生成器函数
内置方法,linux基本命令 内置函数
可滑动序列
面试题演练
linux安装
linux基本命令
python模块 序列化模块
数学模块
随机模块
time模块
python模块 os模块
os_shutil
os.path模块
计算文件夹大小
zipfile
tarfile
导入模块包,oop面向对象认知
import_from绝对导入
import_from相对导入(单入口)
oop面向对象
类的封装性
oop之封装,继承 类的相关操作
对象和类的删除操作
单继承
多继承
菱形继承
oop之多态,魔术方法 多态
魔术方法__new__
单态模式
析构方法__del__
oop之魔术方法,异常处理 魔术方法__call__
魔术方法__str__repr__
魔术方法__bool_add_len__
了解异常
异常处理语法
主动抛出异常
装饰器
装饰器
静态绑定方法
property
正则表达式 单个字符匹配
多个字符匹配
匹配分组
命名分组
正则函数
正则计算器小程序
认识网络 bs_cs流程
传输数据流程
交换机和局域网的网络通讯
arp协议
认识tcp/udp协议
tcp基本语法
tcp循环发消息
udp基本语法
udp循环发消息
黏包
基于tcp协议下的应用 socketserver并发
文件校验
服务器合法性校验
tcp登录
并发编程之进程 进程
join
守护进程
lock锁
Semaphore
生产者消费者模型 Event事件
进程队列Queue
生产者和消费者模型
JoinableQueue
Manager.py
并发编程之线程
.线程
用类定义线程
守护线程
lock保证线程数据安全
信号量_Semaphore
死锁,互斥锁,递归锁
线程池,进程池,协成的使用
事件Event
线程队列
进程池和线程池
回调函数
协程
协程的爬虫案例
mysql安装(linux+windows+xshell+navicat)
掌握数据库mysql基本操作
mysql登录,服务启动
创建账户,用户授权
数据库,数据表,数据的增删改查
认识常用数据类型
数据库的存储引擎和约束
字段约束
约束的删减
存储引擎区别用法
数据表之间的关系
查询数据表
单表查询
多表联查
子查询
带EXISTS关键字的子查询
python操作mysql
python连接mysql的事务处理
sql注入
python连接mysql增删改查
mysql数据恢复
HTML/CSS html文档介绍,html标签,body标签,head标签介绍,head标签中的meta标签和link标签和title标签介绍,body中的标签分类,基础标签,img、a、列表、表格、input、label、select等标签,作业讲解,form标签介绍和示例讲解,css介绍,引入,css选择器,背景设置,高度宽度,字体效果,边框、盒子模型、display属性、float属性等
CSS 伪类选择器,文字装饰、a标签补充、定位、权重、小米商城导航栏讲解,原型头像示例讲解
JS基础/BOM和DOM操作 小米商城作业,js介绍和js引入,js数据类型、流程控制、函数等操作,js中的JSON,BOM对象的弹框、location对象、定时器、直接查找选择器、间接查找选择器、值操作、类值操作、样式操作、button按钮补充、事件和绑定事件的两种方式,常用事件练习
jQuery/Bootstrap 作业讲解,jquery介绍,引入、选择器、筛选器、值操作、文档操作、删除和清空标签、逻辑运算符、克隆、事件冒泡和事件委托、绑定事件的方式,作业讲解和模态对话框示例,input事件和页面载入事件补充、bootstrap介绍和引入、全局css样式、组件和常用插件
自定义web框架 作业讲解、web框架介绍、自定义web框架实现、动态页面、返回不同的html页面、函数版、多线程版、返回静态文件版,wsgiref版等web框架通过socket来实现,还有jinja2的简单使用
django下载安装和URL路由系统 django介绍、MTV和MVC框架介绍、常用指令、目录结构、pycharm创建django项目、request的常用属性介绍、登录示例、url路由系统介绍、有名分组和无名分组,
视图/模板 request对象的常用方法和属性、响应方法介绍和使用,CBV和FBV、CBV和FBV加装饰器,CBV源码讲解,模板渲染系统介绍,语法、简单示例、内置过滤器、for循环标签、if标签、with标签、自定义过滤器和标签、模板继承等
Dajngo的ORM(1) orm介绍,数据库同步指令使用和流程分析、配置连接mysql模型类中的属性介绍和常用参数说明,创建表和数据、增加的两种方法、删除、更新的两种方法、查询的13个api接口
Dajngo的ORM(2) 单表图书管理系统展示和添加作业讲解、choices属性、auto_now_add和auto_now参数讲解、url别名和反向解析,基于双下划线的模糊查询,多表结构介绍,图书管理系统编辑和删除作业讲解、多表关系模型类创建和字段说明和参数介绍、多表数据的添加操作,多表的删除和修改、基于对象的跨表查询、双下划线跨表查询、查看原生sql语句的方法、聚合查询、分组查询、F查询、Q查询等
Ajax与Django/ 中间件 ajax的介绍和简单示例,ajax登录示例、列表数据展示示例,ajax操作cookie的补充、中间件介绍、自定义中间件的方法、5个中间件方法的介绍和使用、基于中间件的session登录认证
cookie、session以及用户认证组件 cookie介绍,cookie的流程解析,django操作cookie和其他参数介绍、session的说明、django的session操作等,多表图书管理系统作业讲解
vue初识、es6基本语法、指令系统 let、const、v-if、v-for、v-html、v-text、v-model、v-show、生命周期钩子函数、
组件化开发、组件传值、axios简单使用 组件化开发、组件传值、axios简单使用、vue-router使用、vue-cli安装
项目初始化/首页 项目介绍、创建、初始化、element-ui的使用,单文件组件的使用和axios在单文件中的使用和配置、vue-cli的介绍和使用、路飞项目顶部导航栏页面效果搭建,轮播图组件的使用和调整、购物车页面搭建和课程详情页面搭建,vue-video-player视频播放插件
drf组件 序列化器、drf简单示例、restful规范、反序列化的校验机制
drf组件 apiview、request和response对象、modelserializer、序列化器保存数据、read_only和write_only的参数
drf组件 viewset、drf路由功能、viewset视图基类的使用、视图子类、通用视图类genericapiview/排序、django-filter过滤器、频率组件、分页组件、接口文档、异常处理、xadmin的安装和使用、认证组件和权限组件
git、消息队列 git企业中的使用模式,rabbimq消息队列的应用
rpc通信,grpc组件 rpc的概念以及通信模式,最火的grpc组件使用
轻量级Flask框架 Werkzeug服务介绍、Flask框架介绍
路由系统、自定义路由扩展
Cookie、Session、Http请求和响应
蓝图、消息闪现、中间件
Flask常用扩展、WTForms、使用SQLAchemy ORM
Admin、Restful、websocket原理、magic string, payload len,masking key
请求和上下文、多app应用、离线脚本、自定义扩展
服务端项目搭建,项目配置(session、数据库、日志相关),项目初始化
jsonrpc模块基本配置和使用,客户端展示首页及登录注册叶绵,APICloud页面控制管理
python进阶 并发、同步、异步、锁,线进程概念以及协程实现原理
mysql进阶课 基础知识梳理、索引、执行计划
mysql进阶课 存储引擎、日志管理、备份恢复、主从赋值、优化
redis,mongodb 事务和发布订阅、RDB和AOF持久化、缓存击穿、缓存雪崩等原理介绍、 用户管理和复制集(RS)总结、sharding cluster 分片集群的搭建、分片使用和相关策略等
算法与设计模式 链表、二叉树、常见算法、二分查找、插入排序、希尔排序、快排、堆排序、哈希查找
算法与设计模式 设计模式,单例模式、工厂模式、策略模式、观察者模式
算法与设计模式 leetcode经典算法解析
知识体系差不多就这么多了,再就是项目部分,具体项目要看需求了,学会了钓鱼的方法,不怕钓不到鱼哦,无论在哪个行业做什么样的项目都没问题呢!
我自己也搜集了一些经典的资料,要是想要加我百度网盘:艾美电商,我发给你!