一、前言
这段时间疫情不那么严重,回公司上班了。平时工作比较忙,而且重点在学习数学。很久没有更新,最近实现《西瓜书》决策树,贴出来给大家共享。西瓜数据集2.0如下:在这里插入代码片
[‘青绿’, ‘蜷缩’, ‘浊响’, ‘清晰’, ‘凹陷’, ‘硬滑’, ‘好瓜’],
[‘乌黑’, ‘蜷缩’, ‘沉闷’, ‘清晰’, ‘凹陷’, ‘硬滑’, ‘好瓜’],
[‘乌黑’, ‘蜷缩’, ‘浊响’, ‘清晰’, ‘凹陷’, ‘硬滑’, ‘好瓜’],
[‘青绿’, ‘蜷缩’, ‘沉闷’, ‘清晰’, ‘凹陷’, ‘硬滑’, ‘好瓜’],
[‘浅白’, ‘蜷缩’, ‘浊响’, ‘清晰’, ‘凹陷’, ‘硬滑’, ‘好瓜’],
[‘青绿’, ‘稍蜷’, ‘浊响’, ‘清晰’, ‘稍凹’, ‘软粘’, ‘好瓜’],
[‘乌黑’, ‘稍蜷’, ‘浊响’, ‘稍糊’, ‘稍凹’, ‘软粘’, ‘好瓜’],
[‘乌黑’, ‘稍蜷’, ‘浊响’, ‘清晰’, ‘稍凹’, ‘硬滑’, ‘好瓜’],
[‘乌黑’, ‘稍蜷’, ‘沉闷’, ‘稍糊’, ‘稍凹’, ‘硬滑’, ‘坏瓜’],
[‘青绿’, ‘硬挺’, ‘清脆’, ‘清晰’, ‘平坦’, ‘软粘’, ‘坏瓜’],
[‘浅白’, ‘硬挺’, ‘清脆’, ‘模糊’, ‘平坦’, ‘硬滑’, ‘坏瓜’],
[‘浅白’, ‘蜷缩’, ‘浊响’, ‘模糊’, ‘平坦’, ‘软粘’, ‘坏瓜’],
[‘青绿’, ‘稍蜷’, ‘浊响’, ‘稍糊’, ‘凹陷’, ‘硬滑’, ‘坏瓜’],
[‘浅白’, ‘稍蜷’, ‘沉闷’, ‘稍糊’, ‘凹陷’, ‘硬滑’, ‘坏瓜’],
[‘乌黑’, ‘稍蜷’, ‘浊响’, ‘清晰’, ‘稍凹’, ‘软粘’, ‘坏瓜’],
[‘浅白’, ‘蜷缩’, ‘浊响’, ‘模糊’, ‘平坦’, ‘硬滑’, ‘坏瓜’],
[‘青绿’, ‘蜷缩’, ‘沉闷’, ‘稍糊’, ‘稍凹’, ‘硬滑’, ‘坏瓜’]
二、样本数据读取及存储
为了便于数据操作,每个数据样本存储为字典,字典key为样本各个特征,比如纹理,敲声等,字典value对应特征标签值,比如清晰、沉闷。

def read_data(filename):"""Function : 读取西瓜数据集Input: filename: 数据集文件名Output: data:西瓜数据集列表,列表元素为字典,每个字典保存西瓜属性"""text_list = []with open(filename,"r") as f:#当读到最后一行的下一行时,line 为空集,停止读取while True:line = f.readline()if not line:break#删除每行尾换行符line = line.strip("\n")#s删除每行头尾空格line = line.strip(" ")#删除每行头尾的[ ,]line = line.strip("[")line = line.strip(",")line = line.strip("]")if line != "":text_list.append(line)#创建数据列表,每个西瓜数据为一个字典,字典形成列表dataset = []for i,text_line in enumerate(text_list):#把每行字符串分割为列表split_data_text = text_line.split( ",")#每个西瓜数据初始化一个字典对象并保存该西瓜的数据dic_example = {}dic_example["编号"] = i + 1#删除每个特征标签的引号和空格dic_example["色泽"] = split_data_text[0].replace("'","").strip()dic_example["根蒂"] = split_data_text[1].replace("'","").strip()dic_example["敲声"] = split_data_text[2].replace("'","").strip()dic_example["纹理"] = split_data_text[3].replace("'","").strip()dic_example["脐眼"] = split_data_text[4].replace("'","").strip()dic_example["触感"] = split_data_text[5].replace("'","").strip()dic_example["标签"] = split_data_text[6].replace("'","").strip()#将西瓜数据字典加入列表dataset.append(dic_example)return dataset#建立数据集

数据读取结果如下:

filename = "西瓜数据集2.0.txt"
dataset = read_data(filename)
[{'编号': 1,'色泽': '青绿','根蒂': '蜷缩','敲声': '浊响','纹理': '清晰','脐眼': '凹陷','触感': '硬滑','标签': '好瓜'},{'编号': 2,'色泽': '乌黑','根蒂': '蜷缩','敲声': '沉闷','纹理': '清晰','脐眼': '凹陷','触感': '硬滑','标签': '好瓜'},{'编号': 3,'色泽': '乌黑','根蒂': '蜷缩',.............共17个字典数据构成列表

三、决策树生成思路
整体思路是按照西瓜书的伪代码流程来的,关键步骤是生成判别树时候要使用递归函数。我之前思路是像二叉树那样自己定义结点数据结构和树的数据结构,后来参考了别人做法,为了使用统一的画图函数,直接采用字典嵌套来表示决策树。其实字典本来就可能完美定义各种树,因为字典的键以随意添加,每个键就是结点的分支。分支的值有2种情况,一种情况是分支为子结点情况,此时分支的值(即字典key对应的value)为判别结果“好瓜”、“坏瓜”。一种是该分支又继续有分支,那么该分支的值(即字典key对应的值)应该还是一个字典。
递归函数是解决树问题的有效工具,递归函数的基本要素有两个:一是递归函数终止或者返回条件,二是递归函数的传递条件。
本问题中递归函数终止条件伪代码中已经明示,共有4种情况:
1.该分支样本数为0,那么该分支的值取为其父节点样本中出现次数最多的判别标签。
2…该分支有样本,但是分支所有样本的判别标签相同,即要么全部为好瓜,要么全部为坏瓜,这种情况自然不需再有分支,直接将其取值定为样本的判别标签即可。
3.该分支有样本,但是随着判断的进行,不断选择和丢弃最优特征,最后可以用来判别的特征(指的是纹理、敲声等)用完了,这时候无法选择最优特征,也就无法生成分支,于是只能把该分支的值定为分支中样本出现最多次的标签。
4.该分支有样本,但是如果分支的样本所有特征的标签都是相同的(判别标签不同),那么可以直接选择出现最多的判别标签作为该分支的值即可。因为如果所有样本的特征标签相同,那么所有特征的信息增益都相同,这种情况下是没有最优特征的,直接选择出现最多的样本判别标签作为分支值即可。

于是生成决策树的主函数如下:

def TreeGenerate(node_dataset, A):"""Function : 根据样本列表和特征列表生成判别字典Input: node_dataset: 当前结点的数据集,列表,元素为字典类型A: 可以选择的特征列表Output: 判别字典"""#对应终止条件2,判断节点内样本的判别标签是否相同,如果相同则返回样本判别标签if  is_the_same_jugement(node_dataset):return node_dataset[0]["标签"]#对应终止条件3,4如果样本判别的剩余属性数量为0,或者样本特征标签全部相同,将样本标签定义为数量最多的样本对应的标签,并且将其返回if len(A) == 0 or is_the_same_labels(node_dataset, A):return argmax_jugement(node_dataset)#判别各个特征ai,找出信息增益最大的ai_bestai_best = select_ai(node_dataset, A)#以ai_best为属性,生成字典my_tree = {ai_best: {}}#根据最优特征ai_best的标签值,将节点样本重新分组sub_node_datasets= classfide_by_ai_best(node_dataset,ai_best )#移除A中本次使用的最优特征A.remove(ai_best)#遍历ai_best 特征的标签值for ai_best_value in  sub_node_datasets.keys():#注意此时必须使用切片复制的方法,若直接采用sub_A = A,则sub_A中删除最优特征时,A中元素也会删除对应最优特征,#,导致同一个根节点的不同分支,随着递归进行,可选的剩余特征越来越少sub_A = A[:]#获取最大增益特征的标签值对应的样本列表sub_node_dataset =  sub_node_datasets[ai_best_value]#对应返回情况1,如果最大增益特征的某一个标签值对应的样本列表为空,将分支结点定为叶结点,判别标签标记为父节点的样本最多的类标签if len(sub_node_dataset) == 0:my_tree[ai_best][ai_best_value] = argmax_jugement(node_dataset)#空集分支判断结束,进入最优特征的下一个标签结点continue#递归调用本函数,函数自变量为子样本列表和剩余特征列表,函数返回判别标签subTree = TreeGenerate(sub_node_dataset, sub_A)#把新生成的子树赋值给根节点的分支,分支的结点值为ai_best的标签值my_tree[ai_best][ai_best_value] = subTreereturn my_tree

四、功能函数实现
主函数完成后,就是功能函数实现了,这里不再多说,看注释即可

def Cal_info_entrop(node_dataset):"""Function : 计算某结点的信息熵Input: node_dataset: 当前结点的数据集,列表对象Output: entrop:当前结点的信息熵"""
#计算结点内样本数量number_of_example = len(node_dataset)#创建标签统计字典label_stastics = {}for data in node_dataset:#如果标签不在标签字典里,在字典里创建标签作为key并赋值为0if data["标签"] not in label_stastics.keys():label_stastics[data["标签"]] = 0#对应分类标签加1label_stastics[data["标签"]] += 1entrop = 0.0#根据标签分类字典计算信息熵for key in label_stastics.keys():pk = float(label_stastics[key] / number_of_example)entrop +=  - pk * np.log2(pk)return entrop
def Cal_info_gain(node_dataset, feature):"""Function : 计算结点内某一个属性的信息增益    Input: node_dataset: 当前结点的数据集,列表对象feature:计算信息增益所采用的属性        Output: entrop:信息增益"""#计算结点内样本数量D = len(node_dataset)#根据样本的feature类别数将样本分为不同的列表,列表元素为样本字典对象,每一个列表里的样本属性拥有相同的特征值feature_stastic = {}#import pdb#pdb.set_trace()for data in node_dataset:#判断字典中是否有属性的特征值,如果没有,则在字典中新建该键值项,其值为空列表if data[feature] not in feature_stastic.keys():feature_stastic[data[feature]] = []#把样本按照属性特征值放入不同的列表   feature_stastic[data[feature]].append(data)#计算结点所有样本的信息熵 (公式4.1)   EntD = Cal_info_entrop(node_dataset)Info_gain = EntD #计算属性分类子集的信息熵for key in feature_stastic.keys():        #获取字典列表的样本数Dv = len(feature_stastic[key])#计算字典列表的信息熵(即计算对该属性分类后的子集合的信息熵)EntDv = Cal_info_entrop(feature_stastic[key])#计算信息增益(公式4.2)Info_gain = Info_gain - Dv / D * EntDvreturn  Info_gain
def is_the_same_jugement(node_dataset):"""Function : 判断结点data是否为同个标签的样本Input: node_dataset: 当前结点的数据集,列表对象Output: True:是同一个标签,False: 不是同一个标签      """datalabel =  node_dataset[0]["标签"]for data in node_dataset:if datalabel !=  data["标签"]:return Falsereturn True
def argmax_jugement(node_dataset):"""Function : 找出结点data样本中,包含最多样本的标签Input: node_dataset: 当前结点的数据集,列表对象Output: 标签"""#统计不同标签对应的样本个数,存放到字典label_stastics = {}for data in node_dataset:#如果标签不在标签字典里,在字典里创建标签作为key并赋值为0if data["标签"] not in label_stastics.keys():label_stastics[data["标签"]] = 0#对应分类标签加1label_stastics[data["标签"]] += 1#找到样本数量最大的标签值max_label = max(label_stastics, key = label_stastics.get)return max_label
def is_the_same_labels(node_dataset,A):"""Function : 判别结点data样本中,剩余特征的标签是否相同Input: node_dataset: 当前结点的数据集,列表对象A: 可以选择的特征列表Output: 若特征标签完全相同,返回Ture,否则返回False"""#遍历剩余特征for av in A:#遍历所有样本的特征标签for data in node_dataset:  #如果第一个样本的标签值与其他任何样本不同,返回Falseif node_dataset[0][av] != data[av]:return Falsereturn True
def select_ai(node_dataset, A):"""Function : 找出样本中信息增益最大的特征Input: node_dataset: 当前结点的数据集,列表对象A: 可以选择的特征列表Output: 信息增益最大的特征"""Max_info_gain = 0.00ai_best = "找不到"for ai in A:Info_gain = Cal_info_gain(node_dataset, ai)if Info_gain > Max_info_gain:Max_info_gain = Info_gainai_best = aireturn ai_best
def get_the_feature_label_dic(dataset):"""Function : 根据原始样本集,生产每个特征和对应的标签数据映射Input: node_dataset: 原始数据集,列表,元素为字典类型Output: 样本的特征取值,字典key为样本特征,value为列表,列表元素为样本特征的标签"""feature_label_dic = {}for data in dataset:for key in data.keys():if key  not in feature_label_dic.keys():feature_label_dic[key] = []if data[key]  not in feature_label_dic[key]:feature_label_dic[key].append(data[key])return feature_label_dic
def classfide_by_ai_best(node_dataset,ai_best):"""Function : 根据样本列表和最大增益特征,将列表中的样本按特征标签分类Input: node_dataset: 当前结点的数据集,列表,元素为字典类型ai_best:作为分类依据的特征Output: 样本的分类字典,字典key为aiv,value为对应的列表,列表元素为特征标签相同的样本,比如特征纹理同为标签模糊的样本集合"""#统计不同标签对应的样本个数,存放到字典sub_node_datasets = {}#为最优特征的每个标签生成key_value键值对for ai_value in feature_label_dic[ai_best]:sub_node_datasets[ai_value] = []for data in node_dataset:#对应分类标签的value为列表,将data加入列表内,若该标签没有对应样本,则列表长度为0sub_node_datasets[data[ai_best]].append(data)return  sub_node_datasets

五、绘图程序
绘图程序参考《机器学习实战》

# @Time    : 2017/12/18 19:46
# @Author  : Leafage
# @File    : treePlotter.py
# @Software: PyCharmimport matplotlib.pylab as plt
import matplotlib# 能够显示中文
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['font.serif'] = ['SimHei']# 分叉节点,也就是决策节点
decisionNode = dict(boxstyle="sawtooth", fc="0.8")# 叶子节点
leafNode = dict(boxstyle="round4", fc="0.8")# 箭头样式
arrow_args = dict(arrowstyle="<-")def plotNode(nodeTxt, centerPt, parentPt, nodeType):"""绘制一个节点:param nodeTxt: 描述该节点的文本信息:param centerPt: 文本的坐标:param parentPt: 点的坐标,这里也是指父节点的坐标:param nodeType: 节点类型,分为叶子节点和决策节点:return:"""createPlot.ax1.annotate(nodeTxt, xy=parentPt, xycoords='axes fraction',xytext=centerPt, textcoords='axes fraction',va="center", ha="center", bbox=nodeType, arrowprops=arrow_args)def getNumLeafs(myTree):"""获取叶节点的数目:param myTree::return:"""# 统计叶子节点的总数numLeafs = 0# 得到当前第一个key,也就是根节点firstStr = list(myTree.keys())[0]# 得到第一个key对应的内容secondDict = myTree[firstStr]# 递归遍历叶子节点for key in secondDict.keys():# 如果key对应的是一个字典,就递归调用if type(secondDict[key]).__name__ == 'dict':numLeafs += getNumLeafs(secondDict[key])# 不是的话,说明此时是一个叶子节点else:numLeafs += 1return numLeafsdef getTreeDepth(myTree):"""得到数的深度层数:param myTree::return:"""# 用来保存最大层数maxDepth = 0# 得到根节点firstStr = list(myTree.keys())[0]# 得到key对应的内容secondDic = myTree[firstStr]# 遍历所有子节点for key in secondDic.keys():# 如果该节点是字典,就递归调用if type(secondDic[key]).__name__ == 'dict':# 子节点的深度加1thisDepth = 1 + getTreeDepth(secondDic[key])# 说明此时是叶子节点else:thisDepth = 1# 替换最大层数if thisDepth > maxDepth:maxDepth = thisDepthreturn maxDepthdef plotMidText(cntrPt, parentPt, txtString):"""计算出父节点和子节点的中间位置,填充信息:param cntrPt: 子节点坐标:param parentPt: 父节点坐标:param txtString: 填充的文本信息:return:"""# 计算x轴的中间位置xMid = (parentPt[0]-cntrPt[0])/2.0 + cntrPt[0]# 计算y轴的中间位置yMid = (parentPt[1]-cntrPt[1])/2.0 + cntrPt[1]# 进行绘制createPlot.ax1.text(xMid, yMid, txtString)def plotTree(myTree, parentPt, nodeTxt):"""绘制出树的所有节点,递归绘制:param myTree: 树:param parentPt: 父节点的坐标:param nodeTxt: 节点的文本信息:return:"""# 计算叶子节点数numLeafs = getNumLeafs(myTree=myTree)# 计算树的深度depth = getTreeDepth(myTree=myTree)# 得到根节点的信息内容firstStr = list(myTree.keys())[0]# 计算出当前根节点在所有子节点的中间坐标,也就是当前x轴的偏移量加上计算出来的根节点的中心位置作为x轴(比如说第一次:初始的x偏移量为:-1/2W,计算出来的根节点中心位置为:(1+W)/2W,相加得到:1/2),当前y轴偏移量作为y轴cntrPt = (plotTree.xOff + (1.0 + float(numLeafs))/2.0/plotTree.totalW, plotTree.yOff)# 绘制该节点与父节点的联系plotMidText(cntrPt, parentPt, nodeTxt)# 绘制该节点plotNode(firstStr, cntrPt, parentPt, decisionNode)# 得到当前根节点对应的子树secondDict = myTree[firstStr]# 计算出新的y轴偏移量,向下移动1/D,也就是下一层的绘制y轴plotTree.yOff = plotTree.yOff - 1.0/plotTree.totalD# 循环遍历所有的keyfor key in secondDict.keys():# 如果当前的key是字典的话,代表还有子树,则递归遍历if isinstance(secondDict[key], dict):plotTree(secondDict[key], cntrPt, str(key))else:# 计算新的x轴偏移量,也就是下个叶子绘制的x轴坐标向右移动了1/WplotTree.xOff = plotTree.xOff + 1.0/plotTree.totalW# 打开注释可以观察叶子节点的坐标变化# print((plotTree.xOff, plotTree.yOff), secondDict[key])# 绘制叶子节点plotNode(secondDict[key], (plotTree.xOff, plotTree.yOff), cntrPt, leafNode)# 绘制叶子节点和父节点的中间连线内容plotMidText((plotTree.xOff, plotTree.yOff), cntrPt, str(key))# 返回递归之前,需要将y轴的偏移量增加,向上移动1/D,也就是返回去绘制上一层的y轴plotTree.yOff = plotTree.yOff + 1.0/plotTree.totalDdef createPlot(inTree):"""需要绘制的决策树:param inTree: 决策树字典:return:"""# 创建一个图像fig = plt.figure(1, facecolor='white')fig.clf()axprops = dict(xticks=[], yticks=[])createPlot.ax1 = plt.subplot(111, frameon=False, **axprops)# 计算出决策树的总宽度plotTree.totalW = float(getNumLeafs(inTree))# 计算出决策树的总深度plotTree.totalD = float(getTreeDepth(inTree))# 初始的x轴偏移量,也就是-1/2W,每次向右移动1/W,也就是第一个叶子节点绘制的x坐标为:1/2W,第二个:3/2W,第三个:5/2W,最后一个:(W-1)/2WplotTree.xOff = -0.5/plotTree.totalW# 初始的y轴偏移量,每次向下或者向上移动1/DplotTree.yOff = 1.0# 调用函数进行绘制节点图像plotTree(inTree, (0.5, 1.0), '')# 绘制plt.show()

六、运行结果
代码运行后生成的判别树如下:

my_tree = TreeGenerate(dataset, A)
{'纹理': {'清晰': {'根蒂': {'蜷缩': '好瓜','稍蜷': {'色泽': {'青绿': '好瓜','乌黑': {'触感': {'硬滑': '好瓜', '软粘': '坏瓜'}},'浅白': '好瓜'}},'硬挺': '坏瓜'}},'稍糊': {'触感': {'硬滑': '坏瓜', '软粘': '好瓜'}},'模糊': '坏瓜'}}

绘图:

createPlot(my_tree)

西瓜书决策树实现(基于ID3)——采用字典数据结构相关推荐

  1. 西瓜书决策树实现(基于ID3)补充——采用自定义数据结构实现

    刚刚写过一篇决策树实现的案列,树结构采用python自带的字典作为存储决策树的数据结构,为了下一步便于实现预剪枝和后剪枝,老叔认为采用自定义数据结构可能会更便于操作,也更灵活,可以在节点随意添加自己认 ...

  2. 决策树挑出好西瓜(基于ID3、CART)

    决策树挑出好西瓜(基于ID3.CART) 一.决策树 1. 介绍 2. 决策树事件处理流程 3. 理论基础 二.ID3决策树及Python实现 1. 数据处理 2. 步骤 3. 决策树实现 4. 分析 ...

  3. 西瓜书重温(四): 决策树手推版

    1. 写在前面 今天复习的决策树模型, 对应的是西瓜书的第四章内容, 关于决策树模型,重要性不言而喻了, 这个是后面集成学习模型的基础, 集成学习里面不管是bagging家族里面的代表随机森林,还是b ...

  4. ++代码实现 感知机的原理_决策树ID3原理及R语言python代码实现(西瓜书)

    决策树ID3原理及R语言python代码实现(西瓜书) 摘要: 决策树是机器学习中一种非常常见的分类与回归方法,可以认为是if-else结构的规则.分类决策树是由节点和有向边组成的树形结构,节点表示特 ...

  5. 决策树挑出好西瓜(基于ID3、C4.6、CART实现)

    文章目录 一.决策树介绍 利用信息增益选择最优划分属性 二.实现针对西瓜数据集的ID3算法代码,并输出可视化结果. 1.西瓜数据集 2. 代码实现 (1)建立决策树 (2)绘制决策树 三.C4.5方法 ...

  6. 《机器学习》西瓜书课后习题4.3——python实现基于信息熵划分的决策树算法(简单、全面)

    <机器学习>西瓜书课后习题4.3--python实现基于信息熵划分的决策树算法 <机器学习>西瓜书P93 4.3 试编程实现基于信息熵进行划分选择的决策树算法,并为表4.3中数 ...

  7. 【机器学习】西瓜书_周志华,python实现基于信息熵进行划分选择的决策树算法

    python:实现基于信息熵进行划分选择的决策树算法 本文主要介绍本人用python基于信息熵进行划分选择的决策树代码实现,参考教材为西瓜书第四章--决策树.ps.本文只涉及决策树连续和离散两种情况, ...

  8. 决策树入门【西瓜书】

    当一个有经验的老农看一个瓜是不是好瓜时,他可能会先看下瓜的颜色,一看是青绿的,心想有可能是好瓜:接着他又看了下根蒂,发现是蜷缩着的,老农微微点头,寻思着五成以上是好瓜:最后他又敲了下瓜,一听发出浑浊的 ...

  9. 【DataWhale学习】Day10~13-4章决策树——西瓜书学习摘录笔记

    [DataWhale学习]Day10~13-4章决策树--西瓜书学习摘录笔记 本文参考了周志华老师的西瓜书,李航老师的统计学习方法,谢文睿大佬的南瓜书(无推导尿点,仅加深理解食用) 决策树模型 ​ 决 ...

最新文章

  1. ios 支付宝支付集成
  2. 基于yolo4和yolo3(pytorch)的口罩识别的对比
  3. docker-compose 部署elk+解决时间不对导致kibana找不到logstash定义的index + docker-compose安装...
  4. resource busy and acquire with nowait specified解决方法
  5. 基本查询(Query查询中文)
  6. dubbo+rabbitmq+hystrix实现服务的高可用
  7. 讯飞输入法pad版x86_讯飞搜狗为何抵不过百度输入法?读完你就明白了
  8. python的类中包含什么_Python中的类(中)
  9. 力扣-1. 两数之和
  10. explain ref_explain的属性详解与提速百倍的优化示例
  11. 【语音识别】基于matlab高斯混合模型(GMM)说话人识别【含Matlab源码 574期】
  12. java read bytes 阻塞_InputStream中read()与read(byte[] b)java InputStream读取数据问题 | 学步园...
  13. 视频教程-DelphiXE10安卓开发(实战篇)-其他
  14. 大学生计算机vfp,计算机vfp教学课件
  15. 解决:视频中有噪声(电流声)怎么办的问题(简单实用高效的视频降噪方法)
  16. codec engine代码阅读四---CE_DIR/examples/ti/sdo/ce/examles/codecs/videnc_copy
  17. 军犬信息采编发系统vs网络神采
  18. 论文写作 2: 常见的 Latex 格式文件
  19. C++语言的特点有哪些
  20. ThinkPad E420/E520 Win10 开机慢的问题

热门文章

  1. Linux系统安装oracle客户端步骤详解
  2. 线上 2022 Apache IoTDB 物联网生态大会 | 直播地址一览,大会视频发布!
  3. 35K入职华为Java岗那天,我哭了:这5个月做的一切都值了
  4. Conmi的正确答案——linux/ubuntu安装web运维工具(Cockpit)
  5. 【转载】wpf绑定全局静态变量并且实现变更通知(mvvm)
  6. [CAD] 彩色CAD导出为黑白PDF
  7. mbp安装steam显示“steam_osx”已损坏,mac安装steam方法
  8. ASEMI二极管A7参数,A7二极管规格书,A7二极管的封装
  9. linux防火墙禁止所以端口,利用iptables来配置linux禁止所有端口登陆和开放指定端口...
  10. Python-励志公式