sklearn文档 — 1.5. 随机梯度下降

简单粗暴理解与实现机器学习线性回归(六):线性回归api再介绍——sklearn.linear_model.LinearRegression(fit_intercept=True) 线性回归 文章目录线性回归学习目标2.6 线性回归api再介绍 学习目标 掌握线性回归的实现过程 应用LinearRegression或SGDRegressor实现回归预测 知道回归算法的评估标准及其公式 知道过拟合与欠拟合的原因以及解决方法 知道岭回归的原理及与线性回归的不同之处 应用Ridge实现回归预测 应用joblib实现模型的保存与加载 2.6 线性回归api再介绍 sklearn... 阅读详情

随机梯度下降(SGD) 是一个既有效又简单的方法去用于在诸如(线性)支持向量机 和 Logistic回归中,"凸"代价函数下的线性分类器的辨别学习。尽管 SGD 已经在机器学习社区存在了很长一段时间了,但是在最近的大规模学习的浪潮下它还是得到了很多人的关注。

SGD 已经很成功的应用在了大规模下和稀疏机器学习问题上,主要是用于进行文本分类和自然语言处理。对给定一个稀疏的数据,(Sklearn)中的分类器能够很容易的扩展为能够处理超过10^5个训练样本和超过10^5个特征的问题。

SGD 的优点有:

  • 极其效率。
  • 易于实施(有大量调整代码的余地)。

但是其缺点有:

  • 需要许多超参数,例如正则化参数和迭代次数。
  • 对数据缩放很敏感。

1.5.1. 分类

注意:请确保在每次拟合模型之前都对数据进行重新排序,不然则设置 shuffle=True 使得在每次迭代中都会重排数据。

类 SGDClassifier 实现了一个常规的朴素梯度下降学习,其对分类问题支持许多不同的代价函数和惩罚项。


一个SGD分类的实例

跟其他分类器一样,SGD 同样需要拟合两个数组:一个保存着训练样本,尺寸为 [n_samples, n_features] 的数组 X 和一个保存着结果标签,尺寸为 [n_samples] 的数组 y :

>>> from sklearn.linear_model import SGDClassifier
>>> X = [[0., 0.], [1., 1.]]
>>> y = [0, 1]
>>> clf = SGDClassifier(loss="hinge", penalty="l2")
>>> clf.fit(X, y)
SGDClassifier(alpha=0.0001, average=False, class_weight=None, epsilon=0.1,
       eta0=0.0, fit_intercept=True, l1_ratio=0.15,
       learning_rate='optimal', loss='hinge', n_iter=5, n_jobs=1,
       penalty='l2', power_t=0.5, random_state=None, shuffle=True,
       verbose=0, warm_start=False)

在拟合之后,这个模型就可以用来预测了:

>>> clf.predict([[2., 2.]])
array([1])

SGD 使用训练集拟合了一个线性模型,其成员 coef_ 保存着模型参数:

>>> clf.coef_                                         
array([[ 9.9...,  9.9...]])

然后成员 intercept_ 保存着截距(也称为偏移值或偏差)

>>> clf.intercept_                                    
array([-9.9...])

不用关心模型是不是用了截距,其超平面截距,都是由 fit_intercept 参数控制。

可以通过 SGDClassifier.decision_function 来获得超平面的带符号距离:

>>> clf.decision_function([[2., 2.]])                 
array([ 29.6...])

可以通过 loss 参数来选择具体是要使用哪个代价函数。SGDClassifier 支持以下几种代价函数:

  • loss="hinge": (软边际) 线性支持向量机,
  • loss="modified_huber": 平滑的 hinge 代价函数,
  • loss="log": logistic回归,
  • 和下方"回归"一节中的代价函数.

前面两种代价函数是懒惰的,他们只在样本违反了边际的约束(即出现意外值时)才会更新模型参数,也因为如此在训练的时候很执行效率很高,但也同样会使得产生出不同稀疏模型,即便是使用了L2惩罚项。

设置 loss="log" 或 loss="modified_huber" 来启用 predict_proba 函数,这个函数对于每个样本 x 都会给出估计概率( P(y | x) )矩阵。

>>> clf = SGDClassifier(loss="log").fit(X, y)
>>> clf.predict_proba([[1., 1.]])                      
array([[ 0.00...,  0.99...]])

可以通过 penalty 参数来选择需要使用哪种惩罚项,SGD 支持下列几种:

  • penalty="l2": 使用L2范数对 coef_ 进行惩罚。
  • penalty="l1": 使用L1范数对 coef_ 进行惩罚。
  • penalty="elasticnet": 使用L2和L1的凸组合: (1 - l1_ratio) * L2 + l1_ratio * L1 对 coef_ 进行惩罚。

SGD 的默认惩罚项是 penalty="l2" ,使用L1惩罚项会生成出一个大多数系数为零的稀疏模型。若使用弹性网络则会解决一些L1惩罚在高度相关属性中存在的缺陷。参数 l1_ratio 控制着L2与L2惩罚项的凸组合。

SGDClassifier 能够在“一对多” (OVA)方案下,通过组合多个二元分类器来进行多类分类。对于每一个K类,二元分类器会比较其与 K-1 类的区别进行学习。在测试阶段,我们为每一个分类器计算其置信度(即到超平面的带符号距离),然后选择具有高置信度的类。下方的图表表现了OVA在鸢尾花数据集中的表现。虚线代表着三种OVA分类器;背景颜色则表现了这三个分类器的决策边界。


三种OVA分类器在iris数据集的表现

在多类分类情况,coef_ 是一个形状为 [n_classes, n_features] 的二维数组,然后 intercept_ 是一个形状为 [n_classes] 的一维数组。然后对第 i 行的 coef_ 而言,其保存着第 i 类的分类器的权重向量。然后类是按升序来索引的(可以查看 classes_ 属性)。但要注意的是,因为在原则上这个多类分类器是允许创建出一个概率模型的,所以最好设置代价函数为 loss="log" 或 loss="modified_huber" ,这样做比使用默认的代价函数要更适合这个一对多分类。

SGDClassifier 能通过 fit 参数 class_weight 和 sample_weight 支持权重类和权重实例。要了解更多的内容可以查看下面的例子或是这个类的说明文档 SGDClassifier.fit。

示例

SGDClassifier 支持平均SGD(ASGD)。可以通过设置 average=True 来开启平均化。ASGD的工作原理是通过在每个样本的迭代中,分别平均化其平面SGD的系数。当使用ASGD时,学习率可能会变得很大(耗时下降),甚至会不断地导致一些数据集在训练的耗时减少。

对于使用 logistic 代价函数的分类,另一种 SGD 的变体是在随机平均梯度(SAG)算法中启用平均化策略,其包含在 LogisticRegression 中,同样可以作为一个求解器使用。

1.5.2. 回归

SGDRegressor 类实现了一个常规的朴素梯度下降学习,其支持对拟合线性模型设置许多不同的代价函数和惩罚项。SGDRegressor 是一个适合用来对有大量训练样本(> 10,000)回归问题,若是对其他回归问题,则建议使用Ridge,Lasso,或 ElasticNet。

可以通过 loss 参数来选择具体是要使用哪个代价函数。SGDRegressor 支持以下几种代价函数:

  • loss="squared_loss":最小二乘法。
  • loss="huber":稳健回归中的Huber损失。
  • loss="epsilon_insensitive":线性支持向量回归。

huber 和 epsilon_insensitive 代价函数都是能够在稳健回归中使用的。不敏感区的宽度只能通过 epsilon 参数来设置,并且这个参数取决于目标变量的规模。

SGDRegressor 类似 SGDClassifier,都是支持平均 SGD的。

对带有平方损失和L2惩罚项的回归来说,另一种SGD的可选方案是使用随机平均梯度(SAG)算法,其包含在 Ridge,同样能够单独作为求解器来使用。

1.5.3. 对稀疏数据使用随机梯度下降

注意:因为在截距上收缩了学习速率,所以稀疏实现与密集实现的结果会有所不同。

对符合格式要求的任意稀疏矩阵都在 scipy.sparse 中存在内置支持。但是如果要追求最大效率的话,可以使用 scipy.sparse.csr_matrix 内所定义CSR矩阵格式。

示例

1.5.4. 复杂度

SGD的主要优点就在于其执行效率,根据训练样本的数量基本上是呈线性的。如果 X 是一个尺寸为 (n, p) 的矩阵,根据代价函数 O(k·n·p) 进行训练,其中 k 是迭代数量,而 p 则是每个样本非零属性的平均值。

但是近期的研究结果显示,获得期望的最优准确度所需的时间并不是随着训练集大小的增加而增加。

1.5.5. 实用技巧

  • SGD对特征缩放很敏感,所以在这里高度建议对数据进行缩放。举例来说,对输入向量 X 的每个特征缩放为值域是[0, 1]或[-1, +1],又或者是将其标准化为均值为0,方差为1的值域。当然也要对测试集做相同的缩放操作。
    这些操作可以使用 StandardScaler 来简单的完成:
    from sklearn.preprocessing import StandardScaler
    scaler = StandardScaler()
    scaler.fit(X_train)  # Don't cheat - fit only on training data
    X_train = scaler.transform(X_train)
    X_test = scaler.transform(X_test)  # apply same transformation to test data
    如果你的参数存在内在尺度(例如单词出现频率或指标特征),那么就不应该对其进行缩放。
  • 使用 GridSearchCV 来寻找一个合理的 α 项,通常限制的范围是 10.0**-np.arrage(1, 7)。
  • 通常来说,当我们观察了大约的训练结果后(观察学习曲线或模型图)就会认为SGD已经收敛了。
    以数量为10^6的训练样本为例,鉴于此一个对迭代数量的初步合理的猜想是 n_iter = np.ceil(10**6 / n) ,其中 n 是训练集的数量。
  • 如果你讲SGD应用在使用PCA提取出的特征上,一般的建议是通过寻找某个常数 c 来缩放特征,使得训练数据的平均L2范数等于1。
  • 平均SGD(ASGD)最适合应用在有超大数量的特征与很高的 eta0 的样本上。

引用

1.5.6. 数学公式

给定一个训练集(x1, y1),...,(xn, yn),其中 xi ∈ R^n , yi ∈ {-1, 1} 。我们的目标是在使用模型参数 ω ∈ R^m 和截距 b ∈ R 的情况下,学习线性评分函数 f(x) = ω^T·x + b 。为了做出预测,我们简单的将这个函数用 f(x) 来代替。然后通常是使用最小化正规训练误差来找到适合的模型参数(ω 和 b)。


最小化代价函数

其中 L 是测量模型(mis)拟合用的代价函数, R 是惩罚模型复杂性的正则化项(也成为惩罚项)。α > 0 是一个非负超参数。

对不同的分类使用不同的 L ,例如:

  • Hinge:(软边界) 支持向量机。
  • Log:Logistic回归。
  • Least-Squares:岭回归。
  • Epsilon-Insensitive:(软边界)支持向量回归。

上述的损失函数都可以被认为是误分类误差(0-1)的上限,即下图所示:


损失函数图

常用的正则项 R 有:


  • L2范数

  • L1范数,产生稀疏结果

  • 弹性网络,L2与L1的凸组合,其中 p 由 1 - l1_ratio 得出

下面的图显示了在 R(ω) = 1 的情况下,使用各种正规化后函数的轮廓:


三种正规化的轮廓

1.5.6.1. SGD

随机梯度下降是无约束最优化问题的一种优化方式。比较与(批)梯度下降,SGD的方式是分别考虑单个样本来逼近 E(ω, b) 的真实梯度。

SGDClassifier 实现了一个一阶SGD学习。这个算法迭代训练样本并对每一个样本根据下面的公式来更新模型参数:


ω参数

其中 n 是控制着步进的学习速率。截距 b 也是以类似的方式更新,除了不需要正则化。

学习速率 n 可以是一个恒定值或是衰减值。对分类问题而言,默认的学习速率(learning_rate='optimal')是通过下面的公式给出:


分类的学习速率公式

上式的 t 是间隔时间(此处是 n_samples * n_iter 的总和),而t0是基于Léon Bottou提出的启发式来确定的,默认是跟权重的初始值一致(这是在假设训练样本的范数是近似为1的情况下)。关于这个的确切定义可以在 BaseSGD 的 _init_t 中找到。

对回归问题而言,默认的学习速率(learning_rate='invscaling')是通过下面的公式给出:


回归的学习速率公式

其中 eta0 和 power_t 是通过用户在 eta0 和 power_t 输入的超参数。

如果要使用恒定的学习速率则设置 learning_rate='constant' ,固定值则是设置 eta0 了。

可以通过 coef_ 和 intercept_ 来访问模型参数:

  • coef_成员保存着权重 ω 。
  • intercept_成员保存着 b 。

引用

1.5.7. 实现细节

SGD的实现受Léon Bottou的 随机梯度SVM 影响。与SvmSGD相似,权重向量代表着标量和向量的乘积,而这允许在L2正则化下能够有效地对权重进行更新。在稀疏特征向量的情况下,截距是参照更小的学习速率(更新频率为 学习速率乘以0.01)来更新的,而这说明了会很频繁的对截距进行更新。训练样本被顺序挑出,并且在"观察"每个样本后就将降低学习速率。在该类中我们是采用了Shalev-Shwartz 等人在2007年所提出的学习速率。对于多类分类问题则是采用了"一对多"。然后再正则化方面则是采用了由 Tsuruoka 等人在2009年提出的裁断梯度算法来为L1正则化(弹性网络也包括在内)。最后则是使用了Cython来进行代码实现。

引用



作者:HabileBadger
链接:http://www.jianshu.com/p/28a68bb4a45a
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
scikit-learn (sklearn) 官方文档中文版 scikit-learn (sklearn) 官方文档中文版 https://sklearn.apachecn.org/docs/0.21.3/ scikit-learn 是基于 Python 语言的机器学习工具 简单高效的数据挖掘和数据分析工具 可供大家在各种环境中重复使用 建立在 NumPy ,SciPy 和 matplotlib 上 开源,可商业使用 - BSD许可证 维护地址 ... 阅读详情

相关推荐

Large Scale Learning to Rank

Large Scale Learning to Rank,谷歌的论文

【sklearn | 5】:集成学习与模型解释

通过本篇专题教程,我们学习了 sklearn 中的集成学习和模型解释。集成学习包括袋装法、提升法和堆叠法,模型解释涵盖了特征重要性分析、部分依赖图和 SHAP 值。这些技术和方法可以帮助你构建更强大的模型,并更好地理解模型的行为,从而提高模型的可信度和可解释性。希望这些知识能在你的实际项目中有所帮助。

颜淡慕潇 1万+

Regularization and variable selection via the elastic net.pdf

Regularization and variable selection via the elastic net.pdf

正则;Regularization and variable selection via the elastic net;高斯分布与L2正则;MLE-MAP-贝叶斯估计

Regularization and variable selection via the elastic net: https://web.stanford.edu/~hastie/Papers/B67.2%20%282005%29%20301-320%20Zou%20&%20Hastie.pdf 高斯分布与L2正则: http://qwone.com/~jason/writing/l2gaussian.pdf MLE;MAP;贝叶斯估计: https://zhuanlan.zhihu.com/p

weixin_42375099的博客 668

高效敏感词检测API平台对比与选型指南

本文为开发者提供了高效敏感词检测API平台的选型指南。文章对比了专业API平台、头部云厂商、新兴AI服务商及开源方案,从检测能力、集成易用性、成本、稳定性及扩展性五大维度进行分析,并给出实战选型建议,帮助团队根据业务场景快速选择最合适的敏感词检测服务。

weixin_29325955的博客 347

Android15 AndroidV冻结和解冻的场景

cgroup 最初由 Google 工程师 Paul Menage 和 Rohit Seth 在 2006 年提出,是一种细粒度资源控制的Linux内核机制。于 2007 年合并到 Linux 内核主线中。然而 Google 原生系统直到 Android 11 或更高版本上才支持 CACHE 应用的 CPU 冻结功能。当应用切换到后台并且没有其他活动时,系统会在一定时间内通过状态判断,将进程 ID 迁移到冻结的 cgroup 节点上,实现冻结 CACHE 应用。

苏法迪的专栏 1787

sklearn-learn的安装

【代码】sklearn-learn的安装。

MayYou_SSS的博客 429

保姆级避坑指南:用Livox官方工具搞定Mid-360多雷达自动标定(附源码Bug修复)

本文详细解析了使用Livox官方工具进行Mid-360多雷达自动标定的全流程,包括环境搭建、工具链配置、关键Bug修复及数据采集最佳实践。重点解决了PointCloudMapper.cpp边界检查缺失和calibration.cpp点云显示问题,提供了实用的代码修复方案和标定质量评估指标,帮助开发者高效完成激光雷达标定任务。

weixin_29053695的博客 281

Sklearn官方文档中文整理4——随机梯度下降和最近邻篇

Sklearn官方文档中文整理4——随机梯度下降和最近邻篇1. 监督学习1.5. 随机梯度下降1.5.1. 分类【linear_model.SGDClassifier】1.5.2. 回归【linear_model.SGDRegressor】1.5.3. 稀疏数据的随机梯度下降1.5.4. 复杂度1.5.5. 停止判据1.5.6. 实用小贴士1.5.7. 数学描述1.5.7.1. SGD1.5.8. 实现细节1.6. 最近邻1.6.1. 无监督最近邻【neighbors.NearestNeighbors】1.

qq_42946328的博客 714

IoT 平台架构全景图:从设备到 AI 的完整技术体系深度解析

随着物联网设备规模进入百万级时代,IoT 平台架构已经从简单的设备接入系统演变为完整的数据平台。本文从系统架构师视角,深度解析 IoT 平台的完整技术体系,包括设备接入、MQTT 通信、消息流平台、数据平台与 AI 决策系统,并结合主流云平台实践,构建从设备到 AI 的完整 AIoT 架构认知。

moton2017的博客 856

AI大模型开发——transformer模型超全完整版(0基础可懂)

为了更深入的了解transformer模型,我们首先从transformer的诞生聊起吧。transformer在2017年由Vaswani等人首次提出,它摒弃了之前流行的循环神经网络和卷积神经网络的架构,引入了自注意力机制( Self-Attention),显著提高了处理序列数据的能力和效率。transformer模型的这种设计使其在处理长距离依赖问题时, 相比于传统的循环神经网络和长短期记忆网络(LSTM)表现得更加出色,至此, 开启了NLP技术的新篇章。

m0_74922316的博客 2120

《机器学习算法2 ---SGDClassifer随机梯度下降分类器》

SGDClassifer 简单的整理了一下,后面会有补充,欢迎指正~ 一 原理 我们都知道随机梯度下降是一个最优化算法,在很多算法中用它来找到最优参数。而随机梯度下降分类器就是那些使用了该方法来求解的线性分类器的集合,其中包括SVM, LR等。 二 实现 sklearn from sklearn.linear_model import SGDClassifier clf = SGDClassifier(loss="hinge", penalty="l2") clf.fit(X, y) clf.predi

weixin_41040479的博客 1695

DICOM标准:DICOM医学影像中的覆盖层(Overlay)概念详解

DICOM标准:深入详解DICOM医学影像中的覆盖层(Overlay)

编程技术探索者,分享C/C++、C#、Java、数据库等开发经验,聚焦实战技巧与AI兴趣,助力编程爱好者成长。 1562

Sklearn官方文档中文整理1——监督学习之广义线性模型篇

Sklearn官方文档中文整理1. 监督学习1.1 线性模型Linear Models1.1.1 普通最小二乘法Ordinary Least Squares1.1.2. 岭回归和分类Ridge regression and classification1.1.2.1. 回归Regression1.1.2.2. 分类Classification1.1.2.3. 设置正则化参数:广义交叉验证1.1.3. Lasso 1. 监督学习 1.1 线性模型Linear Models 1.1.1 普通最小二乘法Ordi

qq_42946328的博客 1102

cartographer运行错误集合

播放bag的时候错误 Check failed: sensor_to_tracking->translation().norm() < 1e-5 The IMU frame must be colocated with the tracking frame. Transforming linear acceleration into the tracking frame will otherwise be imprecise tracking frame不是imu的link 修改lua文件中的.

Studying…… 2025

节省人力成本40%!仓储物流AI机器人调度系统实战案例(含路径规划算法与系统架构图)

首先,我们需要定义一个Node类self.x = x # 节点x坐标self.y = y # 节点y坐标self.g = g # 从起点到当前节点的实际成本(g值)self.h = h # 从当前节点到终点的启发式成本(h值)self.f = g + h # 总成本(f值)self.parent = None # 父节点(用于回溯路径)self.task_id = task_id # 任务IDself.priority = priority # 任务优先级(1=最高,5=最低)

小程序开发 950

随机梯度下降_梯度下降法有什么用?

文章来源:林骥作者:林骥机器学习系列文章1、如何用人工智能算出美不美?2、如何用人工智能预测双 11 的交易额?3、如何评价算法的好坏?4、模型越复杂越好吗?引言我写人工智能系列文章,主要侧重于 3 个方面:(1)说明算法的适用范围,介绍在什么情况下,可以使用什么算法,解决什么问题;(2)多用数据案例进行演示,与日常工作和生活相关联,以便提高学习的兴趣,加深对算法的理解;(3)包含算法的...

weixin_39678525的博客 758

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

梯度算法之批量梯度下降,随机梯度下降和小批量梯度下降

在机器学习领域,体梯度下降算法分为三种 - 批量梯度下降算法(BGD,Batch gradient descent algorithm) - 随机梯度下降算法(SGD,Stochastic gradient descent algorithm) - 小批量梯度下降算法(MBGD,Mini-batch gradient descent algorithm)

Thinkgamer博客 4925

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Sklearn 0.21 中文文档校对活动 | ApacheCN

整体进度:https://github.com/apachecn/sklearn-doc-zh/issues/352 贡献指南:https://github.com/apachecn/sklearn-doc-zh/blob/master/CONTRIBUTING.md 项目仓库:https://github.com/apachecn/sklearn-doc-zh 贡献指南 请您勇敢地去翻译和改...

龙哥盟 3万+

【Scikit-Learn 中文文档】随机梯度下降 - 监督学习 - 用户指南 | ApacheCN

scikit-learn(sklearn)0.19 版本中文文档

ApacheCN-Xy 396

sklearn神经网络模块用法介绍

最近想着在天池上做一些简单的比赛,发现大家都用的sklearn的库来写机器学习算法。最近正在使用一个神经网络,在此翻译了一下sklearn的文档做了一下总结 总模块 神经网络在sklearn.neural_network中存放,有三个类。 neural_network.BernoulliRBM([n_components, …]) 伯努利受限玻尔兹曼机(RBM) neural_network.ML...

CloudCver 1万+

sklearn学习

sklearn是机器学习领域中最知名的python模块之一,若要学习机器学习与人工智能,必绕不开sklearn,网上有很多关于sklearn的学习教程,但最好的教程就是官方文档(http://scikit-learn.org/stable/),其中sklearn库官方文档结构中有很多模块: Install:安装指导,不同版本安装包,包依赖的版本。 User Guide(用户指南):这里对每一个算法有详细的介绍 API:这里是库调用的方法 Examples:是一个官方教程,可以快速上手教程,里面有很多d

william118的专栏 433

sklearn监督学习笔记

一、支持向量机 (SVMs) 可用于以下监督学习算法 分类, 回归 和 异常检测. 支持向量机的优势在于: 在高维空间中非常高效. 即使在数据维度比样本数量大的情况下仍然有效. 在决策函数(称为支持向量)中使用训练集的子集,因此它也是高效利用内存的. 通用性: 不同的核函数 核函数 与特定的决策函数一一对应.常见的 kernel 已经提供,也可以指定定制的内核. ...

qq_42988748的博客 413

【Scikit-Learn 中文文档】7 随机梯度下降 - 监督学习 - 用户指南 | ApacheCN

中文文档: http://sklearn.apachecn.org/cn/0.19.0/modules/sgd.html 英文文档: http://sklearn.apachecn.org/en/0.19.0/modules/sgd.html 官方文档: http://scikit-learn.org/0.19/ GitHub: https://github.com/apac

与其临渊羡鱼 不如退而结网 320
上一篇: sklearn文档 — 1.4. 支持向量机
下一篇: sklearn文档 — 1.6. 最近邻
quliulangle
博客等级 码龄14年 15粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值