task2打卡
最小二乘法
我的理解就是最小二乘法(最小化平方和)的思想是预测值与实际值之间的距离最小,通过平方损失函数建立模型优化目标函数的一种思路,计算偏导,让偏导等于0
- 几何意义就是高维空间中的一个向量在低维子空间的投影
- 与梯度下降的区别:都输求函数的最小值,但是并不是所有拟合函数都能通过最小二乘求解,这是可以用梯度下降,拟合函数,损失函数模型以及求偏导与最小二乘法都一样,唯一区别在于如何获得最优解,最小二乘法是直接令导数等于0求解,而梯度下降法是沿着梯度下降的方向逐步迭代,不断逼近最小值来求解
梯度下降法求解过程:
①随机给定一组初始参数值和学习率(学习率是控制每一次迭代的步长,太小了需要很长的时间才能收敛,太大了容易震荡,可以无法获得最优解)
②对损失函数各参数求偏导,得到梯度
③更新参数:参数 = 初始参数-学习率 梯度
④不断迭代,直接误差达到所要求的范围停止*
极大似然估计与最小二乘的联系与区别
- 最大似然估计:利用已知的样本结果,反推最有可能导致这个歌结果的参数值
- 在线性回归中,如果误差服从正态分布,则最小二乘法就是极大似然估计
为什么多项式回归在实际中表现不好
因为在现实中,我们拿到的点都是有噪声的样本点,不一定完全符合某个函数的关系,如果无限制的增加多项式的次数去拟合样本,函数会变得很复杂,一旦来了一个新的样本点,偏差会很大,出现过拟合
决策树模型与线性模型的区别与联系
- 决策树
- 接近人的思想,解释性比线性强
- 拟合出来的函数就是分区间的阶梯函数
- 在训练过程中,树模型需要计算特征属性的信息增益或信息增益率等度量,从而确定哪个属性对目标最有益,即有最强区分样本的能力
- 一般特征空间复杂,无法用线性表达时使用树模型来解决问题
- 线性模型
- 通常能够获得更高的预测精度,预测方差比树模型低
- 一般当特征和标签可以通过线性方式得到较好拟合则使用线性模型解决问题
- 对数据敏感,容易受到极值影响
- 更加详细
什么是KKT条件
- 对于具有等式与不等式约束的一般优化问题,KKT条件给出了判断X是否是最优解的必要条件
- 引入松弛变量将不等式约束转化为等式约束
- 再把等式约束转换为无约束优化,引入拉格朗日乘子,将约束条件与目标函数混在一起,使得我们可以同时计算目标函数的梯度与约束条件的梯度,根据相关的性质从而找到我们想找到的局部最优解或者全局最优解
- 如果所讨论的规划是凸规划,那么KKT条件就是充分条件
- KKT条件如图
-对于等式约束的拉格朗日乘子,没有非负的要求,对于不等式,要求其非负
为什么要引入原问题的对偶问题 - 在原始问题下,求解的复杂度与样本的维度有关,即w的维度。在对偶问题下,只与样本数量有关
- 求解更高效,因为只用求解λ,而λ只有在支持向量才为非0,其他全为0
使用线性回归拟合模型
import numpy as np
import matplotlib.pyplot as plt
# y=2 * (x1) + (x2) + 3
x_train = np.array([[1, 2], [2, 1], [2, 3], [3, 5], [1, 3], [4, 2], [7, 3], [4, 5], [11, 3], [8, 7]])
y_train = np.array([7, 8, 10, 14, 8, 13, 20, 16, 28, 26])
x_test = np.array([[1, 4], [2, 2], [2, 5], [5, 3], [1, 5], [4, 1]])
alpha = 0.001
#三个参数
theta0 = np.random.normal()
theta1 = np.random.normal()
theta2 = np.random.normal()
m = len(x_train)
def h_(x):
return theta0 + theta1 * x[0] + theta2 * x[1]
#预测值
def h(i):
return theta0 + theta1 * x_train[i][0] + theta2 * x_train[i][1]
def diff(i):
return h(i) - y_train[i]
for times in range(10000):
sum1 = 0
sum2 = 0
sum3 = 0
for i in range(len(x_train)):
sum1 = sum1 + diff(i)
sum2 = sum2 + diff(i) * x_train[i][0]
sum3 = sum3 + diff(i) * x_train[i][1]
theta0 = theta0 - (alpha / m) * sum1
theta1 = theta1 - (alpha / m) * sum2
theta2 = theta2 - (alpha / m) * sum3
"""
for i in range(len(x_train)):
sum1=sum1+alpha*diff(i)
sum2=sum2+alpha*diff(i)*x_train[i][0]
sum3=sum3+alpha*diff(i)*x_train[i][1]
theta0=theta0-sum1
theta1=theta1-sum2
theta2=theta2-sum3
"""
# plt.plot([x_train],[h_(xi) for xi in x_train ])
plt.plot([h_(xi) for xi in x_train])
# plt.plot([h_(xi) for xi in x_train ])
print("theta0 : ", theta0)
print("theta1 : ", theta1)
print("theta2 : ", theta2)
plt.show()