机器学习(一):混淆矩阵与最优化方法习题(二元函数最小值 梯度下降法 手推+代码实现)

机器学习第一次作业

  1. 若样本的预测标签和真实标签如下:请给出Acc,Precision 和Recall
    [预测标签,真实标签]
    [ 1, 1],
    [ 1, 0],
    [ 1, 1],
    [ 0, 1],
    [ 1, 0],
    [ 1, 1],
    [ 0, 0],
    [ 1, 1],
    [ 1, 0],
    [ 0, 0]

解:

[1,1]为TP、[1,0]为FP、[0,1]为FN、[0,0]为TN

统计得到

混淆矩阵 真实值
1 0
预测值 1 TP=4 FP=3
0 FN=1 TN=2

准确率 \(\mathrm{A}CC=\frac{TP+TN}{TP+FN+FP+TN}=\frac{4+2}{10}=60\%\)

查准率(精确率)\(\mathrm{Precision} =\frac{TP}{TP+FP}=\frac{4}{7}=57.14\%\)

召回率 \(\mathrm{Recall}=\frac{TP}{TP+FN}=\frac{4}{5}=80\%\)

  1. 梯度下降法求解f(u,v)的最小值

\[\mathrm{f(u},\mathrm{v)}=\left[ \begin{matrix} \mathrm{u}& \mathrm{v}\\ \end{matrix} \right] \left[ \begin{matrix} 2& 2\\ 2& 5\\ \end{matrix} \right] \left[ \begin{array}{l} \mathrm{u}\\ \mathrm{v}\\ \end{array} \right] \]

其中$\left[ \begin{array}{l}
\mathrm{u}_0\
\mathrm{v}_0\
\end{array} \right] =\left[ \begin{array}{l}
1\
1\
\end{array} \right] $出计算过程和迭代次数.

解:

\[\begin{aligned} \mathrm{f(u},\mathrm{v)}&=\left[ \begin{matrix} \mathrm{u}& \mathrm{v}\\ \end{matrix} \right] \left[ \begin{matrix} 2& 2\\ 2& 5\\ \end{matrix} \right] \left[ \begin{array}{l} \mathrm{u}\\ \mathrm{v}\\ \end{array} \right]\\ &=\left[ 2u+2v\quad 2u+5v \right] \left[ \begin{array}{l} \mathrm{u}\\ \mathrm{v}\\ \end{array} \right]\\ &=2u^2+4uv+5v^2\\ \end{aligned} \]

在二元函数梯度下降法中,学习率(learning rate)eta(η)对于u和v通常是一致的,即在每一步迭代中更新u和v的值时使用相同的学习率。这是因为学习率控制了每一步迭代中变量的变化量,如果对于u和v使用不同的学习率,可能会导致算法在收敛过程中产生不稳定或不可预测的行为。因此,通常建议在二元函数梯度下降法中对于u和v使用相同的学习率。

那么我们采用如下表达式移动自变量

\[\left[ \begin{array}{c} u_1\\ v_1\\ \end{array} \right] \longleftarrow \left[ \begin{array}{c} u_0\\ v_0\\ \end{array} \right] -\eta \left[ \begin{array}{c} \frac{\partial f(u,v)}{\partial u}\\ \frac{\partial f(u,v)}{\partial v}\\ \end{array} \right] \]

其中

\[\begin{align} \frac{\partial f(u,v)}{\partial u} & = 4u+4v\\ \frac{\partial f(u,v)}{\partial v} & = 4u+10v \end{align} \]

​ 两次推导计算

①令\(\eta\)于0.05

\[\left[ \begin{array}{c} u_1\\ v_1\\ \end{array} \right] =\left[ \begin{array}{c} 1\\ 1\\ \end{array} \right] -0.05\left[ \begin{array}{c} 8\\ 14\\ \end{array} \right] =\left[ \begin{array}{c} 0.6\\ 0.3\\ \end{array} \right] \]

​ 此时\(f(u,v)=1.63\)

②令\(\eta\)等于0.05

\[\left[ \begin{array}{c} u_2\\ v_2\\ \end{array} \right] =\left[ \begin{array}{c} 0.6\\ 0.3\\ \end{array} \right] -0.05\left[ \begin{array}{c} 3.6\\ 5.4\\ \end{array} \right] =\left[ \begin{array}{c} 0.42\\ -0.03\\ \end{array} \right] \]

​ 此时\(f(u,v)=0.33\)

Python代码实现:

# 使用梯度下降法求二元函数的最小值
# f = 2u^2+4uv+5v^2   初始点为(1,1)

# 设计函数
def function_one(u_input, v_input):  # 函数的输入 u,v
    f = 2*u_input**2+4*u_input*v_input+5*v_input**2 # 算出f 的值
    du = 4*u_input+4*v_input  # 算出 一阶u导数的值
    dv = 4*u_input+10*v_input  # 算出 一阶v导数的值
    return f, du, dv  # 返回三个值

def main():
    u = 1  # 初始点
    v = 1  # 初始点
    eta = 0.05  # 设置步长
    error = 0.000001  # 设置误差函数

    f_old, du, dv = function_one(u, v)  # 算出初始的值

    for i in range(100):  # 开始循环 梯度下降 设置循环的次数
        u -= eta * du
        v -= eta * dv
        f_result, du, dv = function_one(u, v)  # 获得第一次计算的初始值

        if abs(f_result - f_old) < error:  # 下降的结果绝对值与误差进行比较 如果在允许范围内则终止
            f_final = f_result
            print("最小值为: %.5f, 循环次数: %d, 误差:%8f" % (f_final, i, abs(f_result - f_old)))
            break
        print("第 %d 次迭代, 函数值为 %f,u为 %f,v为 %f" % (i, f_result,u,v))
        f_old = f_result

if __name__ == '__main__':
    main()
posted @ 2023-03-01 14:16  孤飞  阅读(336)  评论(0编辑  收藏  举报