关于蘑菇数据集的探索分析
123import pandas as pdimport numpy as npimport matplotlib.pyplot as plt
数据集描述蘑菇数据集,包括毒性,大小,表面,颜色等,所有数据均为字符串类型,分析毒性与其他属性的关系
读取数据集12dataset = pd.read_csv("./mushrooms.csv")dataset.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 8124 entries, 0 to 8123
Data columns (total 23 columns):
class 8124 non-null object
cap-shape 8124 non-null object
cap-surface 8124 non-null object
cap-color 8124 non- ...
树与二叉表达树
树基础定义数的定义可以使用递归的方法定义:一棵树是一些节点的集合。一棵树由根节点和0~多个非空树(即子树)组成。这些子树中的每一颗根节点都被来自母树跟的一条有向边链接。母树的根节点被称为父节点,子树的根节点被称为子节点。
其他定义
树叶:没有子节点的节点
n到m的路径的长:n到m路径上边的数量
n的深度:从根节点到n节点的唯一路径长度
n的高:从n节点到树叶的最长路径长度
树的实现可以由链表实现:
对于确定子节点数量不多或固定的情况下(如二叉树),每个节点具有所有子节点的指针
对于一般数,每个节点具有一个子节点和一个兄弟节点的指针
树的遍历树的遍历可以用递归实现,对于每一个节点,分为为两步:
处理当前节点内容(如打印等)
递归调用处理子节点
该顺序成为先序遍历,以上两个步骤顺序可以调换,为后序遍历(先处理子节点,再处理本节点)
1234567891011func read_tree(path, indent string) { files, _ := ioutil.ReadDir(path) fmt.Println(indent, path) for _, i := ...
基于sklearn的K均值类聚
理论无监督学习无监督学习是相对于有监督学习的概念,无监督学习的样本只有数据没有标签(label),由模型自主发现样本之间的关系。可用于数据的类聚(类聚算法)和降维(主成分分析)等。
无监督学习的结果评估ARI指标当样本有真实指标(带label)时,可以使用ARI(调整兰德指数),公式为RI = \cfrac{a + b}{C_{2}^{n_{sample}}} ARI = \cfrac{RI - E(RI)}{max(RI) - E(RI)}其中:
a:在预测结果和测试结果中同属于一类的样本对数
b:在预测结果和测试结果中均不属于一类的样本对数
该值越大,说明结果越好
轮廓系数轮廓系数不需要先验知识,计算过程如下:
对于每一个样本,计算同类样本中其他样本到该样本的评价距离a
分别计算其他类样本中各类样本到这个样本的平均距离,找到平均距离最近的一个类到该样本的平均距离
计算轮廓系数$sc=\cfrac{b - a}{max(a,b)}$
对所有样本重复该过程,取平均值为轮廓系数
k 均值类聚(k-mean)k均值类聚是一种简单的无监督学习模型,该模型是基于距离的类聚模型,将把特征 ...
队列及其实现
队列队列即FIFO,一言以蔽之就是先进先出。比如入队列的顺序是1,2,3,4,那么出队列的顺序也是1,2,3,4
队列的实现软件——GO语言实现除了使用链表和数组实现链表以外,GO语言内置一种新的数据结构叫切片,可以实现类似于动态语言中的list的一些功能(切片和append),用这个数据结构实现队列非常容易
结构体1234type fifo struct { data []int length int}
出队列方法f.data[1:]就是类似于python中的切片操作,表示切掉第一个值,剩下的保留
12345678910func (f *fifo) Pop() (int, error) { if len(f.data) == 0 { return 0, errors.New("empty fifo") } else { temp := f.data[0] f.data = f.data[1:] f.length-- return temp, nil }}
入队列方法app ...
栈的应用
中缀表达式转换为后缀表达式后缀表达式做数学运算时,经常使用的是中缀表达式,即“操作数 运算符 操作数”。在计算机处理的时候更习惯后缀表达式,即“操作数 操作数 运算符”。例如a + b * c转换为后缀表达式a b c * +,使用栈可以将中缀表达式转换为后缀表达式,具体的方法为:
扫描到数字直接输出
扫描到运算符则与栈顶比较,若扫描到的运算符优先级低于或等于栈顶运算符的优先级,则弹栈直到栈空或栈顶运算符优先级低于扫描到的运算符,之后运算符入栈;否则直接入栈。
若扫描到),则一直弹栈直到(出栈
代码实现——调用链表栈数据结构1234type Stack_data struct { Num int Op string}
运算符优先级MAP使用一个全局变量map保存各个运算符的优先级
123456var priority_dict = map[string]int{ "+": 0, "-": 0, "*": 1, "/": 1, "(": -1} ...
基于sklearn的一些回归器模型
理论支持向量机回归器支持向量机回归器与分类器相似,关键在于从大量样本中选出对模型训练最有用的一部分向量。回归器和分类器的区别仅在于label为连续值
K临近回归器K临近回归器任然是取特征向量最接近的k个训练样本,计算这几个样本的平均值获得结果(分类器是投票)
回归树回归树相对于分类树的最大区别在于叶子节点的值时“连续值”,理论上来书回归树也是一种分类器,只是分的类别较多
集成回归器随机森林和提升树本质上来说都是决策树的衍生,回归树也可以衍生出回归版本的随机森林和提升树。另外,随机森林还可以衍生出极端随机森林,其每个节点的特征划分并不是完全随机的
代码实现数据预处理数据获取123from sklearn.datasets import load_bostonboston = load_boston()print(boston.DESCR)
Boston House Prices dataset
===========================
Notes
------
Data Set Characteristics:
:Number of Instances: 5 ...
栈与栈的实现
栈栈是一种基础的数据结构,只从一端读写数据。基本特点就”后进先出“,例如顺序入栈1,2,3,4,5,再顺序出栈是5,4,3,2,1
栈的基本操作栈的基本操作有如下几种:
检测栈是否为空
返回栈存储数据的数量
返回栈顶数据/返回栈顶数据并将其弹出
将数据压入栈
清空栈
栈的实现软件实现——GO语言软件的栈可以使用链表基本结构实现或使用数组实现:使用链表栈的优势是栈的容量几乎不限,确定是入栈出栈都需要开销较大的声明结构体;数组实现的优势是速度快(自增自减一般有指令实现),但是空间必须预先指定。
统一adt接口12345678type Stack_adt interface { Is_empty() bool Get_depth() int Push(data Stack_data) Pop() (Stack_data, error) Get_head() (Stack_data, error) Clear()}
链表栈数据结构123456789type stack_node struct { data Stack_data next *stack_node ...
基于sklearn的线性回归器
理论线性回归器相比于线性分类器,线性回归器更加自然。回归任务的label是连续的变量(不像分类任务label是离散变量),线性回归器就是直接通过权值与输入对应相乘再相加直接计算出结果y = w^{T}*x + b其中,w为权值,x是输入,y是输出
回归器的优化与分类器类似,回归器也是通过梯度优化的,一般来说分类问题常用均方误差函数来标定结果的质量(即代价函数)L(w,b) = \sum (y - y')其中y为模型输出,y’为期望值。
代码实现数据集导入123from sklearn.datasets import load_bostonboston = load_boston()print(boston.DESCR)
Boston House Prices dataset
===========================
Notes
------
Data Set Characteristics:
:Number of Instances: 506
:Number of Attributes: 13 numeric/categorical predi ...
表的应用——排序与多项式
排序朴素排序在链表建立的过程中可以直接完成排序功能,即建立一个新链表并将源数据一个一个存进新链表中,每个元素存储的位置在小于这个元素的节点和大于这个元素的节点之间
排序部分12345678910func (s *sort_table) append(data int) { node := s.head for (node.next != nil) && (node.next.data.data <= data) { node = node.next } new_data := table_data{data} new_node := &table_node{new_data, node.next} node.next = new_node s.length++}
判断要插入的值是否刚比下一个值小,若小则插入这一个节点与下一个节点之间。若无比要插入值大的节点则将待插入值插入链表的最后
遍历部分123456789func (s *sort_table) return_result ...
基于sklearn的集成分类器
理论集成模型集成分类器模型是综合考虑多种机器学习模型的训练结果,做出分类决策的分类器模型
投票式:平行训练多种机器学习模型,每个模型的输出进行投票做出分类决策
顺序式:按顺序搭建多个模型,模型之间存在依赖关系,最终整合模型
随机森林分类器随机森林分类器是投票式的集成模型,核心思想是训练数个并行的决策树,对所有决策树的输出做投票处理,为了防止所有决策树生长成相同的样子,决策树的特征选取由最大熵增变为随机选取
梯度上升决策树梯度上升决策树不常用于分类问题(可查找到的资料几乎全在讲回归树),其基本思想是每次训练的数据是(上次训练数据,残差)组成(不清楚分类问题的残差是如何计算的),最后按权值组合出每个决策树的结果
代码实现导入数据集——泰坦尼克遇难者数据123import pandas as pdtitan = pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt")print(titan.head())
row.names pclass survive ...