• 【ML02】Cost Function 损失函数


    (一)概述

    损失函数,损失在预测和实际的不同。比如在【ML01】线性回归 中的回归函数,我们根据训练集训练出回归函数模型后,我们把测试集带入其中进行测试。只要测试,就分结果,或好或差。而好或者差的标准,就需要通过 损失函数cost function 进行判断。

    根据你的直观感觉,损失函数,损失的值是大好还是小好?
    我觉得不必多说,小好。0最好。


    (二)notation

    @@@----------------@@@
    其一,回忆线性回归函数
    @@@----------------@@@

    拿线性回归函数举例,首先回忆一下线性回归函数:
    f w , b ( x ) = w x + b f_{\mathbf{w,b}}(\mathbf{x}) = wx + b fw,b(x)=wx+b
    其中:

    符号意义
    x自变量
    f(x)因变量/预测值
    m训练集中训练数据的数量
    (x, y)(自变量,Label)
    (x(i), y(i))训练集中第i个训练数据

    现在再多加两个概念:w(coefficients) 以及 b(weights)

    符号意义
    wcoefficients / parameters
    bweights / parameters

    @@@------------@@@
    其二,见一下损失函数
    @@@------------@@@
    J ( w , b ) = 1 2 m ∑ i = 0 m − 1 ( f w , b ( x ( i ) ) − y ( i ) ) 2 J(w,b) = \frac{1}{2m} \sum\limits_{i = 0}^{m-1} (f_{w,b}(x^{(i)}) - y^{(i)})^2 J(w,b)=2m1i=0m1(fw,b(x(i))y(i))2

    • f w , b ( x ( i ) ) f_{w,b}(x^{(i)}) fw,b(x(i)) 是我们第 i i i 个训练集的预测值。
    • ( f w , b ( x ( i ) ) − y ( i ) ) 2 (f_{w,b}(x^{(i)}) -y^{(i)})^2 (fw,b(x(i))y(i))2 是实际值与预测值的平方差。
    • 1 2 m \frac{1}{2m} 2m1 系数,理解起来应该是 1 m \frac{1}{m} m1,但是其实对于判断损失本质没有区别。

    (三)python搭建损失函数计算

    @@------------@@
    损失函数部分代码
    @@------------@@

    # 损失函数部分代码
    def compute_cost(x, y, w, b):
    
        m = x.shape[0]
    
        cost_sum = 0
        for i in range(m):
            f_wb = w * x[i] + b
            cost = (f_wb - y[i]) ** 2
            cost_sum = cost_sum + cost
        total_cost = (1 / (2 * m)) * cost_sum
    
        return total_cost
    '
    运行

    @@–@@
    完整代码
    @@–@@

    import numpy as np
    import matplotlib.pyplot as plt
    
    # 数据集
    x_train = np.array([1.0, 1.7, 2.0, 2.5, 3.0, 3.2])
    y_train = np.array([250, 300, 480, 430, 630, 730,])
    m = x_train.shape[0]
    
    # 计算cost
    y_predict = []
    w = []
    b = 100
    for j in range(80,270,1):
        w.append(j)
        cost_sum = 0
        f_wb = np.zeros(m)  # 创建全为0的零向量m
        for i in range(m):
            f_wb[i] = j * x_train[i] + b
            cost = (f_wb[i] - y_train[i]) ** 2
            cost_sum = cost_sum + cost
        res = (1 / (2 * m)) * cost_sum
        y_predict.append(res)
    
    # 绘图
    plt.plot(w, y_predict, c='r', label='cost function')
    plt.title("Cost Function")
    plt.ylabel('Cost Value c')
    plt.xlabel('Coeifficient w')
    plt.legend()
    plt.show()
    '
    运行

    @@—@@
    损失函数图
    @@—@@
    在这里插入图片描述
    @@-------@@
    损失函数小结
    @@------@@

    在上述代码中,只对w值改变而没有改变b的值,因为没有进行后续实验所以不确定更改b的值是否真的可以再继续降低损失。但是通过上述代码,希望能对损失函数表达式以及损失函数的意义有大概的理解和了解。


    (四)损失函数的意义所在

    what is the cost function doing?

    本文开张时说过希望损失函数越小越好,事实上也是如此。拿上述示例来说,损失函数越大意味着预测的房价越不准确,所以我们要通过损失函数曲线找到其中损失最小的时候w的值,从而使得预测尽最大可能的准确。

    要知道,在越复杂的现实环境中,就越小可能拿到损失为0的情况。综合考虑多方面因素,即不仅仅为一个自变量,而是采取多个自变量的方式,可以有效的增大预测的准确率。

    过少的自变量,会导致欠拟合,其意思就是很多应该考虑的但是没有考虑到;
    过多的自变量,会导致过拟合,其意思就是有些不应该考虑的却考虑其中了。
    举个例子,判断是否为树叶,如果只考虑颜色,而不考虑其他,会把同样颜色的物体也当成叶子,则是过拟合;而如果考虑颜色,形状,…叶子上的毛,把这种其实是个例的情况却算成了所有树叶的属性,则属于过拟合。

    过犹不及,竟然在机器学习中也有的体现,真的是大智慧。

    2022.9.23于 香港海韵轩

  • 相关阅读:
    iPhone15就要到来,iPhone14可能会铺天盖地地降价
    测试系列:输入一个正整数n,然后输出n对应的二进制数-------要求采用递归算法实现
    驱动开发:摘除InlineHook内核钩子
    标准C++day1——名字空间和堆内存管理
    技术分享 | app自动化测试(Android)--元素定位方式与隐式等待
    大二第二周总结
    (自我剖析一下我博客“问答”中的第三个问题)准确率一直居低不上是什么原因引起的?
    JDK1.7下测试ConnectorJ连接MySQL8.0
    验证计划的内容
    300分钟吃透分布式缓存-16讲:常用的缓存组件Redis是如何运行的?
  • 原文地址:https://blog.csdn.net/weixin_43098506/article/details/127125098