算法
文章平均质量分 78
fanged
野生程序员。。。这里主要是一些学习笔记和心得。。。
注:标题带TODO的内容都是未完成,内容有可能不准确。觉得有帮助请:https://ko-fi.com/fanged
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
IT数学基础番外5--拟合函数呈现
本文通过神经网络拟合正弦函数的实验,展示了深度学习的基本原理。实验使用ReLU激活函数,通过调整神经元数量(4、8、16个)观察拟合效果。结果表明,更多神经元能更好地逼近正弦波,但需防止过拟合。文中详细解析了ReLU函数的特性(折点位置由偏置b决定,斜率由权重w控制),并通过可视化展示了各神经元的贡献。实验代码采用PyTorch实现,包含参数初始化技巧和训练过程优化。最后给出了不同任务场景下神经元数量的配置建议:从简单线性任务的4-16个,到复杂认知任务的百万级规模。原创 2026-02-25 10:03:54 · 290 阅读 · 0 评论 -
IT数学基础番外1--手算梯度下降
本文通过一个单神经元模型演示了梯度下降算法的核心原理。以输入x=1、真实值y=2为例,详细展示了前向传播、损失计算(均方误差)、反向传播求导(对w和b的偏导)以及参数更新的完整过程。当学习率设为0.5时,模型仅需一次迭代即可收敛到完美解;而学习率降为0.1时,需要约20次迭代逐步逼近目标值。文章还对比了不同学习率策略的适用场景,并提供了完整的Python实现代码。这个简单示例揭示了深度学习的基础机制:通过梯度下降不断调整参数使损失最小化,尽管实际网络更复杂(多层结构、非线性激活、海量数据),但优化原理与此完原创 2026-02-23 16:08:16 · 872 阅读 · 0 评论 -
IT数学基础2--微积分
本文系统介绍了微积分核心概念及其工程应用。主要内容包括:1. 极限与导数:解析极限定义、求导方法(数值/符号/自动微分),阐述变化率物理意义,比较单变量与多变量微积分差异;2. 泰勒展开:展示多项式逼近原理,对比不同阶数近似效果,分析牛顿法与梯度下降的收敛特性;3. 积分应用:剖析定积分数值计算方法,讨论黎曼和与牛顿-莱布尼茨公式的工程取舍;4. 矩阵工具:解释Jacobian和Hessian矩阵在多变量优化中的作用。全文通过Python代码示例(如SymPy求导、Scipy积分)将理论具象化,并着重对比了原创 2025-06-28 01:48:04 · 345 阅读 · 0 评论 -
IT数学基础1--线性代数(TODO)
摘要:本文系统介绍了线性代数在计算机领域的核心应用,重点讲解了向量、矩阵运算、线性变换等概念及其编程实现。文章首先通过价格与数量的点积案例说明向量运算的实际意义,随后详细解析矩阵作为线性变换工具在图形处理中的作用,包括旋转、缩放等操作。特别强调了numpy库的高效实现,对比了矩阵求解与消元法的计算效率差异。针对AI领域,深入讲解了特征值分解和SVD在数据降维中的应用原理,并提供了完整的Python代码示例。最后从程序员学习角度,给出了结合NumPy实践的线性代数学习路线,涵盖从基础运算到图像压缩等实战应用。原创 2025-06-28 01:47:29 · 332 阅读 · 0 评论 -
信号处理入门1(信号基础)
摘要:本文介绍了信号的基本概念,重点分析了声音信号的物理特性。声音是由物体振动产生的压力波,通过介质传播,其特性包括频率(振动次数)、振幅(音量)、相位(波形位置)和谐波(音色基础)。谐波决定了乐器的独特音色,由基波整数倍频率组成。文章还探讨了声音数字化过程中的采样定理,指出采样率需大于信号频率2倍才能准确还原。最后,通过时域和频域的类比,解释了信号分析的两种视角:时域关注波形随时间变化,频域则揭示信号的频率组成。原创 2026-01-28 15:52:55 · 242 阅读 · 0 评论 -
信号处理入门0(序)
文章摘要:本文通过一个简化的声纳信号处理示例,介绍了基本的信号处理流程:发射脉冲信号、接收衰减回波、阈值检测目标。作者将信号处理知识体系分为5个部分:信号基础、数学工具、频域分析、系统设计和应用进阶,分别讨论了时域/频域特性、傅里叶变换、滤波器设计等核心概念。特别强调了时域卷积与频域乘法的等效性,以及FIR/IIR滤波器的特性差异,为通信系统设计提供了理论基础。文章采用分篇讲解的方式,旨在系统性地梳理信号处理的关键技术。原创 2025-12-30 16:07:29 · 466 阅读 · 0 评论 -
信号处理入门5(应用)
本文通过实验演示了IQ调制原理及其在QAM调制中的应用。首先解释了IQ调制的核心思想:利用正弦和余弦的正交性,通过I(同相)和Q(正交)两路传输不同数据。随后用Python代码实现了4QAM和16QAM调制,直观展示了相位和振幅变化对数据传输的影响。文章还介绍了多速率信号处理中的抽取和内插技术,强调了滤波器在防止信号失真中的关键作用。最后讨论了噪声分析和实时缓存技术在实际系统中的应用。整个内容以蓝牙耳机工作流程为例,将各个技术环节串联起来,展现了数字信号处理的完整应用场景。原创 2026-02-05 01:35:23 · 423 阅读 · 0 评论 -
信号处理入门4(系统设计)
本文介绍了数字信号处理中的两种主要滤波器:FIR(有限冲激响应)和IIR(无限冲激响应)滤波器。FIR滤波器通过加权平均实现信号处理,适用于信号重塑、分频和监测,但计算量较大。IIR滤波器利用反馈机制,计算效率高但存在稳定性风险。文章通过Python代码演示了两种滤波器在信号处理中的应用,并讨论了IIR滤波器的稳定性监测方法,包括极点检查和运行时的溢出处理。实际应用中常将高阶IIR分解为多个二阶滤波器串联以提高稳定性。原创 2026-02-01 00:58:16 · 427 阅读 · 0 评论 -
信号处理入门3(频域分析)
本文介绍了数字信号处理中的几种核心变换算法。首先对比了DFT(离散傅里叶变换)和FFT(快速傅里叶变换),指出FFT通过递归算法将计算复杂度从O(N²)降至O(NlogN)。其次讨论了频谱泄露现象及其解决方法——窗函数技术,包括汉明窗、汉宁窗等不同类型窗函数的特点和应用场景。最后简要介绍了DCT(离散余弦变换)在图像和音频压缩中的优势,它能将信号能量集中在少数低频系数上。文章通过Python代码示例展示了FFT实际应用效果,并对比了加窗处理前后的频谱差异。原创 2026-01-30 13:41:58 · 95 阅读 · 0 评论 -
信号处理入门2(数学工具)
本文简要介绍了信号处理中的几个核心概念及其应用:差分方程用于滤波和系统建模,通过权重系数实现平滑或共振效果;微积分模型需转换为离散差分才能在计算机中实现;Z变换用于求解差分方程的优化系数,现已有工具自动完成;自相关和互相关通过乘积和算法分别检测信号周期性和时延,广泛应用于回声检测等领域。这些工具共同构成了从理论建模到工程实现的技术链条,在滤波、频谱分析和信号检测中发挥关键作用。原创 2026-01-30 01:40:43 · 882 阅读 · 0 评论 -
时间轮算法
本文介绍了一种高效的时间轮算法(Timing Wheel)实现定时器管理。传统队列方式遍历所有任务效率低(O(N)),时间轮通过哈希表思想将任务分配到时间槽中(时间复杂度O(1))。核心实现包括:1)循环队列处理长时间任务;2)槽位计算和圈数管理;3)多线程安全操作。文中提供了Python实现代码,并给出槽数计算公式(槽数=最大延迟/时间粒度)和典型场景配置建议。该算法适用于网络心跳、游戏逻辑等需要高效定时任务的场景,通过合理设置时间粒度和槽数可显著提升性能。原创 2025-07-19 00:06:21 · 265 阅读 · 0 评论 -
KMP算法
很久之前,大概毕业一两年的时候,当时对写算法有点兴趣,于是自己写了一个strstr,用C写的,想破头也没什么特别的算法,最后也差不多是遍历,找到第一个字符后依次匹配。写了两天差不多完工,但是效率比当时MFC自带的函数查了非常远,大概好几倍吧。所以后面也放弃了这种自己写库函数的想法了。最近看leetcode,看到KMP算法,所以也想学一下。找了一个普通的txt文件,大概是2M多。找寻里面的NFC关键字。运行设备是树莓派5(4GB版本)。原创 2025-03-16 00:11:10 · 167 阅读 · 0 评论 -
Brian Kernighan算法
最近看到一个题,就是算一个int里面有多少个1。这个还是挺常用的,也不难,就是判断最后一位是不是1,然后移位,很快就能给答案。二进制是110,那么-1就是101,再&之后就是100(4)。仔细看看这个什么意思呢,关于位操作,之前其实写过一篇。之后-1就是011,再&之后就是000。其中关键的就是这句n &= (n - 1);相比以前要硬循环31次,确实巧妙了一些。主要是内存用的不是很好。也就是n = n & (n - 1);只有两个位都是1时,结果位才是1。本质就是跳过了0,每次只处理1。原创 2025-03-15 18:27:33 · 257 阅读 · 0 评论 -
关于浮点数的小结
这里只写32位单精度浮点数。。。原创 2025-01-27 03:24:32 · 528 阅读 · 0 评论 -
车牌识别1
本来是可以用esp32 cam来做,后面想了想还是在linux上弄吧。终于,最近几天把树莓派的摄像头打通了。看了下这篇的TODO是二月就做了,但是一直拖到现在10月。也就是一个关键的前置摄像头那块没打通,所以这边也block了。里面还用了个pytesseract的库,看介绍说这个是用来做OCR的,好吧,我也是第一次用这个。我想原因是第一这个代码不支持汉字,第二还是要用深度学习来做这题才行。最好的时候88888能认出来,但是其它的就惨不忍睹了。网上找了一个炫酷车牌。原创 2024-02-07 02:31:21 · 312 阅读 · 1 评论 -
JPG压缩
以下是一个简单的JPEG压缩算法的示例代码,展示了压缩图像的基本过程。该代码基于Python和Pillow库,并利用了基本的DCT和量化。Pillow是Python中较为基础的图像处理库,主要用于图像的基本处理。下面是一个python版本的例子,该例子只能处理灰度图哈,量化矩阵的选择会影响压缩质量和压缩比。逆DCT变换:对反量化后的系数应用逆DCT变换。量化:使用量化矩阵对DCT系数进行量化。反量化:对量化后的DCT系数进行反量化。组合图像:将处理后的块组合回原图像。先发一个python版本。原创 2024-03-31 11:33:38 · 240 阅读 · 0 评论 -
线性回归求解
最小二乘法和梯度下降算法在目标和应用上有所区别,理解它们的关系和差异,有助于选择合适的方法解决具体问题。1是平方计算可导,更加方便。代入总成绩 X=450X = 450X=450,Y = 14.49+0.1325×450=14.49+59.625=74.115。这个基本上算是目前机器学习的基石了,说起来也算是高中的知识范围,我不知道是不是人人都懂了,我觉得我不是很懂,所以专门写一篇来总结总结。上面的过程基本不算难,就是回归系数的推算,看了下是最小二乘法。其中,XXX 是自变量矩阵,YYY 是因变量向量。原创 2024-07-14 16:20:36 · 713 阅读 · 0 评论 -
e的意义。
这里再说说对数,如果a的x次方等于N,那么数x叫做以a为底N的对数(logarithm),记作x=logaN。ln是e为底,那么就是loge,也就是e的多少次方等于多少。不过这里不是这个,是说的数学上那个e,写这个也挺尴尬的。在计算机发明以前,在欧美使用非常多,据说在曼哈顿计划中的工程师,人人都要带一个对数尺用来方便计算。然后绕不开的就是一个ln,这个是一个以e为底的对数,也就是自然对数。logn 表示对数函数,即如果一个算法的时间复杂度为 O(logn),意味着算法的运行时间与输入规模的对数成正比。原创 2024-07-09 23:27:35 · 539 阅读 · 0 评论 -
音视频的Buffer处理
最近在做安卓下UVC的一个案子。正好之前搞过ST方案的开机广告,这个也是我少数最后没搞成功的项目。当时也有点客观原因,当时ST要退出机顶盒市场,所以一切的支持都停了,当时啃他家播放器几十万行的代码,而且几乎没有文档,真的是非常痛苦。后面虽然功能是搞出来了,但是不稳定,持续几次后就会crash。还记得当时最后到底层ST是用的滑动窗口缓存,双指针,一个写指针和一个读指针,当时我做了一个管道往缓存中注数据。主要就是共享内存,滑动窗口,双缓冲,环形缓冲这些内容。就是两个buffer,一个读一个写,写完之后交换。原创 2024-06-20 14:20:23 · 842 阅读 · 0 评论 -
线程池的思考
但是这样做有一个问题就是占用CPU资源,sleep的时候占用了CPU资源,而用pthread_cond_wait可以不占用CPU。2 任务怎么来管理,是不是一定要做任务队列。我自己做的第一版没这个,就会出现如果线程全忙,那么多的任务只有丢弃。所以任务队列是需要的。很多网上的代码,都是互斥体和条件变量一起用。为什么要用条件变量,我开始是真的没想明白。有一说一,线程池其实在国内用的不多。就算是C底层的程序员,用线程池也很少。查了一下GPT,说是防止虚假唤醒,多处理器场景。回来想想,这个还是单个任务的思路。原创 2024-02-15 22:50:41 · 163 阅读 · 1 评论 -
卡尔曼滤波小结
最近再接触卡尔曼滤波是因为一个声源定位库,Open embeddeD Audition System,它里面有两个部分,一个是定位,一个是跟踪。第二次更新:计算权重 :22.5/(22.5+25) = 0.47,预计状态:50.13+0.47(48.44−50.13)=49.33米,更新估计方差:(1−0.47)*22.5=11.84。第一次更新:计算权重 :225/(225+25) = 0.9,预计状态:60+0.9(49.03−60)=50.13米,更新估计方差:(1−0.9)*225=22.5。原创 2024-03-31 11:34:11 · 272 阅读 · 0 评论 -
动态规划的实践(1)
F(10) = F(9) + F(8),想一想也很好理解。F(9)到F(10)只有1步的走法,没有其它的选择。F(8)到F(10)也只有2步的走法,没有其它的选择。我也是刚学动态规划,感觉动态规划能干的事情,其实很多其它算法也能写出来,那么DP的优点在哪呢?我第一步想到的解法是递归,按照这个思路,其实很快就有答案。第二就是动态规划和树的感觉比较接近,我接触的几个都可以用递归来处理,都存在可以剪枝的优化。一个是从头开始,一个是倒着开始。但是毕竟这个题是有关动态规划的,详细看了下动态规划的思路。原创 2023-12-27 01:16:49 · 415 阅读 · 1 评论 -
递归用法总结(二叉树深度为例)
但是面临一个问题,就是当前层数和最大层数,必须要使用全局变量来记录,而在leetcode中,全局变量没法再初始化,所以就不可用。想破脑袋也没想出来怎么解决,后面求助了chatgpt,给的代码也是有这两个全局变量。从最底层开始计数,想来也是非常合理的,其实递归的本质或者从动态规划来说,也是应该自底而上,这样才能拆成更小的独立问题。如上面的二叉树,在3的时候是层1,9的时候就是层2,如果返回了层数就-1,然后使用一个变量记录最大值。提交上去看了下,可以通过但是成绩也不是很理想,应该可以加个字典什么的缓存一下。原创 2023-12-30 03:57:12 · 748 阅读 · 0 评论 -
查找循环链表(leetcode 141)
malloc的内存是在堆上分配,而且是从下往上,如果新的malloc内容,一般来说地址都在更高位。个人觉得这种方法还是太投机了,leetcode这边是按照顺序分配,但是谁能保证其它情况后面的节点就一定是后分配内存呢?一开始我的想法很简单,做一个循环,然后把之前遇到过的地址放在一个数组中,遇到新的地址就和之前的数组比对,看是否存在,如果存在,则返回true。就是判断新的节点地址是否小于之前节点,如果是,则存在闭环。一开始不好理解,但是如果循环是一个圈,那么快指针没多久就会回来,和慢指针重合,检测到闭环。原创 2024-01-02 04:19:03 · 488 阅读 · 0 评论 -
算法矩阵提速原理
其实就我来看,计算机懂个P的高等数学,什么线性代数,概率,微积分,对于计算机来说都没有意义,没有意义,没有意义。但是在实践中,很多算法一旦上了矩阵,就跟开了外挂一样,速度飞快,这个又是什么原因呢?这里又要说说图形,音视频的数据的一些特点了,这些数据就是矩阵运算的最好示范,现在的CPU架构中,为了加速这些运算,所以进行了很多特别的优化,比如超线程,SIMD等等。简而言之,在现在的CPU体系中,使用矩阵运算,可以更贴近现在的架构,比如Cache的结构,SIMD的指令集以及一些其它指令集。所以会觉得速度很快。原创 2024-04-22 14:52:00 · 945 阅读 · 0 评论 -
线性代数的一些理解(更新中)
设 𝑥(𝑡) 表示车辆在时间 𝑡t 时的位置。其中,第一个矩阵是转移矩阵 𝐴,它将 𝑥(𝑡𝑖)映射到 𝑥(𝑡𝑖+1);其中,𝑥(𝑡) 表示车辆在时间 𝑡t 时的位置(单位:米),𝑡 表示时间(单位:秒),2𝑡 表示车辆在时间 𝑡t 时已经行驶的距离。其中 𝑥(𝑡𝑖)表示车辆在时间 𝑡𝑖ti 的位置,𝑥(𝑡𝑖+1) 表示车辆在时间 𝑡𝑖+1 的位置,𝑣 表示车辆的速度。每个时间步长的长度为 Δ𝑡=𝑡𝑓−𝑡0𝑁。我们可以将位置 𝑥(𝑡)视为一个列向量,时间 𝑡 视为一个标量,速度 𝑣 视为一个常数。原创 2024-05-11 03:14:21 · 533 阅读 · 0 评论
分享