机器学习的练功方式(九)——线性回归

文章目录

    • 致谢
  • 9 线性回归再相遇
    • 9.1 再遇
      • 9.1.1 概述
      • 9.1.2 矩阵和向量
      • 9.1.3 矩阵加减乘除
        • 9.1.3.1 矩阵——矩阵加减
        • 9.1.3.2 矩阵——标量加减乘
        • 9.1.3.3 矩阵——向量相乘
        • 9.1.3.4 矩阵——矩阵相乘
        • 9.1.3.5 矩阵的逆
        • 9.1.3.6 矩阵的转置
      • 9.1.4 向量化
      • 9.1.5 广义线性模型
    • 9.2 正规方程
    • 9.3 线性回归的实现
    • 9.4 模型评估
    • 9.5 正规方程和梯度下降
    • 9.6 关于优化方法
    • 9.7 后话

致谢

为什么计算函数极值用梯度下降算法而不直接令导数为0求解? - 知乎 (zhihu.com)

解释为什么用梯度下降而不是直接求导数为0的解?_weixin_43167121的博客-CSDN博客_梯度下降为什么不直接导数=0

python的numpy向量化语句为什么会比for快? - 知乎 (zhihu.com)

机器学习:波士顿房价数据集 - wjunneng - 博客园 (cnblogs.com)

随机梯度下降(SGD)与经典的梯度下降法的区别_米兰小子SHC-CSDN博客_随机梯度下降和梯度下降的区别

1.1-广义线性模型 - sklearn中文文档 (sklearncn.cn)

线性回归(模型的评估) - 知乎 (zhihu.com)

9 线性回归再相遇

在第二讲中,实际上我们已经谈论了线性回归的基本知识。但是你是否在当时发现了我的一些漏洞呢?如果你没有发现,你要好好反思自己了。

在当时我们谈到了对于损失函数如何求最小值的问题,那时候我对于求导避而不谈,转而使用了梯度下降来作为求最小值的方法,这是为何呢?

首先我们来试想,我们用求导来求极小值是怎么求的?我们是通过令导函数为0来求导的,可是实际问题中,如果损失函数非凸,那势必会出现y=x3y = x^3y=x3x0x_0x0位置的拐点。因此我们可以得出:并不是所有的函数都可以根据导数求导取得0值的点的,我们需要一种更通用的方式来解决损失函数极小值的问题。

在最优化中,牛顿迭代和梯度下降都可以计算极值。区别在于,梯度下降法的算法复杂度低一些, 但是迭代次数多一些; 牛顿迭代法计算的更快(初值必须设置的很合理), 但是牛顿迭代法因为有"除法"参与(对矩阵来说就是求逆矩阵), 所以每一步迭代计算量很大. 一般会根据具体的情况取舍。

梯度下降相比于牛顿迭代法还有一个好处就是,它的完成方式允许一个简单的并行化,即在多个处理器或机器上分配计算,所以当你使用神经网络来训练模型时,梯度下降变得尤为重要。

好了,坑填上了,下面进入我们这一讲学习的部分。

9.1 再遇

9.1.1 概述

线性回归并不是我们初中学习的那个一次函数了,实际上在机器学习中的线性回归更加地广义。我们初中熟知的一次函数在机器学习中被称为单变量回归。而自变量大于一个的我们叫做多元回归。在第二讲中我们谈到房价预测的模型hθ(x)=θ0+θ1x1+θ2x2h_θ(x) = θ_0+θ_1x_1+θ_2x_2hθ(x)=θ0+θ1x1+θ2x2即为多元回归。

我们给出通用公式:h(w)=w1x1+w2x2+...wnxn+b=wT+bh(w) = w_1x_1+w_2x_2+...w_nx_n+b = w^T+bh(w)=w1x1+w2x2+...wnxn+b=wT+b

其中w,x可以理解为矩阵,这实际上是向量化的一种应用方式,在后面,我会提到向量化,不必担心。但是在这之前,我们必须重温线性代数。

9.1.2 矩阵和向量

矩阵一般用方括号括起,里面写有若干个数字。我们一般表示矩阵的维度通常是采用行数×列数来表示的。如下图所示:

image-20220314100743910

有时我们也会遇见下图所示的符号:

image-20220314100924054

这个看似像R的符号实际上代表任意2×3规模的矩阵集合。

如上面的矩阵所示,我们会用AijA_{ij}Aij来表示A矩阵中第i行第j列的某一个元素。

对于向量也是相应的表示方法,它实际上是一个n×1的矩阵,也就是说,实际上标量是0维,向量是2维,矩阵是三维。

9.1.3 矩阵加减乘除

9.1.3.1 矩阵——矩阵加减

矩阵的加法和减法实际上就是,两个矩阵对应元素相加相减即可。但是在这里需要注意,如果两个矩阵不是同型(即不同维度的)的,那么两个矩阵是不能相加相减的。

image-20220314102115810

在python中两个矩阵即使不同型也能相加,即python的广播机制,在后面的论述中,我们再细谈。

9.1.3.2 矩阵——标量加减乘

对于一个标量和一个矩阵相加相减,如果该标量是n,那么实际上我们可以把该标量看成是一个n的单位矩阵(n的单位矩阵是主对角线全n,可不是矩阵所有元素都是n哈),且与另外需要相加相减的矩阵同型。也就是说,标量加矩阵,即矩阵对应元素全部加上或减去该标量。

同样地,标量和矩阵相乘,即矩阵所有元素全部乘上该标量。

image-20220314102320172

9.1.3.3 矩阵——向量相乘

矩阵和一个向量相乘,假如一个矩阵为m×n,则要求向量一定要为n×1,否则不能相乘。

相乘的时候,矩阵的行元素与向量的列元素对应相乘再相加。

image-20220314102818537

9.1.3.4 矩阵——矩阵相乘

矩阵矩阵相乘和矩阵向量相乘同理,假如一个矩阵为m×n,则要求另外一个矩阵必须是n×k,否则不能相乘。其相乘的结果矩阵为m×k。

相乘的时候,A矩阵的行元素和B矩阵的列元素对应相乘再相加。

实际上,AB矩阵相乘和BA矩阵相乘是不一样的,也就是说,其不享有标量运算中的乘法交换律。所以在进行计算的时候,这个问题是十分需要注意的。不过有一个特例,假如矩阵和单位矩阵进行相乘,两者是满足乘法交换律的。

9.1.3.5 矩阵的逆

有些人很奇怪,上面怎么都是相加相减相乘,可就是没有相除呢?这是因为在线性代数中矩阵的除法不太一样。

在线性代数中,矩阵的除法叫做。比如标量1/3和3/1相乘,其必定为1。我们称3/1为1/3的逆。在矩阵中,假如有A矩阵和A的逆矩阵A−1A^{-1}A1,则满足A(A−1)=I(I为单位矩阵)A(A^{-1}) = I(I为单位矩阵)A(A1)=I(I)。且需要提到的是,只有形如m×m的方阵才有逆矩阵。

逆矩阵一般怎么求呢?外国学生一般用软件算,而中国学生就比较“惨”了,一般靠手算。

如果靠手算,我们一般使用初等行变换法或者利用伴随矩阵来求,这里我们就不过多叙述了,因为脱离了主要内容了。

9.1.3.6 矩阵的转置

转置就不多说了,直接行列互换即可。假如一个A为m×n,则ATA^TAT为n×m。

9.1.4 向量化

在线性回归中,我们会把若干个特征放入x向量中,而把若干个w放入w向量中,最后运用上述的线性代数知识将其加上b。这么做的话,相比于用for循环一个特征一个特征的去扫描,然后一个样本一个样本训练模型来说,使用numpy来启用线性代数机制去计算明显速度要提高几番不止。至于为什么用线性代数机制快,你可以去网上查查,这里涉及底层知识,这里不过多讲解。

9.1.5 广义线性模型

线性模型中实际上有狭义线性模型和广义线性模型。狭义的线性模型就是我们所知的y = kx+b,而广义线性模型即为y=w1x1+w2x2+by = w_1x_1+w_2x_2+by=w1x1+w2x2+b,画在图上实际上这个函数是一个平面。甚至于你可以无限扩展其维度,变成y=w1x1+w2x2+...wnxn+by = w_1x_1+w_2x_2+...w_nx_n+by=w1x1+w2x2+...wnxn+b

然而,线性模型也并非一定要线性,也可以是非线性的。形如y=w1x1+w2x22+by = w_1x_1+w_2x_2^2+by=w1x1+w2x22+b也被称为线性模型。线性模型实际上追求的不是线性,而是追求模型中某个东西一次(方):即自变量一次或参数一次。

参数和自变量多,实际上可以提高模型精度;但是不控制好,则会导致过拟合,这一点在第五讲我们已经做过论述了,这里不再提了。

9.2 正规方程

我们在第二讲曾经提到过正规方程。现在是时候填上我们的坑了。

正规方程和梯度下降都是求得损失函数最小值对应参数的方法。但是不同的是,正规方程并不需要进行迭代,它可以一步求解。而对于梯度下降,其必须勤勤恳恳进行迭代无限逼近最小值。

但是正规方程也有不好的地方,当特征过多过复杂的时候,正规方程求解速度会很慢,且常常求不出结果。所以其实际上具有局限性。

正规方程的基本形式为:
w=(XTX)−1XTyw = (X^TX)^{-1}X^Ty w=(XTX)1XTy
由于正规方程的不通用性,所以这里我们不做过多讲解,初学者只需牢牢掌握梯度下降即可。

9.3 线性回归的实现

结合第二讲和这一讲的叙述,相信我们对线性回归都有一定地了解了,现在让我们看看,我们如何使用sklearn为我们提供的API。

sklearn.linear_model.LinearRegression(fit_intercept = True)

  • 通过正规方程优化
  • fit_intercept:是否计算偏置
  • LinearRegression.coef_:回归系数
  • LinearRegression.intercept_:偏置

sklearn.linear_model.SGDRegression(loss = “squared_loss”,fit_intercept = True,learning_rate = ‘invscaling’,eta0 = 0.01)

  • loss:损失类型
  • loss = “squared_loss”:普通最小二乘法
  • fit_intercept:是否计算偏置
  • learning_rate:string,optinal
  • 用于学习率填充
  • ‘constant’:eta = eta0
  • ‘optimal’:eta = 1.0/(alpha*(t+t0))[default]
  • ‘invscaling’:eta = eta0/pow(t,power_t)
    • power_t = 0.25:存在于父类中
  • 对于一个常数值的学习率来说,可以使用’constant’,并使用eta0来指定学习率
  • SGDRegressor.coef_:回归系数
  • SGDRegressor.intercept_:偏置

我们利用上面的API,对sklearn内置的波士顿房价数据集做预测。

波士顿房价数据集

使用sklearn.datasets.load_boston即可加载相关数据。该数据集是一个回归问题。每个类的观察值数量是均等的,共有 506 个观察,13 个输入变量和1个输出变量。

每条数据包含房屋以及房屋周围的详细信息。其中包含城镇犯罪率,一氧化氮浓度,住宅平均房间数,到中心区域的加权距离以及自住房平均房价等等。

img

在上面的数据中,我们可以总结出以下处理步骤:

  • 获取数据集
  • 划分数据集
  • 特征工程:标准化(各项指标有小数有整数,需要标准化一下)
  • 预估器流程
  • 模型评估

代码如下所示:

from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import SGDRegressordef linear_model_1():"""利用正规方程来优化损失函数"""# 1 获取数据boston_data = load_boston()# 2 划分数据x_train, x_test, y_train, y_test = train_test_split(boston_data.data, boston_data.target, random_state=22)# 3 标准化transfer = StandardScaler()x_train = transfer.fit_transform(x_train)x_test = transfer.transform(x_test)# 4 预估器estimator = LinearRegression()estimator.fit(x_train, y_train)# 5 得出模型print("------经果正规方程的优化后------")print("权重系数为:\n", estimator.coef_)print("偏置为:\n", estimator.intercept_)def linear_model_2():"""利用梯度下降来优化损失函数"""# 1 获取数据boston_data = load_boston()# 2 划分数据x_train, x_test, y_train, y_test = train_test_split(boston_data.data, boston_data.target, random_state=22)# 3 标准化transfer = StandardScaler()x_train = transfer.fit_transform(x_train)x_test = transfer.transform(x_test)# 4 预估器estimator = SGDRegressor()estimator.fit(x_train, y_train)# 5 得出模型print("------经果梯度下降的优化后------")print("权重系数为:\n", estimator.coef_)print("偏置为:\n", estimator.intercept_)linear_model_1()
linear_model_2()

9.4 模型评估

在回归任务中,其不像分类任务一样直接对比分类效果获得准确率即可。对于模型的好坏采用的是评估指标,评估指标一般都是用我们在第二讲讲到的那几个误差函数。在线性回归中,常用的误差函数即为平方误差函数,即均方误差(Mean Square Error,MSE)。其他的误差函数,在神经网络中会一一涉及。

均方误差如下所示:
MSE=1m∑i=1m(y^−yi)2MSE = \frac{1}{m}\sum^m_{i = 1}(\hat y - y^i)^2 MSE=m1i=1m(y^yi)2
MSE的作用就是当你训练出了模型后,我用测试集中的数据来对比你预测出来的结果,看看差距到底有多大,这个多大是用均方误差来估计的。

在sklearn中也有相应的API,如下所示:

sklearn.metrics.mean_squared_error(y_true, y_pred)

  • 均方误差回归损失
  • y_true:真实值
  • y_pred:预测值
  • return:误差,浮点数结果

应用在上面的线性回归中:

from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import SGDRegressor
from sklearn.metrics import mean_squared_errordef linear_model_1():"""利用正规方程来优化损失函数"""# 1 获取数据boston_data = load_boston()# 2 划分数据x_train, x_test, y_train, y_test = train_test_split(boston_data.data, boston_data.target, random_state=22)# 3 标准化transfer = StandardScaler()x_train = transfer.fit_transform(x_train)x_test = transfer.transform(x_test)# 4 预估器estimator = LinearRegression()estimator.fit(x_train, y_train)y_predict = estimator.predict(x_test)# 5 得出模型print("------经果正规方程的优化后------")print("权重系数为:\n", estimator.coef_)print("偏置为:\n", estimator.intercept_)# 6 评估模型error = mean_squared_error(y_test, y_predict)print("均方误差为:\n", error)def linear_model_2():"""利用梯度下降来优化损失函数"""# 1 获取数据boston_data = load_boston()# 2 划分数据x_train, x_test, y_train, y_test = train_test_split(boston_data.data, boston_data.target, random_state=22)# 3 标准化transfer = StandardScaler()x_train = transfer.fit_transform(x_train)x_test = transfer.transform(x_test)# 4 预估器estimator = SGDRegressor()estimator.fit(x_train, y_train)y_predict = estimator.predict(x_test)# 5 得出模型print("------经果梯度下降的优化后------")print("权重系数为:\n", estimator.coef_)print("偏置为:\n", estimator.intercept_)# 6 评估模型error = mean_squared_error(y_test, y_predict)print("均方误差为:\n", error)linear_model_1()
linear_model_2()

9.5 正规方程和梯度下降

正规方程和梯度下降在上面的案例中已经有了很明显的对比:

梯度下降正规方程
需要选择学习率不需要
需要迭代求解一次运算就能得出
特征数量较大可以使用需要解方程,时间复杂度很高

在选择优化方法时,我觉得真的没必要花里胡哨,梯度下降就对了。如果那你真的很想搞事,那么sklearn给了一个参考图,你可以根据这个来判定你要使用哪种优化方法。

9.6 关于优化方法

实际上,我们在上面提到的sklearn.linear_model.SGDRegression并不是传统的梯度下降(GD),而是经过多次改进的随机梯度下降(SGD)

传统的梯度下降需要在迭代过程中使用所有的训练数据。记得梯度下降怎么做的吗?

线性代数的损失函数假设为:J(θ1)=12m(y^−y)2J(θ_1) = \frac {1}{2m}(\hat y - y)^2J(θ1)=2m1(y^y)2,则模型参数更新为:θj=θj−α∂∂θjJ(θ0,θ1)θ_j = θ_j - \alpha \frac{\partial}{\partial θ_j} J(θ_0,θ_1)θj=θjαθjJ(θ0,θ1)

因此,在经典的梯度下降法中每次对模型参数进行更新时,需要遍历所有的数据。当m很大的时候,就需要耗费巨大的计算资源和计算时间。为此,随机梯度下降(SGD)应运而生。

随机梯度下降不再去求平均数了,而是使用随机的单个样本的损失来作为平均损失。它是一种简单但非常有效的方法。适用于支持向量机和回归中。在以前小数据是SGD实际上作用并不明显,但是在数据愈发蓬勃发展的时刻它越来越重要。

所以综上所述,SGD的优点就是效率高易于实现。而SGD的缺点是其包含众多的超参数,需要自己指定,而且其对于标准化很敏感。

9.7 后话

实际上回归远不止于此,线性回归是回归问题一种最为简单的实现方式。除了线性回归,前面学过的决策树也能做回归,贝叶斯也可以,如果后面有机会,我们还会接触到岭回归、逻辑斯蒂回归(实际上是分类)、最小角回归、弹性网络、感知机、稳健回归等,它们都属于广义线性模型。

好了,这一讲有点长,你也累了,晚安。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/398643.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vsftp服务器搭建

1.FTP的主动模式和被动模式的区别: 最大的区别是数据端口并不总是20, 主动模式和被动模式的优缺点: 主动FTP对FTP服务器的管理和安全很有利,但对客户端的管理不利。因为FTP服务器企图与客户端的高位随机端口建立连接,而…

12个月份统计分组

/** 根据月份来统计trade里面的入账,支出,总盈利*/public function countMonth(){$in array();$out array();$res array();$year date("Y",time());$in_sql SELECT SUM(money) AS mon, FROM_UNIXTIME(cdate, "%m") AS m FR…

深度学习修炼(一)——从机器学习转向深度学习

文章目录1 转变1.1 前言1.2 基本元素1.2.1 张量1.2.2 创建张量1.2.3 操纵张量1.2.3.1 张量乘法1.2.3.2 哈达玛积1.2.3.3 降维1.2.3.4 转置1.2.3.5 范数1.2.3.6 拼接张量1.2.4 张量属性1.2.5 张量和Numpy1.2.5.1 张量变Numpy1.2.5.2 Numpy变张量1.3 后话1 转变 1.1 前言 在之前…

idea 调试技巧1

1 多线程调试 开发过多线程应用的朋友应该有体会,有些时候,为了观察多个线程间变量的不同状态,以及锁的获取等,就会想到在代码里加个断点debug一下。 在IDE里断点停下来的时候,可以切换到另外的线程中,跑其…

SQL server 复习一

第一天 下面我们从最基础的开始: 在运行里面输入:services.msc 一、启动服务 二、数据库登录的两种身份验证方式 另外一种身份验证方式就是SQL Server身份验证. sa不能使用的时候可以这样的操作: 1.用windows登录,然后在“实例”右键“属性”…

[分享]iOS开发-实现view底部控件随着键盘的弹出而上移的效果

首先说一下思路:想要达到底部控件随着键盘的弹出而上移的效果,那么我们必然需要的到键盘在弹出时的高度,以及原点坐标。说白了我们的大致思路就是,用view的高度-键盘弹出时的高度,得到的值就是底部控件与vi…

深度学习修炼(二)——数据集的加载

文章目录致谢2 数据集的加载2.1 框架数据集的加载2.2 自定义数据集2.3 准备数据以进行数据加载器训练致谢 Pytorch自带数据集介绍_godblesstao的博客-CSDN博客_pytorch自带数据集 2 数据集的加载 与sklearn中的datasets自带数据集类似,pytorch框架也为我们提供了数…

Node.js 函数

在JavaScript中,一个函数可以作为另一个函数接收一个参数。我们可以先定义一个函数,然后传递,也可以在传递参数的地方直接定义函数。 Node.js中函数的使用与Javascript类似,举例来说,你可以这样做: functio…

在Entity Framework 4.0中使用 Repository 和 Unit of Work 模式

【原文地址】Using Repository and Unit of Work patterns with Entity Framework 4.0 【原文发表日期】 16 June 09 04:08 PM 如果你一直在关注这个博客的话,你知道我最近在讨论我们加到Entity Framework 4.0中的POCO功能的方方面面,新加的POCO支持促成…

Css3之基础-5 Css 背景、渐变属性

一、CSS 背景概述背景属性的作用- 背景样式可以控制 HTML 元素的背景颜色、背景图像等 - 背景色- 设置单一的颜色作为背景- 背景图像- 以图片作为背景- 可以设置图像的位置、平铺、尺寸等二、CSS 背景属性背景色 background-color - 属性用于为元素设置背景色- 接受任何合法的颜…

[Angularjs]锚点操作服务$anchorScroll

写在前面 有个单页应用的项目中,需要通过锚点进行页面的定位。但angularjs的路由会出现跟锚点冲突,angularjs会将锚点当成路由进行解析,造成跳转到这个页面,而我们需要的只是跳转到当前的锚点位置。angularjs的路由格式#/home/en。…

机器学习的练功方式(十)——岭回归

文章目录十 岭回归10.1 岭回归的接口10.2 岭回归处理房价预测十 岭回归 岭回归是线性回归的改进,有时候迫不得已我们的参数确实不能少,这时候过拟合的现象就可能发生。为了避免过拟合现象的发生,既然不能从减少参数上面下手,那我…

js产生随机数

<script>document.write(parseInt(10*Math.random()));  //输出0&#xff5e;10之间的随机整数document.write(Math.floor(Math.random()*101));  //输出1&#xff5e;10之间的随机整数function RndNum(n){var rnd"";for(var i0;i<n;i)rndMath.floor(Math…

JS实现在输入框内输入@时,邮箱账号自动补全

<!DOCTYPE HTML><html lang"en"><head><meta charset"utf-8"/><title>邮箱自动补全</title><style type"text/css">.wrap{width:200px;margin:0 auto;}h1{font-size:36px;text-align:center;line-hei…

OpenCV修养(一)——引入

文章目录1 引入1.1 OpenCV是啥1.2 OpenCV——Python1 引入 1.1 OpenCV是啥 OpenCV是一个基于Apache2.0许可&#xff08;开源&#xff09;发行的跨平台计算机视觉计算机视觉和机器学习软件库&#xff0c;可以运行在Linux、Windows、Android和Mac OS操作系统上。 它轻量级而且高…

动态创建 Plist 文件

简介 Property List&#xff0c;属性列表文件&#xff0c;它是一种用来存储串行化后的对象的文件。属性列表文件的扩展名为.plist &#xff0c;因此通常被称为 plist文件&#xff0c;文件是xml格式的。 写入plist文件 在开发过程中&#xff0c;有时候需要把程序的一些配置保存下…

[Everyday Mathematics]20150101

(1). 设 $f(x),g(x)$ 在 $[a,b]$ 上同时单调递增或单调递减, 试证: \[ (b-a)\int_a^b f(x)g(x)\mathrm{\,d}x \geq \int_a^b f(x)\mathrm{\,d}x\cdot \int_a^b g(x)\mathrm{\,d}x. \] (2). 试证: \[ c\in (0,1)\Rightarrow \int_c^1 \dfrac{e^t}{t}\mathrm{\,d}t \geq e\cdot …

被解放的姜戈08 远走高飞

作者&#xff1a;Vamei 出处&#xff1a;http://www.cnblogs.com/vamei 转载请先与我联系。 之前在单机上实现了一个Django服务器&#xff08;被解放的姜戈07 马不停蹄&#xff09;&#xff0c;现在我们可以把这个服务器推上一个云平台。这里我选择使用阿里云。 看着复仇的火焰…

OpenCV修养(二)——OpenCV基本操作

文章目录2 OpenCV基本操作2.1 IO操作2.2 图像基本操作2.2.1 图像绘制2.2.1.1 绘制直线2.2.1.2 绘制圆形2.2.1.3 绘制矩形2.2.1.4 添加文字2.2.1.5 试手2.2.2 获取/修改图像的像素点2.2.3 获取图像属性2.2.4 图像通道拆分/合并2.2.5 色彩空间改变2.2.6 边界填充2.3图像算数操作2…

ylbtech-LanguageSamples-Porperties(属性)

ylbtech-Microsoft-CSharpSamples:ylbtech-LanguageSamples-Porperties(属性)1.A&#xff0c;示例(Sample) 返回顶部“属性”示例 本示例演示属性为何是 C# 编程语言必不可少的一个组成部分。它演示了如何声明和使用属性。有关更多信息&#xff0c;请参见属性&#xff08;C# 编…