Hadoop
bilibili Hadoop是处理大数据的关键设施,常见的数据处理方法(例如使用MySQL存储数据,使用Java分析数据)在处理TB、PB级别的数据时,无论是存储数据、还是读写数据,都十分乏力。物理上不存在PB级别的硬盘,因此海量的数据要被划分为多个部分,存储在多台机器上;而查询数据的时候,又需要将计算任务分成多个子任务在多台机器上并行计算。Hadoop就是为了简化大量数据的处理逻辑而存在的软件。 Hadoop内部由多个组件构成,包括MapReduce,HDFS,Yarn等组件,每个组件都有各自独特的功能。 HDFS HDFS全名 Hadoop Distributed File System,Hadoop分布式文件存储系统,是将文件分布存储在多个计算机上并管理的软件。HDFS将数据分成一个个128MB的 Block(数据块),然后将所有...
Raft协议
Raft协议是经典的Crash Fault Tolerance共识协议,这个协议为了易于理解性将简化了共识协议的内容,牺牲了协议的性能。Raft协议采取单Leader架构,整体算法的瓶颈在于充当Leader的节点的CPU、内存和带宽。在极限情况下Raft的吞吐量跟常见的其他CFT共识协议(例如Multi-Paxos)不会有太大差距,理论上Multi-Paxos协议的吞吐量会更高一些,但是在工程实践中这种差距几乎感觉不出来。 在极端TPS情况下,采用Leaderless架构的EPaxos、WPaxos协议能做到更高的TPS,但是EPaxos工程实现难度远高于Raft协议,EPaxos协议需要处理复杂的请求之间的依赖关系以实现并行处理请求。在常规分布式系统中,稳定简单的Raft协议完全够用。 在工程实践中,以下因素更能影响协议最后的吞吐量: 网络延迟,RTT(Round Trip Time):这是大部分共识协议最大的瓶颈。 使用批处理(Batch...
凸函数优化笔记(1)
向量的范数 norm 我们用符号双竖杠来表示向量范数,例如来表示向量的范数。向量的范数是我们可以用来衡量向量“大小”或者“长度”的一个指标。其定义形式如下,我们通常说一个向量的-norm为: 其中为一个大于1的实数 如果,那么的范数就是我们熟知的曼哈顿距离的公式: 如果,那么的范数就是我们熟知的欧几里得距离,他描述了向量的长度: 如果我们没有注明的值,通常我们默认,即 时,范数描述了向量的长度,假设是一个二维的向量,那么的范数描绘在平面上的长度;如果是一个三维的向量,那么的范数描述了向量在空间中的长度;由此推广,当在四维、五维,甚至更高维度的空间内时,范数描述了向量在更高维空间中的长度。 而当趋于的时候,向量的范数趋向于中绝对值最大的分量,即: 柯西-施瓦茨不等式(Cauchy-Schwarz inequality) 柯西不等式公式为: 或者进一步可以写为: 回忆一下向量乘法的规则: 所以柯西不等式式其实只是在另一个方面论证了一个简单的事实 : 赫尔德不等式(Holder’s...
线性函数定义
这句话“a linear function of linear function is still a linear function”有严谨的数学推导论证。下面我将从线性代数的角度进行详细推导。 线性函数的定义 在数学中,一个函数 是线性的,当且仅当它满足以下两个条件: 可加性:对于所有向量 ,有 。 齐次性:对于所有标量 和向量 ,有 。 问题陈述 假设有两个线性函数: 是线性的, 是线性的。 定义组合函数 为 。我们需要证明 也是线性的。 严谨推导 1. 验证可加性 对于任意 : 由于 ( g ) 是线性的,满足可加性,因此 ( g(x + y) = g(x) + g(y) )。代入上式: 又因为 ( f ) 是线性的,也满足可加性,因此 ( f(g(x) + g(y)) = f(g(x)) + f(g(y)) )。所以: thus, 满足可加性。 2. 验证齐次性 对于任意标量 和向量 : 由于 ( g ) 是线性的,满足齐次性,因此 。代入上式: 又因为 ( f ) 是线性的,也满足齐次性,因此 。所以: thus, ...
神经网络's Gradient
正向传播 假设我们的神经网络是由三层神经元构成:分别是一层拥有4个神经元的隐藏层,一层拥有三个神经元的隐藏层,以及最后一层只拥有一个神经元的输出层,神经网络结构如下图所示: 假设我们输入的数据的维度是2,那么第一层神经元里面的每一个神经元都有和两个权重以及一个偏置,整个第一层就一共有...
手写线程池
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106use std::sync::mpsc::Receiver;use std::sync::{mpsc, Arc, Mutex};use std::thread;use std::thread::JoinHandle;/// 手写一个线程池type Job = Box<dyn FnOnce() + Send + 'static>;struct Worker { id: usize, join_handle: Option<JoinHandle<()>>,}impl...
逻辑回归's Gradient
损失函数和代价函数 我们使用交叉熵损失(Cross Entropy Loss)函数作为逻辑回归算法的损失函数,其公式如下 其中, 为 Sigmoid 函数,通过计算给出的输入和自身权重乘积(以及加上偏置),经过Sigmoid函数的处理,最后计算出一个处于(0,1)之间的概率,这个概率表示预测为真的概率。Sigmoid函数公式如下: 其中 与 等价,都是计算 ,只不过前者为矩阵写法,表示一个一维矩阵的转置(transpose)乘以另外一个一维矩阵,而后者是常见的求和公式。使用矩阵写法不仅在书写上更方便,也更符合我们需要在NumPy中需要写的代码。 一个小细节:为什么机器学习中总是习惯性的写成,而不是?因为在机器学习中,我们习惯性的将和 视作形状为 的列向量(column vector) ,于是实际上是一个形状,求转置后,成为一个形状为的矩阵,然后乘以另一个形状为...
线性回归's Gradient
损失函数和代价函数 在线性回归中,我们通常使用MSE(Mean Square Error, 均方误差) 作为我们算法的损失函数,其基本思想为衡量预测值和真实结果之间的绝对距离。MSE的公式为:。同时我们为了防止函数过拟合,我们引入正则表达式。在这里,我们先用L2正则表达式作为例子,L2正则表达式为:。结合这两项,我们函数的代价函数可以表达为: 。 在反向传播中,我们需要计算梯度,以更新算法的权重: 计算梯度 根据求导规则,对** x+y求导** 等于 对x求导 加上 对y求导,即 (x + y)’ = x’ + y’ : MSE梯度 我们分别计算两个部分,我们先计算第一部分: 根据链式法则,我们有 f[g(x)]’ = f(g(x)) * g’(x),于是 其中: 所以,第一部分求导结果如下 正则表达式梯度 我们再对正则表达式部分求导: 正则表达式和MSE部分梯度总结起来就是: 计算Bias梯度 接着我们对b求导 其中: 所以更新权重的算法现在为: 深入理解L2正则表达式 通过观察上面的更新公式,我们可以观察到: 其中为学习率,为正则参数,m...
PyO3
Overview PyO3 是一个用于 rust 和 python 代码互操作的库,可以用来给 python 代码写加速库,提升Python的运行速度。 123456789101112131415161718192021222324252627use pyo3::prelude::*;#[pyfunction]pub fn double(x: usize) -> usize { x * 2}#[pyclass]struct Number(i32);#[pymethods]impl Number { #[new] fn new(value: i32) -> i32 { Number(value) }}/// 这是一个文档#[pymodule]#[pyo3(name = "add_as_string")]fn my_extension(m: &Bound<'_, PyModule>) ->...
PostgreSQL使用指南
安装PostgreSQL 在Mac上可以直接使用Homebrew安装: 1brew install postgresql 启动PostgreSQL服务 在MacOS上可以使用以下命令启动/停止PostgreSQL服务 12brew services start postgresql # 启动brew services stop postgresql # 关闭 在windows平台上则使用net命令: 12net start postgresql-x64-14 # 启动net stop posgresql-x64-14 # 关闭 使用PostgreSQL 在启动了PostgreSQL服务后,我们就可以使用 psql 命令行工具连接 PostgreSQL了(这个工具一般在PostgreSQL的安装目录的/bin目录下)。 直接在命令行中输入psql就能进入到默认的数据库内,或者我们可以使用 psql -U [用户名] -d [数据库名]指定用户名和要连接的数据库: 1234567nietianyi@Mac ~ % brew services start...