百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

广义线性模型②

bigegpt 2024-08-31 16:45 2 浏览

1.1.10. 贝叶斯回归

贝叶斯回归可以用于在预估阶段的参数正则化: 正则化参数的选择不是通过人为的选择,而是通过手动调节数据值来实现。

上述过程可以通过引入 无信息先验 到模型中的超参数来完成。 在 岭回归中使用的

正则项相当于在

为高斯先验条件,且此先验的精确度为

时,求最大后验估计。在这里,我们没有手工调参数 lambda ,而是让他作为一个变量,通过数据中估计得到。

为了得到一个全概率模型,输出

也被认为是关于

的高斯分布。

Alpha 在这里也是作为一个变量,通过数据中估计得到。

贝叶斯回归有如下几个优点:

  • 它能根据已有的数据进行改变。
  • 它能在估计过程中引入正则项。

贝叶斯回归有如下缺点:

  • 它的推断过程是非常耗时的。

参考资料

一个对于贝叶斯方法的很好的介绍 C. Bishop: Pattern Recognition and Machine learning详细介绍原创算法的一本书 Bayesian learning for neural networks by Radford M. Neal

1.1.10.1. 贝叶斯岭回归

BayesianRidge 利用概率模型估算了上述的回归问题,其先验参数

是由以下球面高斯公式得出的:

先验参数

一般是服从 gamma 分布 ,这个分布与高斯成共轭先验关系。 得到的模型一般称为 贝叶斯岭回归,并且这个与传统的 Ridge 非常相似。

参数

是在模型拟合的时候一起被估算出来的,其中参数

通过最大似然估计得到。scikit-learn的实现是基于文献(Tipping,2001)的附录A,参数

的更新是基于文献(MacKay,1992)。

剩下的超参数



以及


是关于

的 gamma 分布的先验。 它们通常被选择为 无信息先验 。默认

贝叶斯岭回归用来解决回归问题:

>>> from sklearn import linear_model
>>> X = [[0., 0.], [1., 1.], [2., 2.], [3., 3.]]
>>> Y = [0., 1., 2., 3.]
>>> reg = linear_model.BayesianRidge()
>>> reg.fit(X, Y)
BayesianRidge(alpha_1=1e-06, alpha_2=1e-06, compute_score=False, copy_X=True,
 fit_intercept=True, lambda_1=1e-06, lambda_2=1e-06, n_iter=300,
 normalize=False, tol=0.001, verbose=False)Copy

在模型训练完成后,可以用来预测新值:

>>> reg.predict ([[1, 0.]])
array([ 0.50000013])Copy

权值

可以被这样访问:

>>> reg.coef_
array([ 0.49999993,  0.49999993])Copy

由于贝叶斯框架的缘故,权值与 普通最小二乘法 产生的不太一样。 但是,贝叶斯岭回归对病态问题(ill-posed)的鲁棒性要更好。

示例:

贝叶斯岭回归

参考资料

Section 3.3 in Christopher M. Bishop: Pattern Recognition and Machine Learning, 2006David J. C. MacKay, Bayesian Interpolation, 1992.Michael E. Tipping, Sparse Bayesian Learning and the Relevance Vector Machine, 2001.

1.1.10.2. 主动相关决策理论 - ARD

ARDRegression (主动相关决策理论)和 Bayesian Ridge Regression 非常相似,但是会导致一个更加稀疏的权重w[1][2]

ARDRegression 提出了一个不同的

的先验假设。具体来说,就是弱化了高斯分布为球形的假设。

它采用

分布是与轴平行的椭圆高斯分布。

也就是说,每个权值

从一个中心在 0 点,精度为

的高斯分布中采样得到的。

并且

.

Bayesian Ridge Regression_ 不同, 每个

都有一个标准差

。所有

的先验分布 由超参数

确定的相同的 gamma 分布确定。

ARD 也被称为 稀疏贝叶斯学习相关向量机 [3][4]。

示例:

Automatic Relevance Determination Regression (ARD)

参考资料:

[1] Christopher M. Bishop: Pattern Recognition and Machine Learning, Chapter 7.2.1[2] David Wipf and Srikantan Nagarajan: A new view of automatic relevance determination[3] Michael E. Tipping: Sparse Bayesian Learning and the Relevance Vector Machine[4] Tristan Fletcher: Relevance Vector Machines explained

1.1.11. logistic 回归

logistic 回归,虽然名字里有 “回归” 二字,但实际上是解决分类问题的一类线性模型。在某些文献中,logistic 回归又被称作 logit 回归,maximum-entropy classification(MaxEnt,最大熵分类),或 log-linear classifier(对数线性分类器)。该模型利用函数 logistic function 将单次试验(single trial)的可能结果输出为概率。

scikit-learn 中 logistic 回归在 LogisticRegression 类中实现了二分类(binary)、一对多分类(one-vs-rest)及多项式 logistic 回归,并带有可选的 L1 和 L2 正则化。

注意,scikit-learn的逻辑回归在默认情况下使用L2正则化,这样的方式在机器学习领域是常见的,在统计分析领域是不常见的。正则化的另一优势是提升数值稳定性。scikit-learn通过将C设置为很大的值实现无正则化。

作为优化问题,带 L2罚项的二分类 logistic 回归要最小化以下代价函数(cost function):

类似地,带 L1 正则的 logistic 回归解决的是如下优化问题:


Elastic-Net正则化是L1 和 L2的组合,来使如下代价函数最小:

其中ρ控制正则化L1与正则化L2的强度(对应于l1_ratio参数)。

注意,在这个表示法中,假定目标y_i在测试时应属于集合[-1,1]。我们可以发现Elastic-Net在ρ=1时与L1罚项等价,在ρ=0时与L2罚项等价

LogisticRegression 类中实现了这些优化算法: liblinearnewton-cglbfgssagsaga

liblinear应用了坐标下降算法(Coordinate Descent, CD),并基于 scikit-learn 内附的高性能 C++ 库 LIBLINEAR library 实现。不过 CD 算法训练的模型不是真正意义上的多分类模型,而是基于 “one-vs-rest” 思想分解了这个优化问题,为每个类别都训练了一个二元分类器。因为实现在底层使用该求解器的 LogisticRegression 实例对象表面上看是一个多元分类器。 sklearn.svm.l1_min_c 可以计算使用 L1时 C 的下界,以避免模型为空(即全部特征分量的权重为零)。

lbfgs, sagnewton-cg 求解器只支持 L2罚项以及无罚项,对某些高维数据收敛更快。这些求解器的参数 multi_class设为 multinomial 即可训练一个真正的多项式 logistic 回归 [5] ,其预测的概率比默认的 “one-vs-rest” 设定更为准确。

sag 求解器基于平均随机梯度下降算法(Stochastic Average Gradient descent) [6]。在大数据集上的表现更快,大数据集指样本量大且特征数多。

saga 求解器 [7] 是 sag 的一类变体,它支持非平滑(non-smooth)的 L1 正则选项 penalty="l1" 。因此对于稀疏多项式 logistic 回归 ,往往选用该求解器。saga求解器是唯一支持弹性网络正则选项的求解器。

lbfgs是一种近似于Broyden–Fletcher–Goldfarb–Shanno算法[8]的优化算法,属于准牛顿法。lbfgs求解器推荐用于较小的数据集,对于较大的数据集,它的性能会受到影响。[9]

总的来说,各求解器特点如下:

默认情况下,lbfgs求解器鲁棒性占优。对于大型数据集,saga求解器通常更快。对于大数据集,还可以用 SGDClassifier ,并使用对数损失(log loss)这可能更快,但需要更多的调优。

示例

Logistic回归中的L1罚项和稀疏系数L1罚项-logistic回归的路径多项式和OVR的Logistic回归newgroups20上的多类稀疏Logistic回归使用多项式Logistic回归和L1进行MNIST数据集的分类

liblinear 的区别:

fit_intercept=False 拟合得到的 coef_ 或者待预测的数据为零时,用 solver=liblinearLogisticRegressionLinearSVC 与直接使用外部 liblinear 库预测得分会有差异。这是因为, 对于 decision_function 为零的样本, LogisticRegressionLinearSVC 将预测为负类,而 liblinear 预测为正类。 注意,设定了 fit_intercept=False ,又有很多样本使得 decision_function 为零的模型,很可能会欠拟合,其表现往往比较差。建议您设置 fit_intercept=True 并增大 intercept_scaling

注意:利用稀疏 logistic 回归进行特征选择

带 L1罚项的 logistic 回归 将得到稀疏模型(sparse model),相当于进行了特征选择(feature selection),详情参见 基于 L1 的特征选取

LogisticRegressionCV 对 logistic 回归 的实现内置了交叉验证(cross-validation),可以找出最优的 Cl1_ratio参数 。newton-cgsagsagalbfgs 在高维数据上更快,这是因为采用了热启动(warm-starting)。

参考资料

[5] Christopher M. Bishop: Pattern Recognition and Machine Learning, Chapter 4.3.4[6] Mark Schmidt, Nicolas Le Roux, and Francis Bach: Minimizing Finite Sums with the Stochastic Average Gradient.[7] Aaron Defazio, Francis Bach, Simon Lacoste-Julien: SAGA: A Fast Incremental Gradient Method With Support for Non-Strongly Convex Composite Objectives.[8]https://en.wikipedia.org/wiki/Broyden%E2%80%93Fletcher%E2%80%93Goldfarb%E2%80%93Shanno_algorithm[9] “Performance Evaluation of Lbfgs vs other solvers”

1.1.12. 随机梯度下降, SGD

随机梯度下降是拟合线性模型的一个简单而高效的方法。在样本量(和特征数)很大时尤为有用。 方法 partial_fit 可用于 online learning (在线学习)或基于 out-of-core learning (外存的学习)

SGDClassifierSGDRegressor 分别用于拟合分类问题和回归问题的线性模型,可使用不同的(凸)损失函数,支持不同的罚项。 例如,设定 loss="log" ,则 SGDClassifier 拟合一个逻辑斯蒂回归模型,而 loss="hinge" 拟合线性支持向量机(SVM)。

参考资料

随机梯度下降

1.1.13. Perceptron(感知器)

Perceptron 是适用于大规模学习的一种简单算法。默认情况下:

  • 不需要设置学习率(learning rate)。
  • 不需要正则化处理。
  • 仅使用错误样本更新模型。

最后一点表明使用合页损失(hinge loss)的感知机比 SGD 略快,所得模型更稀疏。

1.1.14. Passive Aggressive Algorithms(被动攻击算法)

被动攻击算法是大规模学习的一类算法。和感知机类似,它也不需要设置学习率,不过比感知机多出一个正则化参数 C

对于分类问题, PassiveAggressiveClassifier 可设定 loss='hinge' (PA-I)或 loss='squared_hinge'(PA-II)。对于回归问题, PassiveAggressiveRegressor 可设置 loss='epsilon_insensitive' (PA-I)或 loss='squared_epsilon_insensitive' (PA-II)。

参考资料

“Online Passive-Aggressive Algorithms” K. Crammer, O. Dekel, J. Keshat, S. Shalev-Shwartz, Y. Singer - JMLR 7 (2006)

1.1.15. 稳健回归(Robustness regression): 处理离群点(outliers)和模型错误

稳健回归(robust regression)特别适用于回归模型包含损坏数据(corrupt data)的情况,如离群点或模型中的错误。

1.1.15.1. 各种使用场景与相关概念

处理包含离群点的数据时牢记以下几点:

  • 离群值在 X 上还是在 y 方向上?离群值在 y 方向上离群值在 X 方向上
  • 离群点的比例 vs. 错误的量级(amplitude)离群点的数量很重要,离群程度也同样重要。低离群点的数量高离群点的数量

稳健拟合(robust fitting)的一个重要概念是崩溃点(breakdown point),即拟合模型(仍准确预测)所能承受的离群值最大比例。

注意,在高维数据条件下( n_features大),一般而言很难完成稳健拟合,很可能完全不起作用。

寻找平衡: 预测器的选择

Scikit-learn提供了三种稳健回归的预测器(estimator): RANSACTheil SenHuberRegressor

HuberRegressor 一般快于 RANSACTheil Sen ,除非样本数很大,即 n_samples >> n_features 。 这是因为 RANSACTheil Sen 都是基于数据的较小子集进行拟合。但使用默认参数时, Theil SenRANSAC 可能不如 HuberRegressor 鲁棒。

RANSACTheil Sen 更快,在样本数量上的伸缩性(适应性)更好。RANSAC 能更好地处理y方向的大值离群点(通常情况下)。Theil Sen 能更好地处理x方向中等大小的离群点,但在高维情况下无法保证这一特点。 实在决定不了的话,请使用 RANSAC

1.1.15.2. RANSAC: 随机抽样一致性算法(RANdom SAmple Consensus)

随机抽样一致性算法(RANdom SAmple Consensus, RANSAC)利用全体数据中局内点(inliers)的一个随机子集拟合模型。

RANSAC 是一种非确定性算法,以一定概率输出一个可能的合理结果,依赖于迭代次数(参数 max_trials)。这种算法主要解决线性或非线性回归问题,在计算机视觉摄影测绘领域尤为流行。

算法从全体样本输入中分出一个局内点集合,全体样本可能由于测量错误或对数据的假设错误而含有噪点、离群点。最终的模型仅从这个局内点集合中得出。

1.1.15.2.1. 算法细节

每轮迭代执行以下步骤:

  1. 从原始数据中抽样 min_samples 数量的随机样本,检查数据是否合法(见 is_data_valid )。
  2. 用一个随机子集拟合模型( base_estimator.fit )。检查模型是否合法(见 is_model_valid )。
  3. 计算预测模型的残差(residual),将全体数据分成局内点和离群点( base_estimator.predict(X) - y)。绝对残差小于 residual_threshold 的全体数据认为是局内点。
  4. 若局内点样本数最大,保存当前模型为最佳模型。以免当前模型离群点数量恰好相等(而出现未定义情况),规定仅当数值大于当前最值时认为是最佳模型。

上述步骤或者迭代到最大次数( max_trials ),或者某些终止条件满足时停下(见 stop_n_inliersstop_score )。最终模型由之前确定的最佳模型的局内点样本(一致性集合,consensus set)预测。

函数 is_data_validis_model_valid 可以识别出随机样本子集中的退化组合(degenerate combinations)并予以丢弃(reject)。即便不需要考虑退化情况,也会使用 is_data_valid ,因为在拟合模型之前调用它能得到更高的计算性能。

示例

基于RANSAC的稳健线性模型估计稳健线性估计拟合

参考资料

https://en.wikipedia.org/wiki/RANSAC“Random Sample Consensus: A Paradigm for Model Fitting with Applications to Image Analysis and Automated Cartography” Martin A. Fischler and Robert C. Bolles - SRI International (1981)“Performance Evaluation of RANSAC Family” Sunglok Choi, Taemin Kim and Wonpil Yu - BMVC (2009)

1.1.15.3. Theil-Sen 预估器: 广义中值估计器(generalized-median-based estimator)

TheilSenRegressor 估计器:使用中位数在多个维度泛化,对多元异常值更具有鲁棒性,但问题是,随着维数的增加,估计器的准确性在迅速下降。准确性的丢失,导致在高维上的估计值比不上普通的最小二乘法。

示例:

广义中值估计器回归稳健线性估计拟合

参考资料:

https://en.wikipedia.org/wiki/Theil%E2%80%93Sen_estimator

1.1.15.3.1. 算法理论细节

TheilSenRegressor 在渐近效率和无偏估计方面足以媲美 Ordinary Least Squares (OLS) (普通最小二乘法(OLS))。与 OLS 不同的是, Theil-Sen 是一种非参数方法,这意味着它没有对底层数据的分布假设。由于 Theil-Sen 是基于中值的估计,它更适合于损坏的数据即离群值。 在单变量的设置中,Theil-Sen 在简单的线性回归的情况下,其崩溃点大约 29.3% ,这意味着它可以容忍任意损坏的数据高达 29.3% 。

scikit-learn 中实现的 TheilSenRegressor 是多元线性回归模型的推广 [8] ,利用了空间中值方法,它是多维中值的推广 [9]

关于时间复杂度和空间复杂度,Theil-Sen 的尺度根据

这使得它不适用于大量样本和特征的问题。因此,可以选择一个亚群的大小来限制时间和空间复杂度,只考虑所有可能组合的随机子集。

示例:

广义中值估计器回归

参考资料:

[10] Xin Dang, Hanxiang Peng, Xueqin Wang and Heping Zhang: Theil-Sen Estimators in a Multiple Linear Regression Model. |[11] K?rkk?inen and S. ?yr?m?: On Computation of Spatial Median for Robust Data Mining.

1.1.15.4. Huber 回归

HuberRegressorRidge 不同,因为它对于被分为异常值的样本应用了一个线性损失。如果这个样品的绝对误差小于某一阈值,样品就被分为内围值。 它不同于 TheilSenRegressorRANSACRegressor ,因为它没有忽略异常值的影响,并分配给它们较小的权重。

这个 HuberRegressor 最小化的损失函数是:

其中

建议设置参数 epsilon 为 1.35 以实现 95% 统计效率。

1.1.15.5. 注意

HuberRegressor 与将损失设置为 huberSGDRegressor 并不相同,体现在以下方面的使用方式上。

  • HuberRegressor 是标度不变性的. 一旦设置了 epsilon , 通过不同的值向上或向下缩放 Xy ,就会跟以前一样对异常值产生同样的鲁棒性。相比 SGDRegressor 其中 epsilonXy 被缩放的时候必须再次设置。
  • HuberRegressor 应该更有效地使用在小样本数据,同时 SGDRegressor 需要一些训练数据的 passes 来产生一致的鲁棒性。

示例:

异常数据集上的huberregression与 Ridge

参考资料:

Peter J. Huber, Elvezio M. Ronchetti: Robust Statistics, Concomitant scale estimates, pg 172

另外,这个估计是不同于 R 实现的 Robust Regression (http://www.ats.ucla.edu/stat/r/dae/rreg.htm) ,因为 R 实现加权最小二乘,权重考虑到每个样本并基于残差大于某一阈值的量。

1.1.16. 多项式回归:用基函数展开线性模型

机器学习中一种常见的模式,是使用线性模型训练数据的非线性函数。这种方法保持了一般快速的线性方法的性能,同时允许它们适应更广泛的数据范围。

例如,可以通过构造系数的 polynomial features 来扩展一个简单的线性回归。在标准线性回归的情况下,你可能有一个类似于二维数据的模型:

如果我们想把抛物面拟合成数据而不是平面,我们可以结合二阶多项式的特征,使模型看起来像这样:

观察到这 还是一个线性模型 (这有时候是令人惊讶的): 看到这个,想象创造一个新的变量

有了这些重新标记的数据,我们可以将问题写成

我们看到,所得的 polynomial regression 与我们上文所述线性模型是同一类(即关于

是线性的),因此可以用同样的方法解决。通过用这些基函数建立的高维空间中的线性拟合,该模型具有灵活性,可以适应更广泛的数据范围。

这里是一个示例,使用不同程度的多项式特征将这个想法应用于一维数据:

这个图是使用 PolynomialFeatures 预创建。该预处理器将输入数据矩阵转换为给定度的新数据矩阵。使用方法如下:

>>> from sklearn.preprocessing import PolynomialFeatures
>>> import numpy as np
>>> X = np.arange(6).reshape(3, 2)
>>> X
array([[0, 1],
 [2, 3],
 [4, 5]])
>>> poly = PolynomialFeatures(degree=2)
>>> poly.fit_transform(X)
array([[  1.,   0.,   1.,   0.,   0.,   1.],
 [  1.,   2.,   3.,   4.,   6.,   9.],
 [  1.,   4.,   5.,  16.,  20.,  25.]])Copy

X 的特征已经从

转换到

, 并且现在可以用在任何线性模型。

这种预处理可以通过 Pipeline 工具进行简化。可以创建一个表示简单多项式回归的单个对象,使用方法如下所示:

>>> from sklearn.preprocessing import PolynomialFeatures
>>> from sklearn.linear_model import LinearRegression
>>> from sklearn.pipeline import Pipeline
>>> import numpy as np
>>> model = Pipeline([('poly', PolynomialFeatures(degree=3)),
...                   ('linear', LinearRegression(fit_intercept=False))])
>>> # fit to an order-3 polynomial data
>>> x = np.arange(5)
>>> y = 3 - 2 * x + x ** 2 - x ** 3
>>> model = model.fit(x[:, np.newaxis], y)
>>> model.named_steps['linear'].coef_
array([ 3., -2.,  1., -1.])Copy

利用多项式特征训练的线性模型能够准确地恢复输入多项式系数。

在某些情况下,没有必要包含任何单个特征的更高的幂,只需要相乘最多

个不同的特征即可,所谓 interaction features(交互特征) 。这些可通过设定 PolynomialFeaturesinteraction_only=True 得到。

例如,当处理布尔属性,对于所有

,因此是无用的;但

代表两布尔结合。这样我们就可以用线性分类器解决异或问题:

>>> from sklearn.linear_model import Perceptron
>>> from sklearn.preprocessing import PolynomialFeatures
>>> import numpy as np
>>> X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
>>> y = X[:, 0] ^ X[:, 1]
>>> y
array([0, 1, 1, 0])
>>> X = PolynomialFeatures(interaction_only=True).fit_transform(X).astype(int)
>>> X
array([[1, 0, 0, 0],
 [1, 0, 1, 0],
 [1, 1, 0, 0],
 [1, 1, 1, 1]])
>>> clf = Perceptron(fit_intercept=False, max_iter=10, tol=None,
...                  shuffle=False).fit(X, y)Copy

分类器的 “predictions” 是完美的:

>>> clf.predict(X)
array([0, 1, 1, 0])
>>> clf.score(X, y)
1.0Copy



一直在努力!


最后,小编想说:我是一名python开发工程师,

整理了一套最新的python系统学习教程,

想要这些资料的可以关注私信小编“1或者6”即可(免费分享哦)希望能对你有所帮助.

相关推荐

Java 泛型大揭秘:类型参数、通配符与最佳实践

引言在编程世界中,代码的可重用性和可维护性是至关重要的。为了实现这些目标,Java5引入了一种名为泛型(Generics)的强大功能。本文将详细介绍Java泛型的概念、优势和局限性,以及如何在...

K8s 的标签与选择器:流畅运维的秘诀

在Kubernetes的世界里,**标签(Label)和选择器(Selector)**并不是最炫酷的技术,但却是贯穿整个集群管理与运维流程的核心机制。正是它们让复杂的资源调度、查询、自动化运维变得...

哈希Hash算法:原理、应用(哈希算法 知乎)

原作者:Linux教程,原文地址:「链接」什么是哈希算法?哈希算法(HashAlgorithm),又称为散列算法或杂凑算法,是一种将任意长度的数据输入转换为固定长度输出值的数学函数。其输出结果通常被...

C#学习:基于LLM的简历评估程序(c# 简历)

前言在pocketflow的例子中看到了一个基于LLM的简历评估程序的例子,感觉还挺好玩的,为了练习一下C#,我最近使用C#重写了一个。准备不同的简历:image-20250528183949844查...

55顺位,砍41+14+3!季后赛也成得分王,难道他也是一名球星?

雷霆队最不可思议的新星:一个55号秀的疯狂逆袭!你是不是也觉得NBA最底层的55号秀,就只能当饮水机管理员?今年的55号秀阿龙·威金斯恐怕要打破你的认知了!常规赛阶段,这位二轮秀就像开了窍的天才,直接...

5分钟读懂C#字典对象(c# 字典获取值)

什么是字典对象在C#中,使用Dictionary类来管理由键值对组成的集合,这类集合被称为字典。字典最大的特点就是能够根据键来快速查找集合中的值,其键的定义不能重复,具有唯一性,相当于数组索引值,字典...

c#窗体传值(c# 跨窗体传递数据)

在WinForm编程中我们经常需要进行俩个窗体间的传值。下面我给出了两种方法,来实现传值一、在输入数据的界面中定义一个属性,供接受数据的窗体使用1、子窗体usingSystem;usingSyst...

C#入门篇章—委托(c#委托的理解)

C#委托1.委托的定义和使用委托的作用:如果要把方法作为函数来进行传递的话,就要用到委托。委托是一个类型,这个类型可以赋值一个方法的引用。C#的委托通过delegate关键字来声明。声明委托的...

C#.NET in、out、ref详解(c#.net framework)

简介在C#中,in、ref和out是用于修改方法参数传递方式的关键字,它们决定了参数是按值传递还是按引用传递,以及参数是否必须在传递前初始化。基本语义对比修饰符传递方式可读写性必须初始化调用...

C#广义表(广义表headtail)

在C#中,广义表(GeneralizedList)是一种特殊的数据结构,它是线性表的推广。广义表可以包含单个元素(称为原子),也可以包含另一个广义表(称为子表)。以下是一个简单的C#广义表示例代...

「C#.NET 拾遗补漏」04:你必须知道的反射

阅读本文大概需要3分钟。通常,反射用于动态获取对象的类型、属性和方法等信息。今天带你玩转反射,来汇总一下反射的各种常见操作,捡漏看看有没有你不知道的。获取类型的成员Type类的GetMembe...

C#启动外部程序的问题(c#怎么启动)

IT&OT的深度融合是智能制造的基石。本公众号将聚焦于PLC编程与上位机开发。除理论知识外,也会结合我们团队在开发过程中遇到的具体问题介绍一些项目经验。在使用C#开发上位机时,有时会需要启动外部的一些...

全网最狠C#面试拷问:这20道题没答出来,别说你懂.NET!

在竞争激烈的C#开发岗位求职过程中,面试是必经的一道关卡。而一场高质量的面试,不仅能筛选出真正掌握C#和.NET技术精髓的人才,也能让求职者对自身技术水平有更清晰的认知。今天,就为大家精心准备了20道...

C#匿名方法(c#匿名方法与匿名类)

C#中的匿名方法是一种没有名称只有主体的方法,它提供了一种传递代码块作为委托参数的技术。以下是关于C#匿名方法的一些重要特点和用法:特点省略参数列表:使用匿名方法可省略参数列表,这意味着匿名方法...

C# Windows窗体(.Net Framework)知识总结

Windows窗体可大致分为Form窗体和MDI窗体,Form窗体没什么好细说的,知识点总结都在思维导图里面了,下文将围绕MDI窗体来讲述。MDI(MultipleDocumentInterfac...