每日三思(4月27日)
今天将算法的第二章以及数理统计课程完成了,数理统计总结以及线性代数的重新归纳计划在劳动节期间写好。
问题一:map是什么?基础操作是什么样的?
map
是一个标准库容器,它包含一组键值对,其中每个键都是唯一的,并且通过键可以快速访问对应的值。map
相当于映射,可以将任何基本类型(包括STL容器)映射到任何基本类型(包括STL容器)。以下是基础操作:
1 2 3 4 5
| map<char, int> map1; multimap<char, int> map2; unordered_map<char, int> map3; unordered_multimap<char, int> map4;
|
- 增
1 2 3 4 5 6
| m.insert({1, "Apple"}); m.insert(std::make_pair(2, "Banana"));
m[3] = "Cherry";
|
- 删
1 2 3 4 5 6 7 8
| m.erase(2);
auto it = m.find(3); if (it != m.end()) { m.erase(it); }
|
- 查
1 2 3 4 5 6
| auto it = m.find(2); if (it != m.end()) { std::cout << "Found: " << it->second << std::endl; } else { std::cout << "Not found" << std::endl; }
|
- 改
问题二:普通最小二乘法(OLS)是什么?在Python中的实现
普通最小二乘法(OLS,Ordinary Least Squares) 是一种用于线性回归分析的统计方法,它通过最小化实际观测值与回归模型预测值之间的差异的平方和来估计回归系数,从而找到最优的回归模型。
1. OLS 目标:最小化平方误差和(SSE)
平方误差和(SSE) 是 OLS 方法的目标函数,代表了模型预测值与真实观测值之间差异的平方和。具体公式如下:
SSE=i=1∑n(yi−yi^)2
其中:yi 是观测值(真实值);yi^ 是模型的预测值(通过回归方程计算出来的值)。
我们的目标是找到回归系数,使得 SSE 最小化,从而使得预测值与实际观测值之间的误差尽可能小。
2. OLS 解决方案的推导:
对于多元线性回归问题,假设我们有 n 个观测点和 p 个特征(自变量)。模型可以表示为:
y=Xβ+ϵ
其中:y 是 n×1 的因变量向量;X 是 n×p 的设计矩阵(包含所有自变量的观测值);β 是 p×1 的回归系数向量,我们要估计的未知数;ϵ 是误差项。
我们希望最小化 SSE,公式如下:
SSE=(y−Xβ)T(y−Xβ)
为了求解 β,我们对 SSE 进行最小化(即对 β 求导并令其为零):
∂β∂SSE=−2XT(y−Xβ)
将其设为零,得到:
XTy=XTXβ
解这个方程,我们得到回归系数的最优估计:
β^=(XTX)−1XTy
3. 摩尔-彭若斯伪逆
在实际应用中,如果设计矩阵 XTX 不可逆,或者方程的数量多于未知数(即矩阵 X 的列数多于行数),即:奇异矩阵 和 非方阵, 我们通常使用 摩尔-彭若斯伪逆 来进行估计。
摩尔-彭若斯伪逆(X+)的计算公式为:
β^=X+y
其中 X+ 是矩阵 X 的伪逆。
4. 偏导数微积分
在 OLS 的推导过程中,使用偏导数微积分对误差平方和(SSE)进行最小化是标准做法。这是因为我们通过对 SSE 进行求导,找到使其最小化的回归系数,从而得到最优解。
Python实现举例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| import numpy as np import statsmodels.api as sm
X = np.array([1, 2, 3, 4, 5]) y = np.array([1, 2, 1.3, 3.75, 2.25])
X = sm.add_constant(X)
model = sm.OLS(y, X)
results = model.fit()
print(results.summary())
|