预测数值型数据:回归

2023-10-27

本文传送机

用线性回归找到最佳拟合直线

局部加权线性回归

通过缩减系数来“理解”数据

岭回归

lasso

前向逐步回归


用线性回归找到最佳拟合直线

线性回归

优点:结果易于理解,计算上不复杂

缺点:对非线性的数据拟合不好

适用数据类型:数值型和标称型数据

 回归方程为:\hat{Y}=Xw,其中w为回归系数

 回归的一般方法

  1. 收集数据:采用任意方法收集数据
  2. 准备数据:回归需要数值型数据,标称型数据将被转换为二值型数据
  3. 分析数据:绘制出数据的可视化二维图将有助于对数据做出理解和分析,在采用压缩减法求得新回归系数之后,可以将新拟合线在图上作为对比
  4. 训练算法:找到回归系数
  5. 测试算法:使用R^2或者预测值和数据的拟合度来分析模型的效果
  6. 使用算法:使用回归,可以在给定输入的时候预测出一个数值,这是对分类方法的提升,因为这样可以预测连续型数值而不仅仅是离散的类别标签。

现在的问题是,给定\bold{X}和对应的y,怎样才能找到w呢?一个常用的方法就是找出使误差最小的 w。这里的误差是指预测值\hat{y}和真实值之间的差值,使用丐武训哈的简单累加将使得正差值和负差值相互抵消,所以我们采用平方误差。

平方误差为:

\varepsilon =\sum_{i=1}^m(y_i-x_i^Tw)^2

写成矩阵运算的形式为:

\varepsilon =(Y-\Bold{X}w)^T(Y-\Bold{X}w)=w^TX^TXw-2w^TX^TY+Y^TY

为求\varepsilon的极小值,可对\varepsilon进行求导,\varepsilon的极值点一定出现在\frac{\partial \varepsilon }{\partial w}=0的位置:

\frac{\partial \varepsilon }{\partial w}=2X^TXw-2X^TY=0

可得\hat{w}=(X^TX)^{-1}X^TY

这里的\hat{w}便是回归系数的最优估计向量。

代码:

import numpy as np
import matplotlib.pyplot as plt


def load_dataset(filename):
    feature_number = len(open(filename).readline().split('\t'))-1
    data_mat = []
    label_mat = []
    file = open(filename)
    for line in file.readlines():
        line_array = []
        curr_line = line.strip().split('\t')
        for i in range(feature_number):
            line_array.append(float(curr_line[i]))
        data_mat.append(line_array)
        label_mat.append(curr_line[-1])
    return data_mat, label_mat


def linear_regress(x_array, y_array):
    x_mat = np.mat(x_array, dtype=np.float64)
    y_mat = np.mat(y_array, dtype=np.float64).T
    xTx = x_mat.T * x_mat
    if np.linalg.det(xTx) == 0.0:
        print("This matrix is singular, cannot do inverse")
        return
    w_hat = xTx.I * (x_mat.T * y_mat)
    return w_hat


if __name__ == '__main__':
    x_array, y_array = load_dataset('ex0.txt')
    w_hat = linear_regress(x_array, y_array)
    x_mat = np.mat(x_array, dtype=np.float64)
    y_mat = np.mat(y_array, dtype=np.float64)
    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.scatter(x_mat[:, 1].flatten().A[0], y_mat.T[:, 0].flatten().A[0])
    x_copy = x_mat.copy()
    x_copy.sort(0)
    y_hat = x_copy * w_hat
    ax.plot(x_copy[:, 1], y_hat, c="red")
    plt.show()

结果: 

那么,如何判断这些模型的好坏呢?

有种方法可以计算预测序列\hat{Y}和真实值Y之间的匹配程度,那就是计算这两个序列的相关系数(numpy中提供了corrcoef方法):

print(np.corrcoef(y_hat.T, y_mat))

结果:

[[1.         0.13653777]
 [0.13653777 1.        ]]

结果的含义是:\hat{Y}和自己的匹配最完美,而和Y的相关系数为0.1365

局部加权线性回归

线性回归的一个问题是有可能出现欠拟合现象,因为它求得是具有最小均方误差得无偏估计。显而易见,如果模型欠拟合将不能取得最好得预测结果。所以有些方法允许在估计中引入一些偏差,从而降低预测得均方误差。

其中的一个方法是局部加权线性回归(Locally Weighted Linear Regression, LWLR),在该算法中,我们给待测点附近的每一个点赋予一定的权重,然后在这个子集上基于最小均方差来进行普通的回归。与kNN一样,这种算法每次预测均需要事先选取出对应的数据子集。该算法决出的回归系数\hat{w}的形式如下:

\hat{w}=(X^TWX)^{-1}X^TWY

其中W是一个矩阵,用来给每个数据点赋予权重。

LWLR(局部加权线性回归)使用“核”(与支持向量机中的核类似)来对附近点赋予更高的权重。核的类型可以自由选择,最常用的核就是高斯核,高斯核对应的权重如下:

w(i,i)=\exp \left(\frac{\left | x^{(i)}-x \right | ^ 2} {-2k^2}\right)

这样就构建了一个只含有对角元素的权重矩阵W,并且点xx^{(i)}越近,w(i,i)将会越大。其中k是一个需要用户指定的参数,它决定了对附近的点赋予多大的权重,这也是LWLR唯一需要考虑的参数。

代码:

import numpy as np
import matplotlib.pyplot as plt


def load_dataset(filename):
    feature_number = len(open(filename).readline().split('\t'))-1
    data_mat = []
    label_mat = []
    file = open(filename)
    for line in file.readlines():
        line_array = []
        curr_line = line.strip().split('\t')
        for i in range(feature_number):
            line_array.append(float(curr_line[i]))
        data_mat.append(line_array)
        label_mat.append(curr_line[-1])
    return data_mat, label_mat


def lwlr(test_point, x_array, y_array, k=1.0):
    x_mat = np.mat(x_array, dtype=np.float64)
    y_mat = np.mat(y_array, dtype=np.float64).T
    m = np.shape(x_mat)[0]
    weights = np.mat(np.eye(m))
    for j in range(m):
        diff_mat = test_point - x_mat[j, :]
        weights[j, j] = np.exp(diff_mat * diff_mat.T / (-2.0 * k ** 2))
    xTx = x_mat.T * (weights * x_mat)
    if np.linalg.det(xTx) == 0.0:
        print("This matrix is singular, cannot do inverse")
        return
    w_hat = xTx.I * (x_mat.T * weights * y_mat)
    return test_point * w_hat


def lwlr_test(test_array, x_array, y_array, k=1.0):
    m = np.shape(test_array)[0]
    y_hat = np.zeros(m)
    for i in range(m):
        y_hat[i] = lwlr(test_array[i], x_array, y_array, k)
    return y_hat


if __name__ == '__main__':
    x_array, y_array = load_dataset('ex0.txt')
    x_array = np.array(x_array, dtype=np.float64)
    y_array = np.array(y_array, dtype=np.float64)
    y_hat = lwlr_test(x_array, x_array, y_array, 0.003)
    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.scatter(x_array[:, 1], y_array)
    sorted_index = x_array[:, 1].argsort(0)
    sorted_x_array = x_array[sorted_index]
    sorted_y_hat = y_hat[sorted_index]
    ax.plot(sorted_x_array[:, 1], sorted_y_hat, c="red")
    plt.show()

结果:

通过缩减系数来“理解”数据

如果特征比样本点还多(n>m),也就是说输入数据的矩阵X不是满秩矩阵。非满秩矩阵在求逆时会出现问题。

为了解决这个问题,统计学家引入了岭回归(ridge regression)的概念,同时还有lasso法(这种方法效果好但计算复杂);第二种缩减的方法为前向逐步法,可以得到和lasso差不多的效果,且更容易实现。

岭回归

简单来说,岭回归就是在矩阵X^TX上加一个\lambda I从而使得矩阵变得非奇异,这样便能对X^TX+\lambda I求逆,其中\lambda是一个用户自定义参数。在这种情况下,回归系数的计算公式为:

\hat{w}=(X^TX+\lambda I)^{-1}X^TY

岭回归最先用来处理特征数多余样本数的情况,现在也用于在估计中加入偏差,从而得到更好的估计。这里通过引入\lambda来限制所有的w之和,通过引入该惩罚项,能够减少不重要的参数,这个技术在统计学中称为缩减(shrinkage)

缩减方法可以去掉不重要的参数,因此能更好得理解数据。此外,与简单的线性回归相比,缩减法能够取得更好的预测效果。

def ridge_regress(x_mat, y_mat, lam=0.2):
    xTx = x_mat.T * x_mat
    denom = xTx + np.eye(np.shape(x_mat)[1]) * lam
    if np.linalg.det(denom) == 0.0:
        print("This matrix is singular, cannot do inverse")
        return
    w_hat = denom.T * (x_mat.T * y_mat)
    return w_hat

lasso

不难证明,在增加如下约束时,普通的最小二乘法回归会得到与岭回归的一样的公式:

\sum_{k=1}^n w_k^2 \leqslant \lambda

上式限定了所有回归系数的平方和不能大于\lambda。使用普通的最小二乘法回归在当两个或更多的特征相关时,可能会得出一个很大的正系数和很大的负系数。正是因为上述限制条件的存在,使用岭回归可以避免这个问题。

与岭回归类似,另一个缩减方法lasso也对回归系数做出了限定,对应的约束条件如下:

\sum_{k=1}^n\left | w_k \right |\leqslant \lambda

唯一的不同点在于,这个约束条件使用绝对值取代了平方和。虽然约束形式只是稍作变化,结果却大项径庭:在\lambda足够小的时候,一些系数会因此被迫缩减到0,这个特性可以帮助我们更好地理解数据,这两个约束条件在公式上看起来相差无几,但细微得变化却极大地增加了计算复杂度(为了在这个新得约束条件下解出回归系数,需要使用二次规划算法)。下面将介绍一个更为简单的方法来得到结果,该方法叫做前向逐步回归。

前向逐步回归

前向逐步回归算法可以得到与lasso差不多的效果,但更加简单。它属于一种贪心算法,即每一步都尽可能减小误差。一开始,所有权重都设为1,然后每一步所做的决策是对某个权重增加或减少一个很小的值。

前向逐步回归伪代码

  • 数据标准化,使其分布满足0均值和单位方差
  • 在每轮迭代过程中:
    • 设置当前最小误差lowest_error为正无穷
    • 对每个特征:
      • 增大或缩小:
        • 改变一个系数得到一个新的w
        • 计算新w下的误差error
        • 如果误差error小于当前最小误差lowest_error:设置\hat{w}等于当前的w
      • w设置为新的\hat{w}

代码:

import numpy as np


def load_dataset(filename):
    feature_number = len(open(filename).readline().split('\t'))-1
    data_array = []
    label_array = []
    file = open(filename)
    for line in file.readlines():
        line_array = []
        curr_line = line.strip().split('\t')
        for i in range(feature_number):
            line_array.append(float(curr_line[i]))
        data_array.append(line_array)
        label_array.append(curr_line[-1])
    return data_array, label_array

def regularize(x_mat):
    in_mat = x_mat.copy()
    in_means = np.mean(in_mat, 0)
    in_var = np.var(in_mat, 0)
    in_mat = (in_mat - in_means) / in_var
    return in_mat

def calc_rss_error(y_array, y_hat_array):
    return ((y_array - y_hat_array) ** 2).sum()

def stepwise(x_array, y_array, eps=0.01, iter_num=100):
    x_mat = np.mat(x_array, dtype=np.float64)
    y_mat = np.mat(y_array, dtype=np.float64).T
    # 将特征值按照均值为0,方差为1进行标准化处理
    y_mean = np.mean(y_mat, 0)
    y_mat = y_mat - y_mean
    x_mat = regularize(x_mat)
    m, n = np.shape(x_mat)
    return_mat = np.zeros((iter_num, n))
    w_hat = np.zeros((n, 1))
    w_hat_test = w_hat.copy()
    w_hat_max = w_hat.copy()
    for i in range(iter_num):
        print("[iteration  %d]" % i, w_hat.T)
        lowest_error = np.inf
        for j in range(n):
            for sign in [-1, 1]:
                w_hat_test = w_hat.copy()
                w_hat_test[j] += eps * sign
                y_test = x_mat * w_hat_test
                rss_error = calc_rss_error(y_mat.A, y_test.A)
                if rss_error < lowest_error:
                    lowest_error = rss_error
                    w_hat_max = w_hat_test
        w_hat = w_hat_max.copy()
        return_mat[i, :] = w_hat.T
    return return_mat

if __name__ == '__main__':
    x_array, y_array = load_dataset('abalone.txt')
    w_hat = stepwise(x_array, y_array, 0.01, 200)
    print("w_hat: ", w_hat)

 

CONTACT INFORMATION

E-mail: birdguan@seu.edu.cn

QQ: 46611253

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

预测数值型数据:回归 的相关文章

  • Kaggle竞赛题目之——Digit Recognizer

    Classify handwritten digits using the famous MNIST data This competition is the first in a series of tutorial competitio
  • 【Machine Learning】5.特征工程和多项式回归

    特征工程和多项式回归 1 导入 2 多项式特征 3 特征选择 4 多项式特征与线性特征的关联 5 特征缩放 Scaling features 6 复杂函数的拟合 7 课后题 特征工程 使用线性回归机制来拟合非常复杂甚至非线性 存在 x n
  • AB测试中如何给样本分组?

    目录 什么是AB测试 什么叫样本相似 为什么要样本相似 怎么实现样本相似 随机化 Randomization 再随机化 Rerandomization 协方差适应随机化 Covariance Adaptive Randomization 更
  • 机器学习、深度学习、图像检索 的一些优秀博客

    机器学习 深度学习 图像检索 的一些优秀博客 1 http www cnblogs com ooon 2 http yongyuan name blog
  • 西瓜书之误差逆传播公式推导、源码解读及各种易混淆概念

    关键词 反向传播 BP caffe源码 im2col 卷积 反卷积 上池化 上采样 公式推导 以前看到一长串的推导公式就想直接跳过 今天上午莫名有耐心 把书上的公式每一步推导自己算一遍 感觉豁然开朗 遂为此记 sigmoid函数求导比rel
  • 初识:梯度下降算法 (Gradient Descent) ----直线拟合散点

    我的第一个机器学习算法 梯度下降算法解决散点拟合问题 在直角坐标系中给出若干个点作为训练集 Training Set 使用梯度下降算法给出最合适的拟合直线 1 大体思路 我个人的理解 对于许多散步在直角坐标系中的点 首先给出一个初始的拟合直
  • Cascade network——multi-stage refinement

    文章目录 List Preview AttractioNet 2016 CRAFT CRAFT Objects from Images 2016 CC Net chained cascade network for object detec
  • 感知机(Perceptron)-----最详细记录感知机

    1 前言 感知机是1957年 由Rosenblatt提出会 是神经网络和支持向量机的基础 感知机是有生物学上的一个启发 他的参照对象和理论依据可以参照下图 我们的大脑可以认为是一个神经网络 是一个生物的神经网络 在这个生物的神经网络里边呢
  • 关于二阶锥优化(SOCP)的学习

    原来 数学不好的时候 真的很难深入下去做研究 最近的两个月时间里 我就边学习SOCP相关的理论知识 一边拿它当工具来分析多视角几何中的问题 包括Triangulation Homography Estimation等 接触到SOCP的起因在
  • 对numpy.c_的理解

    文章目录 文档描述 关于python科学计算 pandas numpy 中axis 轴 的理解 理解 文档描述 来自官方文档的叙述 这里只简单翻译一部分 numpy c numpy c
  • 【CS229 lecture19】微分动态规划

    首先声明一下 这节课基本没听懂 但是还是把课程笔记写下 lecture19 微分动态规划 继续强化学习算法的讨论 Agenda 课程中段我曾讲过调试learning algorithm 今天再来将强化学习的部分 The motivating
  • 深度学习知识体系学习大全 牛!!

    搬来了大牛的博客 点击直接前往 https www yuque com angsweet machine learning jian jie 配一张大牛的思维导图 具体内容点进去都能看到 数学 机器学习 语言 算法 深度学习 书籍推荐 东西
  • 深度学习 vs 概率图模型 vs 逻辑学

    深度学习 vs 概率图模型 vs 逻辑学 发表于 2015 04 30 21 55 1359次阅读 来源 quantombone 0 条评论 作者 Tomasz Malisiewicz 深度学习 deep learning 图模型 人工智能
  • 基于产品的RFM模型的k-means聚类分析

    首先我们可以看看数据集的数据形态 导入rfm数据 查看数据的统计学参数 df pd read csv rfm csv df describe 在实施Kmeans聚类之前 我们必须检查这些关键k means假设 变量对称分布 不倾斜 具有相同
  • 监督学习,无监督学习,半监督学习,主动学习的概念

    1 监督学习 supervised learning 训练数据既有特征 feature 又有标签 label 通过训练 让机器可以自己找到特征和标签之间的联系 在面对只有特征没有标签的数据时 可以判断出标签 即生成合适的函数将输入映射到输出
  • 机器学习简介

    介绍 机器学习是人工智能 AI 的一个子领域 机器学习的目标通常是理解数据的结构并将该数据拟合到人们可以理解和利用的模型中 尽管机器学习是计算机科学的一个领域 但它与传统的计算方法不同 在传统计算中 算法是计算机用来计算或解决问题的显式编程
  • 感知机分类学习

    感知机 perceptron 是一种二类分类的线性分类模型 也就是说 使用于将数据分成两类的 并且数据要线性可分的情况 线性可分是指存在一个超平面能够将空间分成两部分 每一部分为一类 感知机的目的就在于找这样的一个超平面 假设输入数据形式为
  • 二值分类模型的评价指标

    二值分类模型的评价指标主要有 Precision Recall F Score ROC and AUC ROC Receiver Operating Characteristic ROC曲线的横坐标为false positive rate
  • 【数据预处理】Pandas缺失的数据处理

    目录 缺少数据基础 何时 为何 数据丢失 被视为 缺失 的值 日期时间 插入缺失数据 缺少数据的计算 Sum Prod of Empties Nans GroupBy中的NA值 清理 填写缺失数据 填充缺失值 fillna 用PandasO
  • 如何使用 Whisper 和 Spleeter AI 工具制作卡拉 OK 视频

    介绍 人工智能工具可用于处理图像 音频或视频以产生新颖的结果 直到最近 在不使用大量时间和计算能力的情况下 自动编辑图像或音频仍然具有挑战性 即使如此 通常也只能运行交钥匙滤波器来删除声音中的某些频率或更改图像的调色板 较新的方法使用人工智

随机推荐

  • Spring 核心loC

    目录 1 loC是什么 1 1 改变之前的程序 1 2 修改后的代码 1 3 解决上述代码耦合问题 2 理解Spring 是一个loC 控制反转 容器 3 DI dependency injection 依赖注入 4 loC DI 总结及优
  • 单片机c语言中断程序实验报告,单片机实验之外部中断应用实验

    一 实验目的 1 掌握中断系统外部中断源的使用方法 2 掌握延时程序的编程及使用方法 3 掌握Proteus软件与Keil软件的使用方法 4 掌握单片机系统的硬件和软件设计方法 二 设计要求 1 用Proteus软件画出电路原理图 在单片机
  • 门级网表

    在电路设计中 网表 netlist 是用于描述电路元件相互之间连接关系的 一般来说是一个遵循某种比较简单的标记语法的文本文件 门级 gate level 指的是网表描述的电路综合级别 顾名思义 门级网表中 描述的电路元件基本是门 gate
  • git 将本地代码推送到远程仓库(核心常用)

    1 首先默认已经提前安装并且配置好git 2 选择要克隆或者保存的目标文件夹下 右键选择Git Bash Here 3 如果是将远端的项目拉取到本地 使用 git clone 命令 因为之前已经clone下来了 所以这次就不下载了 4 使用
  • Python教程:第2章(Python进阶)2.8-2.11

    文章目录 2 8 四大数据结构 2 8 1 单向队列 List 2 8 2 双向队列 Queue 2 8 3 栈 Stack 2 8 4 链表 Link 2 9 八大基础算法 2 9 0 算法复杂度 2 9 1 穷举算法 2 9 2 归纳
  • sqli-labs 38-45

    第38关 堆叠注入 简单理解就是一条语句结束后再连接一条语句 这就叫堆叠注入 举几个最简单的例子 查询数据并创建一个数据库 select from users creat database test 查询数据并删除一个数据库 select
  • java实现成绩及格的判定( true & false )

    成绩及格的判定 代码思想 1 使用条件语句 大于60及格 否则不及格 代码如下 List item IF else语句执行 import java util Scanner public class Test02 public static
  • Spring Boot中的Actuator是什么?Spring Boot中的Starter依赖是什么?

    Spring Boot中的Actuator是什么 在Spring Boot中 Actuator是一种用于监控和管理应用程序的工具 它提供了一些额外的端点和功能 使开发人员能够更好地了解和控制他们的应用程序 Actuator提供了以下功能 指
  • 【计算机视觉

    文章目录 一 分割 语义相关 6篇 1 1 Consistency guided Meta Learning for Bootstrapping Semi Supervised Medical Image Segmentation 1 2
  • Qt Creater创建项目时无法选择Kit选项 No suitable kits found

    项目场景 初步学习Qt编程 Qt Creator 安装 问题描述 创建工程时无法选择Kit套件 原因分析 No suitable kits found 没有找到合适的kits套件 在安装Qt Creator时没有安装MinGW 最直接的办法
  • 使用QT RemoteObject让两个软件(.exe)之间进行通信(VS2019+QT5.15)

    博主将两个软件进行通信是因为项目中出现调用的库只有32位的DLL和LIB 而自己写的软件却是64位 导致我的软件无法使用这个库 让我没办法控制 然后想到解决方法是写一个专门的32位软件调用这个库 然后通过与我现在写的软件进行通信 类似信号和
  • Gradle 入门之 Groovy 语言详解

    Gradle 核心是基于 Groovy 脚本语言 Groovy 脚本基于 Java 且拓展了 Java 因此 Gradle 需要依赖 JDK 和 Groovy 库 快速安装 Groovy 可以通过 Bash 命令如下 curl s get
  • 【数据结构】栈和队列的实现及应用

    需要云服务器等云产品来学习Linux的同学可以移步 gt 腾讯云 lt gt 阿里云 lt gt 华为云 lt 官网 轻量型云服务器低至112元 年 新用户首次下单享超低折扣 一 栈的概念 二 Stack h 三 Stack c 1 栈的初
  • centos 6.8 es安装

    配置操作系统参数 1 切换到root用户修改配置sysctl conf vi etc sysctl conf 添加下面配置 vm max map count 655360 1并执行命令 sysctl p 配置es参数 bootstrap m
  • C++ 数组

    C 支持数组数据结构 它可以存储一个固定大小的相同类型元素的顺序集合 数组是用来存储一系列数据 但它往往被认为是一系列相同类型的变量 数组的声明并不是声明一个个单独的变量 比如 number0 number1 number99 而是声明一个
  • STM32CubeIDE 集成的cube MX配置寄存器,IDE入门上手

    1 STM32CubeIDE属于一站式工具 本文带你体验它的强大 strongerHuang的博客 CSDN博客 STM32CubeIDE是一个多功能的集成开发工具 集成了TrueSTUDIO和STM32CubeMX 它是STM32Cube
  • ZYNQ QFLASH MX25L256 调试笔记

    该QFlash是32MB的 而ZYNQ的控制器是16MB的 所以想使用后半部分时 必须要使用4byte地址模式或者扩展模式 先调试扩展模式 在QFlash手册里面有一个写扩展模式命令 C5 写命令的时候 然后再读扩展模式寄存器 C8 就可以
  • Java项目:博客系统西瓜社区(springboot+mybatis-plus+thymeleaf)

    西瓜社区文档 项目全部源码百度网盘地址在文档中 仔细阅读就可发现 前端 社区目前基于开源的markdown框架editorme进行开发的问答和博客的两个功能 后端 springboot mybatis plus swagger2 thyme
  • 记Springboot项目中@Service(或@Component)注解失效的问题解决方法

    一 问题描述 今天基于SpringBoot写好的一个项目程序 启动时 报如下错误 2020 04 07 14 04 41 420 WARN o s b w s c AnnotationConfigServletWebServerApplic
  • 预测数值型数据:回归

    本文传送机 用线性回归找到最佳拟合直线 局部加权线性回归 通过缩减系数来 理解 数据 岭回归 lasso 前向逐步回归 用线性回归找到最佳拟合直线 线性回归 优点 结果易于理解 计算上不复杂 缺点 对非线性的数据拟合不好 适用数据类型 数值