hexo自动更新文章修改时间(python实现版)
问题描述 在之前Github Action部署博客时遇到的文章更新时间问题,是通过js代码来解决的,参考hexo自动更新文章修改时间。但是该文章的js实现存在一些问题,因此这里改用python实现,核心的原理不变,都是通过读取文件的updated字段并修改来实现的。 代码 下面给出实现代码: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253import osimport refrom datetime import datetimeLINE_LIMIT = 20base_path = "./source/_posts"ALL_FILES = []def get_all_files(current_dir): files = os.listdir(current_dir) for file in files: new_path = os.path.join(current_dir, file) if os ...
线性空间和线性变换
1 线性空间 1.1 数域 定义:在代数系统中,数域是一个集合,该集合中任取两个元素进行加减乘除运算后,得到的结果仍在该集合中(封闭性)。常见的数域包括有理数域、实数域、复数域等等。 1.2 线性空间 线性空间是线性代数最基本的概念,我们考虑的数域为实数域和复数域,统称数域。 定义:设是一个非空集合,是数域,在集合的元素之间定义了加法运算,即对于中任意两个元素和,在中都有唯一的元素与它们相对应,称之为和的和,记做:,并且加法运算满足下面的四条法则: 交换律, 结合律, 零元素,在中有一个元素0(并不一定是数0),对中任意元素都有 负元素,对于每个元素都有中的元素使得 在中的元素与数域中的数之间定义了一种运算,叫做数乘运算。即对于中任意元素与数域中任意数,在中有唯一的元素与它们对应,称为与的数乘,记做:,且数乘满足下面的四条法则: 称满足以上八条运算性质的集合为数域上的线性空间。 举几个线性空间的例子。 例1 阶实方阵集合由线性代数知识可知矩阵具有加法运算和数乘矩阵运算。对于矩阵加法运算,满足交换律和结合律;集合中存在零矩阵(),满足;对于中的任意一个矩阵,都有对 ...
Hessian矩阵
1 一元函数的极值 设函数在处具有二阶导数,若,则在处取得极值,且当时取得极小值,时取得极大值。 根据该定理,对于一个连续且处处具有二阶导数的一元函数,求它的极值方法为:首先求出的驻点,然后计算驻点处的二阶导数值,如果二阶导数不为0,则按照定理判断,如果为0,则需要根据极值的定义进行判定。 2 二元函数的极值 二元函数的极值问题一般可以使用偏导数来解决。 极值的必要条件:考虑二元函数在具有偏导数,且极值点,则有和。 一般情况下,多元函数的极值点与驻点并没有关联,因此需要下面的充分条件进行判定。 极值的充分条件:二元函数在点的某邻域内连续且有一阶和二阶连续偏导数,又,令: 则在点: 当,有极值:若,则为极小值;若,则为极大值 当,无极值(此时的驻点称为鞍点,可以想象马鞍形从正面和侧面的投影分别是最高点和最低点) 当,可能有极值,可能没有极值,需要根据其他方法(比如根据定义)进行判断 该定理可以根据二元函数的泰勒公式证明,可以参考一些高等数学或数学分析教材,这里略。 3 Hessian矩阵和多元函数的极值 下面对更多元的函数极值进行研究,首先研究为什么二元函数的极值判别要使用。在上面 ...
神经网络
一、感知机 1 神经元模型 神经网络的最基本单元为神经元,灵感来自于生物学中的神经细胞。生物神经元与其他神经元相连,当某个神经元“激活”时,就会向相连的神经元发送化学物质(或电信号),从而改变这些神经元的电位,许多神经元彼此相连构成一张庞大的神经网络。 “激活”指的是某个神经元收到的“刺激”到达一定阈值之后,就会“兴奋”,反之则不会发生任何动作。人工神经网络中的实现中,“M-P”模型沿用至今。在这个模型中, 神经元接收个其他神经元传递的信号,这些信号通过带权重的连接进行传递,神经元接收到的总输入值将与神经元的阀值进行比较,然后通过“激活函数“ 处理以产生神经元的输出。 理想的激活函数为阶跃函数: 它将输入映射为0和1,0表示神经元抑制,1表示神经元兴奋。把许多个这样的神经元按一定的层次结构连接起来,就得到了神经网络。 2 感知机模型 2.1 模型建立 感知机由两层神经元组成,模型可以表示为: 其中,为样本的特征向量,是感知机模型的输入;是感知机模型的参数,为权重,为阈值。在感知机模型中,可以理解为控制着输入参数的重要性,偏置则调整了神经元被激活的容易程度,举例来说,若,则表示输入信 ...
矩阵分解
1 LU分解 1.1 直观理解 LU分解(lower-upper decomposition)的原理是将一个方阵分解为一个下三角矩阵和一个上三角矩阵的乘积。即满足: LU分解的原理是高斯消元法,具体来说就是通过行变换将化为上三角矩阵。 举例,对于矩阵: 进行初等行变换,将下三角部分消去,首先将第一行的1.5倍加到第二行,: 第一行的1倍加到第三行,: 第二行的-4倍加到第三行,: 此时已经化为上三角矩阵,记。 上述行变换操作,可以视为一系列初等矩阵依次左乘原始矩阵: 其中每个标注的元素称作消元因子,其位置和大小记录了此次消去操作的信息。 此时,高斯消去过程可以写作: 将一系列合并: 在上面的例子中,可以计算出 为满秩矩阵,因此可以求得: 对(1)式两边左乘,得:,这个就是下三角矩阵。 1.2 存在性和唯一性 存在性: 并非所有矩阵存在LU分解。对于方阵存在LU分解的前提是可逆,且的前个顺序主子式不为零(在LU分解中,我们限制了对系数矩阵中行的互换)。 唯一性: 对于可逆阵有,其中为下三角矩阵,为上三角矩阵,且,其中,则LU分解唯一。 : 设可逆阵有两个LU分解:, ...
决策树
一、决策树模型 决策树(decision tree) 是一类常见的机器学习方法,主要用作分类任务。一般一棵决策树包含一个根节点、若干个内部节点和若干个叶节点,叶节点对应于决策结果,其他每个节点则对应于一个属性测试。每个节点包含的样本集合根据属性测试的结果被划分到子节点中。根节点包含样本全集,从根节点到每个叶节点的路径对应了一个判定测试序列。决策树判定流程遵循简单且直观的分支策略。 决策树由上到下的每轮判定都会选择最佳属性,一般而言,随着划分过程不断进行,我们希望决策树的分支结点所包含的样本尽可能属于同一类别,信息熵就是度量样本集合纯度最常用的一种指标。 1 信息量和信息熵1 信息数学理论以概率论和统计学为基础,用多个信息量来衡量信息。在信息论中,信息用来表示事物的不确定性,任何已经确定的事物都不含有信息,例如:“明天是晴天”包含信息,“太阳东升西落”不包含信息。换句话说,信息中蕴含的是一个服从某个概率分布的随机变量,随机变量的取值就是一个事件。 1.1 自信息量 自信息量(Self-information)由香农提出,是与概率空间中的单一事件或离散随机变量的值相关的信息量的量度,表示为 ...
浅谈动态规划
持续更新中 1 什么是动态规划 动态规划既是一种数学优化方法,也是一种算法范式。该方法由理查德·贝尔曼 (Richard Bellman) 在 20 世纪 50 年代开发,已在从航空航天工程到经济学等众多领域得到应用。为了适用动态规划,问题必须具有两个关键属性:最优子结构和重叠子问题。如果一个问题可以通过组合非重叠子问题的最优解来解决,则该策略称为“分治”,这就是为什么归并排序和快速排序不属于动态规划问题的原因。最优子结构是指给定优化问题的解可以通过其子问题的最优解的组合来获得。这种最优子结构通常通过递归的方式来描述1。 从一个简单的例子介绍,那就是斐波那契数列(Fibonacci Sequence),它可以通过递推的方法定义: 可以发现,这个递推公式就是一个递归定义,因此我们可以通过程序实现求解: 123456789fn fib(n: i32) -> i32 { if n == 0 { return 0; } else if n == 1 { return 1; } else { return fib(n - 1 ...
线性模型
线性模型(linear model) 试图学得一个通过属性的线性组合来进行预测的函数,即: 其中,当确定和之后,整个模型即可确定。 一、线性回归 线性回归是其中最经典的一种回归模型。 1线性回归的求解 求解可分为梯度下降法和最小二乘法。 1.1 梯度下降法 假设函数: 为了统一,令,即可得到假设函数。 损失函数即样本值与实际值的差值的平方(欧氏距离): 代价函数是所有样本点的损失求和,通过均方误差(mean-square error, MSE)来定义,在线性回归中,最小二乘法就是试图找到一条直线,使所有样本到直线上的欧氏距离之和最小。分母中的2用于后续求导的方便: 显然我们希望损失函数最小,即模型预测的结果与实际对应结果的误差最小,因此对求导: 为样本数量,表示第个特征的第条数据(矩阵的第行第列),根据上式有迭代公式: 其中,为步长(学习率)代表每次沿梯度下降的幅度,当迭代次数足够大时,损失函数最终会收敛到一个局部的极值点。 对于上述的迭代公式,分别代入不同的,即可得到对应的。 举例,考虑两个特征的情况,训练数据集如下: 1 150 2 300 1 ...
关于二分查找算法的一些细节
1、二分查找的基本介绍 二分查找,是一个非常高效的算法,主要用于从有序(默认递增)的区间中寻找某个符合条件的值。算法的思想也很简单: 确定搜索区间端点和 计算区间中点,如果是奇数我们通常下取整,即 将中点的值与目标值进行比较,如果: 相等,返回中点位置 中点的值大于目标值,将区间缩小到至左半部分,即缩小 中点的值小于目标值,将区间缩小到至右半部分,即增大 重复以上步骤,直到: 找到目标值 搜索区间为空 在代码实现上需要注意的细节 算法原理非常简单不过多赘述。下面主要是讲一些具体的实现细节,否则有的时候不注意就把算法写成死循环,或者数组越界。 1、写开区间还是闭区间?什么时候退出循环? 在实现二分查找的时候,相比于算法,区间的定义实际上是最重要的问题。这个问题直接影响到了初始的定义,的更新以及循环的退出条件,十分重要。因此,有必要明确一下什么是“区间”: 可以做如下定义:区间指的是每一次二分查找过程中的搜索区间,区间由左右端点组成,不妨用left和right表示,在搜索过程中,时刻保持着:区间内的值还没有被确定,而区间外的值已经被确定。这句话隐含的信息是:目标值一定在区间内, ...
毛选阅读——第二篇《湖南农民运动考察报告》
矫枉必须过正,不过正不能矫枉 写作背景是教员为了答复党内外对于农民革命斗争的责难而写的一篇考察报告,当时的中国北伐战争大规模展开,有效地打击了军阀的势力,给农民运动的发展创造了极为有利的条件。 广大农民将过去的地主豪绅,反动势力的权利打下去,把几千年来的封建地主阶级特权打得落花流水。为了支持农民运动,驳斥党内以陈独秀为代表的右倾机会主义,教员从 1927 年 1 月 4 日开始,亲自到达湖南,开展了 32 天的农民运动考察,广泛接触了有经验的农民和农运干部,召开了各种不同类型的调查会,最终写成此文。 文章开头指出了农民运动打击的主要目标,是土豪劣绅、不法地主,以及各种封建地主阶级制度和恶劣习惯。 在考察中,教员发现对于农民在乡里造反,存在两种不同的声音。当乡里的消息传到城里来,中层以上社会至国民党右派,无一不一言以蔽之——“糟得很”。对于农民和革命派的理论则是“好得很”。当时兴起的农民运动,声势浩大,摧枯拉朽,迅猛异常。他们在几个月就做到了孙中山 40 余年想做而没有做成的事,因此教员说“糟得很”是站在地主利益方面打击农民起来的理论,是企图保存封建旧秩序,阻碍民主新秩序发展的理论, ...