Insertion sort
Example
1234567891011121314151617181920def insertion_sort (arr): n=len(arr) for i in range(1,n): key=arr[i] j=i-1 while j>=0 and key < arr[j]: arr[j+1]=arr[j] j-=1 arr[j+1]=key #这里要j+1的原因是,以第一个位置为例:j=0的时候挪到了j=1位置,j就变成-1了 return arr
arr[j+1]=key:这里要的原因是,以第一个位置为例:的时候挪到了位置,就变成了
时间复杂度插入排序在最坏情况下(完全逆序输入)时间复杂度
最坏情况:完全逆序假设数组是 [n, n-1, ..., 2, 1],那么:
当 i = 1(第 2 个元素),它要和前面 1 个比较、挪动。
当 i = 2(第 3 个元素),要和前面 2 个...
OLS 三个式子真实值与残差 (residual)
定义:
:第 i 个样本的真实观测值;
:回归模型给出的预测值;
:残差(residual),是“真实值 - 预测值”。
总体模型(理论模型)
形式:
:总体的真实参数(未知);
:随机误差项,捕捉未观测因素和随机性。
这是 理想中的经济学/统计学关系,但参数和误差分布我们不知道。
样本估计模型(回归方程)
形式:
:由样本数据计算出来的 OLS 估计量(估计);
:预测值(fitted value)。
在样本数据上估计出来的拟合直线。
三者关系梳理
总体模型(理论层面)
——描述数据的真实生成机制。
样本模型(估计层面)
——用 OLS 得到的估计直线,代替未知的真实直线。
残差(误差的样本体现)
——衡量预测值与观测值的差距。
b和之间的联系二者的关系
在统计学上, 和 是 的 无偏估计量:
这意味着:如果我们无限次重复抽样并每次计算,它们的平均值会等于真实参数 。
直观理解
β:真理(总体直线),但我们看不见;
b:猜测(样本直...
Panel datapandas = “Panel data” (面板数据)。
它指的是:对多个研究对象(如个人、公司、国家等)在多个时间点上进行观测的数据集合。换句话说,面板数据同时具有 横截面维度(不同个体)和 时间序列维度(不同时间),因此也称 纵向数据(longitudinal data)。
Series在 pandas 里,Series 对象确实支持 布尔索引(boolean indexing)。原理是:当你对 Series 执行一个逻辑判断(例如 < 2000),它会返回一个与该 Series 等长的布尔序列(True/False),然后你可以用这个布尔序列去筛选数据。
例子12345678import pandas as pd# 构造一个 Seriess = pd.Series([1500, 1800, 2100, 2500, 3000])# 比较操作:小于2000mask = s < 2000print(mask)
输出:
1234560 True1 True2 False3 False4 Falsedtype: ...
数据的来源
Experimental data and non-experimental data实验数据(experimental data)
非实验数据(non-experimental / observational data)
1. 数据获取方式
实验数据:研究者可以主动操控自变量(比如设置不同的处理组/对照组),然后观察因变量的反应。
例子:在实验室里控制肥料用量,比较作物产量差异。
非实验数据:研究者不能操控自变量,只能记录现实中自然发生的数据。
例子:统计不同收入家庭的消费水平,但无法人为随机分配“收入高低”。
2. 可重复性
实验数据:可以在相同条件下反复试验,保证结果的可验证性。
非实验数据:条件不可控,通常不可重复,只能依赖统计方法去控制偏差。
Regression 来源(种子)
the offspring of larger than average size parents tended to be smaller than their parents
翻译:比平均值更大的父母的后代,往往比父母小一些。
the offspring...
进程和线程的区别是什么(面试题)?
本质区别:进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位(CPU调度的最小单位)
在开销方面:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小
稳定性方面:进程中某个线程如果崩溃了,可能会导致整个进程都崩溃。而进程中的子进程崩溃,并不会影响其他进程。
内存分配方面:系统在运行的时候会为每个进程分配不同的内存空间;而对线程而言,除了CPU外,系统不会为线程分配内存(线程所使用的资源来自其所属进程的资源),线程组之间只能共享资源
包含关系:没有线程的进程可以看做是单线程的,如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线
程序的执行过程与进程的诞生
我们用高级语言(如 C++ 或 Java)编写的程序,在编译后会成为机器可以理解的二进制代码,但此时它仍是一个被动的文件。只有当它被加载到内存并开始执行时,才成为一个“进程”。
核心观点: 程序在被执行...
AI模型画图体验:速度、细节与画质的权衡使用gemini 2.5 flash Image -preview生成模型,整体体验让人印象深刻,尤其是在速度和细节处理方面。
首先,最直观的感受是生成速度非常快,比之前用过的GPT-5感觉要迅捷不少,几乎是瞬间出图,大大提升了创作效率。
其次,在图像质量上,这款模型对脸部和阴影等细节的处理尤为出色。它能精准捕捉复杂的光影变化,让人物面部和环境阴影看起来非常自然且富有层次感,大大增强了图像的真实感和艺术性。
在不同平台的使用体验上,无论是AI Studio还是Web端,我感觉两者之间并没有明显的区别。这说明模型的核心算法和性能在不同端口都保持了高度的一致性,确保了用户无论在哪里创作,都能得到稳定的高质量输出。
不过,也有一些可以改进的地方。首先是画质,感觉图像整体的清晰度还有提升空间,有时候会显得不够锐利。其次,目前模型缺少微调工具。如果能提供类似“局部修补”或“定向调整”的功能,允许用户对不满意的地方(比如某个眼神、某个手势)进行精确修改,那将是极大的进步。
总的来说,这款模型在速度和细节表现上非常突出,但在画质和后期微调的灵活性上还有待...
Homework-baseline Q&A
作业的 baseline 中看到 loss 在训练过程中不收敛,甚至来回震荡,通常是由以下几个核心原因造成的,其中学习率(Learning Rate)过高是最常见的主谋。
1. 学习率 (Learning Rate) 过高
现象:Loss 在训练初期迅速下降,但很快就开始在一个较高的值附近剧烈震荡,甚至可能突然增大(发散)。
原理:想象一下你正在下山(寻找 loss 的最低点)。学习率决定了你每一步迈出去的“步子”有多大。
如果步子太大(学习率过高),你可能一步就迈过了山谷的最低点,跑到了对面更高的山坡上。下一步你再往回迈,又可能再次越过最低点。如此反复,你就在谷底来回“横跳”,永远无法稳定在最低点。
解决方案:
调低学习率:这是最直接的方法。尝试将当前的学习率降低一个数量级,例如从 0.01 降到 0.001,或者从 1e-4 降到 1e-5,看看 loss 曲线是否变得平滑并持续下降。
使用学习率衰减 (Learning Rate Decay):在训练初期使用较大的学习率让模型快速收敛,随着训练的进行,逐渐减小...
在 Embedding 里 dim 的意思dim 表示你操作的 维度索引。张量有很多维度(axis),dim 决定了你在哪个维度上做操作。
举例:
1emb.shape = (32, 3, 2)
这里 3 个维度的含义分别是:
dim=0 → batch 维度(32 个样本)
dim=1 → 序列长度(每个样本 3 个索引)
dim=2 → embedding 向量维度(每个索引是 2 维)
Embedding 查表 (Embedding Lookup)思路拆解
X 的形状
X.shape = (32, 3)
含义:一共有 32 个样本(batch),每个样本里面有 3 个索引。
C 的形状
C.shape = (27, 2)
含义:这是一个查找表(embedding table),一共有 27 行,每行是 2 维向量。
C[X] 的运算
对每个 X[i, j],用它作为索引,去 C 里取对应的那一行(形状 (2,))。
所以一行 X [a, b, c] 会变成 C[[a, b, c]],形状 (3, 2)。
整个 32 个样本就堆叠起...
微调(Finetuning) vs. 提示(Prompting):大型语言模型的两种方法探讨了使用大型语言模型(LLM)的两种主要历史期望和由此产生的技术方法:微调(Finetuning) 和 提示(Prompting)。这两种方法会导致大型语言模型的结果和应用截然不同。
对大型语言模型的两种期望人类历史上对大型语言模型有两种不同的期望:
成为专家(微调):第一个期望是让大型语言模型成为解决特定类型问题的专家,尤其是在自然语言处理(NLP)任务中。
范例:调整大型语言模型以专门从事翻译(例如,中文到英文)或摘要(缩短文章)。
比喻:这就像训练一头大象(大型语言模型)以高精度执行单一、特定的任务。
成为通才(提示):第二个期望是让大型语言模型成为一个多才多艺的“万事通”,能够做任何事情。
范例:给大型语言模型一个句子,然后提供一个人类可读的指令(“提示”),告诉它要翻译还是摘要该句子。
比喻:这就像一头知道很多事情的大象(大型语言模型),但需要一只小老鼠(人类用户)用简单的指令来指导它该做什么。ChatGPT就是这种方法的典型例子。
通才思想的历史背景将大型...
为什么有些软件会用多种编程语言开发?你是否曾好奇,为什么一个软件项目有时会“混搭”使用多种编程语言?这背后其实蕴含着现代软件工程中关于性能、协作与代码复用的深刻智慧。本文将带你深入了解这背后的技术原理。
前端与后端:天然的“多语言”环境对于我们熟悉的网站和应用,例如使用Django这类全栈框架构建的项目,其本身就是多语言协作的典型。后端逻辑可能由Python处理,而用户直接交互的前端界面则由HTML、CSS和JavaScript构建。这两部分作为独立的进程,通过网络请求等方式进行通信,各自安好。
然而,当我们需要将不同语言编写的代码编译成一个单一、高效的可执行文件时,事情就变得复杂起来。这正是本次探讨的核心。
从源代码到可执行文件:编译的艺术要理解多语言如何“融合”,我们首先需要了解代码是如何从人类可读的文本,转变为机器可以执行的指令的。以经典的C语言为例,我们熟知的GCC编译器实际上经历了一个四步流程:
预处理 (Preprocessing): 处理宏定义、头文件等。
编译 (Compilation): 将预处理后的代码转换成汇编语言。这是一个关键的中间步骤,并非直接生成机...