分离链接的散列
散列散列为一种用于以常数平均时间执行插入,删除和查找的技术。一般的实现方法是使通过数据的关键字可以计算出该数据所在散列中的位置,类似于Python中的字典。关于散列需要解决以下问题:
散列的关键字如何映射为一个数(索引)——散列函数
当两个关键字的散列函数结果相同时,如何解决——冲突
散列函数散列函数为关键字->索引的函数,常用的关键字为字符串,则需要一个字符串->整数的映射关系,常见的三种散列函数为:
ASCII码累加(简单)
计算前三个字符的加权和$\sum key[i] * 27^{i}$ (不太好,3个字母的常用组合远远小于可能组合)
计算所有字符加权和并对散列长度取余$(\sum key[i] * 32^{i}) \% tablesize$(较好)
12345678910111213141516171819202122232425262728// 累加func (n *node) hashSum() int { hash := 0 for i := range n.key { hash += int(n.key[i]) } ...
Windows平台Python调用C++(swig)
步骤0:swig简介swig是一种可以将C++代码转换为多种脚本语言封装的工具,可以在swig官网下载,解压后将swig.exe的路径添加到环境变量path中即可使用swig
步骤1:准备C++代码编写需要在Python中调用的C++代码,最好将函数和类的声明统一放到头文件中,函数和类的实现放到源文件中
C++头文件头文件主要包括:
#include调用(例如#include <iostream>)
命名空间指定using namespace std;
函数和类的声明
1234567891011#include <iostream>using namespace std;class example { private: int num; public: void say_hello(void); void change(int din); int get_num();};
C++源文件源文件为头文件中函数和类的实现
12345678910111213#include &q ...
空难数据集的探索分析
写在前面:这是我见过的最严肃的数据集,几乎每一行数据背后都是生命和鲜血的代价。这次探索分析并不妄图说明什么,仅仅是对数据处理能力的锻炼。因此本次的探索分析只会展示数据该有的样子而不会进行太多的评价。有一句话叫“因为珍爱和平,我们回首战争”。这里也是,因为珍爱生命,所以回首空难。现在安全的飞行是10万多无辜的人通过性命换来的,向这些伟大的探索者致敬。
123import pandas as pdimport numpy as npimport matplotlib.pyplot as plt
导入数据集12crash = pd.read_csv("./Airplane_Crashes_and_Fatalities_Since_1908.csv")crash.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5268 entries, 0 to 5267
Data columns (total 13 columns):
Date 5268 non-nul ...
基于mxnet的LSTM实现
RNN理论基础基本RNN结构
RNN的基本结构如上左图所示,输出除了与当前输入有关,还与上一时刻状态有关。RNN结构展开可视为上右图,传播过程如下所示:
$ I_{n} $ 为当前状态的输入
$ S{n} $ 为当前状态,与当前输入与上一时刻状态有关,即 $ S{n} = f(W \times S{n - 1} + U \times I{n}) $ ,其中f(x)为激活函数
$ O{n} $ 为当前输出,与状态有关,为 $ O{n} = g(V \times S_{n}) $ ,其中f(x)为激活函数
整个结构共享参数U,W,V。
当输入很长时,RNN的状态中的包含最早输入的信息会被“遗忘”,因此RNN无法处理非常长的输入
基本LSTM结构
LSTM为特殊为保存长时记忆而设计的RNN单元,传递过程如下:
遗忘:决定上一时刻的状态有多少被遗忘,由遗忘门层完成,有 $ f{n} = sigmoid(W{f} \times [h{n-1},x{n}] + b{f}) $ ,该结果输出的矩阵与 $ C{n-1} $ 对应位置相乘,对状态起衰减作用
输入:决定哪些新信息被整合进状态,由输入 ...
基于sklearn的文本特征抽取
理论机器学习的样本一般都是特征向量,但是除了特征向量以外经常有非特征化的数据,最常见的就是文本
结构化数据当某个特征为有限的几个字符串时,可以看成一种结构化数据,处理这种特征的方法一般是将其转为独热码的几个特征。例如仅能取三个字符串的特征:a,b,c,可以将其转换为001,010,100的三个特征和
非结构化数据当特征仅是一系列字符串时,可以使用词袋法处理,这种方法不考虑词汇顺序,仅考虑出现的频率
count vectorizer:仅考虑每种词汇出现的频率
tfidf vectorizer:除了考虑词汇出现的频率,还考虑词汇在样本总体中出现频率的倒数,可以理解为抑制每个样本中都经常出现的词汇
对于经常出现的无意义词汇,如the和a等,可以将其指定为停用词消除其对于结果的干扰
代码实现导入数据集12from sklearn.datasets import fetch_20newsgroupsnews = fetch_20newsgroups(subset='all')
123from sklearn.model_selection import train_tes ...
AVL二叉查找树
AVL二叉查找树AVL二叉查找树是一种特殊的二叉查找树,其规定
每个节点的左子树和右子树的高度差最多是1
AVL调整算法AVL树插入一个新的节点到某个节点下破坏AVL树的要求时,对于破坏条件的第一个节点a(最靠近底部/深度最深的节点),具有四种情况:
插入a的左儿子节点的左子树
插入a的左儿子节点的右子树
插入a的右儿子节点的左子树
插入a的右儿子节点的右子树
其中,第一种和第四种可以看成一种情况的镜像,均是插入外侧;第二种和第三种可以看成另一种情况的镜像,均是插入内侧。这两种情况分别对应两种不同调整方法——单旋转和双旋转。其核心思想都相同,都是尽量将违规子树的父节点的位置尽量向上提。
单旋转调整考虑入下左图所示的情况,假设X与Z的深度相同且,整棵树符合AVL条件:
若插入一个小于b的值,则X的深度将+1,从a节点来看,左子树的深度就比右子树大2,不符合条件。调整的方法如右图所示,以下是调整的合理性:
查找树条件:X子树存储的数据小于b,Z子树存储的数据大于a,Y子树存储的数据范围时(b,a),且a>b,由此看出转换后的数依然是一颗查找树。
AVL条件:X深度比Z深1 ...
有基础mxnet和gluon快速入门
1234import numpy as npimport mxnet as mximport logginglogging.getLogger().setLevel(logging.DEBUG) # logging to stdout
mxnet基本数据结构ndarrayndarray是mxnet中最基本的数据结构,ndarray和mxnet的关系与tensor和pytorch的关系类似。该数据结构可以看成numpy的一种变体,基本上numpy的操作ndarray都可以实现。与ndarray相关的部分是mxnet.nd.,关于ndarray操作的API可查看官方API文档
ndarray操作12345a = mx.nd.random.normal(shape=(4,3))b = mx.nd.ones((4,3))print(a)print(b)print(a + b)
[[ 0.23107234 0.30030754 -0.32433936]
[ 1.04932904 0.7368623 -0.0097888 ]
[ 0.46656415 1.72023427 0.87 ...
Python硬件建模——链表FIFO管理器
软件建模需求建立一个软件模型,在事物级对硬件链表FIFO管理器的各个部分进行建模,包括:
RAM模型
链表地址管理模型
系统模型
能够模拟的行为包括:
初始化
外部读
外部写
技术路线选择
项目
技术路线
建模语言
python 3.5
第三方库
numpy
软件建模结构
平台由三个类组成:
hardware_link_model:对controller和initialize的建模
addr_manager:对addr_manager的建模,负责管理start_addr和final_addr
ram_model:对RAM建模,包括读和写
模型运行流程initialize
write
read
代码实现基本数据结构——结点12345678class node_data(object): """docstring for node_data""" def __init__(self, page_capacity_width=4): super(node_data, s ...
基于sklearn的主成分分析
理论部分特征降维特征降维是无监督学习的一种应用:将n维的数据降维为m维的数据(n>m)。可应用于数据压缩等领域
主成分分析(PCA)主成分分析是一种常用的特征降维方法,对于m维的数据A,可以降维获得一个n维的数据B(m>n),满足$B = f(A)$且$A \approx g(f(A))$,其中f(x)为编码函数,g(x)为解码函数。
当进行主成分分析时,优化目标为$c = argmin ||x - g(c)||_{2}$,其中c为编码,g(c)为解码函数
代码实现导入数据集12import numpy as npimport pandas as pd
12digits_train = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/optdigits/optdigits.tra', header=None)digits_test = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learnin ...
二叉查找树
二叉查找树二叉查找树是一种特殊的二叉树,该数据结构的核心性质是:
对于树中的每个节点X,它的左子树中所有关键字值小于X的关键字值,而它的右子树中所有关键字值大于X的关键字值
二叉查找树ADT
MakeEmpty:清空二叉查找树
Find:给出关键字值,返回该关键字值的节点指针
FindMin与FindMax:返回最小关键字值和最大关键字值的节点指针
Insert:插入一个给定关键字值的节点
Delete:删除一个指定关键字值的节点
代码实现结构体1234567891011type tree_data struct { data int}type tree_node struct { num int data tree_data left_point *tree_node right_point *tree_node parent *tree_node}
构造函数123456789func New_tree_node(num int, data tree_data, parent *tree_node ...