机器学习入门篇(一)

一、什么是机器学习?

机器学习是从数据中自动分析获得模型,并利用模型对未知数据进行预测。

在这里插入图片描述

数据集:特征值 + 目标值

1.1 机器学习算法分类

  • 监督学习:
    目标值:类别 – 分类问题
    目标值:连续性的数据 – 回归问题

  • 无监督学习:
    目标值:无

  • 监督学习(supervised learning)
    定义:输入数据是由输入特征值目标值所组成。函数的输出可以是一个连续的值(称为回归),或是输出是有限个离散值(称作分类
    分类:k-近邻算法、贝叶斯分类、决策树与随机森林、逻辑回归
    回归:线性回归、岭回归

  • 无监督学习(unsupervised learning)
    定义:输入数据是由输入特征值所组成。
    聚类k-means

1.2 机器学习开发流程

  • 获取数据
  • 数据处理
  • 特征工程
  • 机器学习算法训练 - 模型
  • 模型评估

1.3 可用数据集

kaggle
uci
sklearn

1.3.1 sklearn 数据集的使用

  • 安装sklearn库

安装scikit-learn需要Numpy,Scipy等库

conda install numpy scipy
pip install sklearn
  • scikit-learn 数据集 API 介绍

sklearn.datasets

获取小规模数据集,数据保存在datasets里。用法:datasets.load_ *() 注:(* 代表数据集名称)

  • 鸢尾花数据集
from sklearn.datasets import load_iris


def datasets_demo():
    iris = load_iris()
    print("数据集的键:", list(iris.keys()))
    print("数据集:", iris['data'])
    print("数据集描述:", iris['DESCR'])
    print("数据集特征值的名字:", (iris['feature_names']))
    print("数据值大小:", iris['data'].shape)
    print("目标值", iris['target_names'])


if __name__ == '__main__':
    datasets_demo()

数据集的键: ['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names', 'filename', 'data_module']
数据集: [[5.1 3.5 1.4 0.2]
 [4.9 3.  1.4 0.2]
 [4.7 3.2 1.3 0.2]
 [4.6 3.1 1.5 0.2]
 [5.  3.6 1.4 0.2]
 [5.4 3.9 1.7 0.4]
 [4.6 3.4 1.4 0.3]
 [5.  3.4 1.5 0.2]
 [4.4 2.9 1.4 0.2]
 [4.9 3.1 1.5 0.1]
 [5.4 3.7 1.5 0.2]
 [4.8 3.4 1.6 0.2]
 [4.8 3.  1.4 0.1]
 [4.3 3.  1.1 0.1]
 [5.8 4.  1.2 0.2]
 [5.7 4.4 1.5 0.4]
 [5.4 3.9 1.3 0.4]
 [5.1 3.5 1.4 0.3]
 [5.7 3.8 1.7 0.3]
 [5.1 3.8 1.5 0.3]
 [5.4 3.4 1.7 0.2]
 [5.1 3.7 1.5 0.4]
 [4.6 3.6 1.  0.2]
 [5.1 3.3 1.7 0.5]
 [4.8 3.4 1.9 0.2]
 [5.  3.  1.6 0.2]
 [5.  3.4 1.6 0.4]
 [5.2 3.5 1.5 0.2]
 [5.2 3.4 1.4 0.2]
 [4.7 3.2 1.6 0.2]
 [4.8 3.1 1.6 0.2]
 [5.4 3.4 1.5 0.4]
 [5.2 4.1 1.5 0.1]
 [5.5 4.2 1.4 0.2]
 [4.9 3.1 1.5 0.2]
 [5.  3.2 1.2 0.2]
 [5.5 3.5 1.3 0.2]
 [4.9 3.6 1.4 0.1]
 [4.4 3.  1.3 0.2]
 [5.1 3.4 1.5 0.2]
 [5.  3.5 1.3 0.3]
 [4.5 2.3 1.3 0.3]
 [4.4 3.2 1.3 0.2]
 [5.  3.5 1.6 0.6]
 [5.1 3.8 1.9 0.4]
 [4.8 3.  1.4 0.3]
 [5.1 3.8 1.6 0.2]
 [4.6 3.2 1.4 0.2]
 [5.3 3.7 1.5 0.2]
 [5.  3.3 1.4 0.2]
 [7.  3.2 4.7 1.4]
 [6.4 3.2 4.5 1.5]
 [6.9 3.1 4.9 1.5]
 [5.5 2.3 4.  1.3]
 [6.5 2.8 4.6 1.5]
 [5.7 2.8 4.5 1.3]
 [6.3 3.3 4.7 1.6]
 [4.9 2.4 3.3 1. ]
 [6.6 2.9 4.6 1.3]
 [5.2 2.7 3.9 1.4]
 [5.  2.  3.5 1. ]
 [5.9 3.  4.2 1.5]
 [6.  2.2 4.  1. ]
 [6.1 2.9 4.7 1.4]
 [5.6 2.9 3.6 1.3]
 [6.7 3.1 4.4 1.4]
 [5.6 3.  4.5 1.5]
 [5.8 2.7 4.1 1. ]
 [6.2 2.2 4.5 1.5]
 [5.6 2.5 3.9 1.1]
 [5.9 3.2 4.8 1.8]
 [6.1 2.8 4.  1.3]
 [6.3 2.5 4.9 1.5]
 [6.1 2.8 4.7 1.2]
 [6.4 2.9 4.3 1.3]
 [6.6 3.  4.4 1.4]
 [6.8 2.8 4.8 1.4]
 [6.7 3.  5.  1.7]
 [6.  2.9 4.5 1.5]
 [5.7 2.6 3.5 1. ]
 [5.5 2.4 3.8 1.1]
 [5.5 2.4 3.7 1. ]
 [5.8 2.7 3.9 1.2]
 [6.  2.7 5.1 1.6]
 [5.4 3.  4.5 1.5]
 [6.  3.4 4.5 1.6]
 [6.7 3.1 4.7 1.5]
 [6.3 2.3 4.4 1.3]
 [5.6 3.  4.1 1.3]
 [5.5 2.5 4.  1.3]
 [5.5 2.6 4.4 1.2]
 [6.1 3.  4.6 1.4]
 [5.8 2.6 4.  1.2]
 [5.  2.3 3.3 1. ]
 [5.6 2.7 4.2 1.3]
 [5.7 3.  4.2 1.2]
 [5.7 2.9 4.2 1.3]
 [6.2 2.9 4.3 1.3]
 [5.1 2.5 3.  1.1]
 [5.7 2.8 4.1 1.3]
 [6.3 3.3 6.  2.5]
 [5.8 2.7 5.1 1.9]
 [7.1 3.  5.9 2.1]
 [6.3 2.9 5.6 1.8]
 [6.5 3.  5.8 2.2]
 [7.6 3.  6.6 2.1]
 [4.9 2.5 4.5 1.7]
 [7.3 2.9 6.3 1.8]
 [6.7 2.5 5.8 1.8]
 [7.2 3.6 6.1 2.5]
 [6.5 3.2 5.1 2. ]
 [6.4 2.7 5.3 1.9]
 [6.8 3.  5.5 2.1]
 [5.7 2.5 5.  2. ]
 [5.8 2.8 5.1 2.4]
 [6.4 3.2 5.3 2.3]
 [6.5 3.  5.5 1.8]
 [7.7 3.8 6.7 2.2]
 [7.7 2.6 6.9 2.3]
 [6.  2.2 5.  1.5]
 [6.9 3.2 5.7 2.3]
 [5.6 2.8 4.9 2. ]
 [7.7 2.8 6.7 2. ]
 [6.3 2.7 4.9 1.8]
 [6.7 3.3 5.7 2.1]
 [7.2 3.2 6.  1.8]
 [6.2 2.8 4.8 1.8]
 [6.1 3.  4.9 1.8]
 [6.4 2.8 5.6 2.1]
 [7.2 3.  5.8 1.6]
 [7.4 2.8 6.1 1.9]
 [7.9 3.8 6.4 2. ]
 [6.4 2.8 5.6 2.2]
 [6.3 2.8 5.1 1.5]
 [6.1 2.6 5.6 1.4]
 [7.7 3.  6.1 2.3]
 [6.3 3.4 5.6 2.4]
 [6.4 3.1 5.5 1.8]
 [6.  3.  4.8 1.8]
 [6.9 3.1 5.4 2.1]
 [6.7 3.1 5.6 2.4]
 [6.9 3.1 5.1 2.3]
 [5.8 2.7 5.1 1.9]
 [6.8 3.2 5.9 2.3]
 [6.7 3.3 5.7 2.5]
 [6.7 3.  5.2 2.3]
 [6.3 2.5 5.  1.9]
 [6.5 3.  5.2 2. ]
 [6.2 3.4 5.4 2.3]
 [5.9 3.  5.1 1.8]]
数据集描述:_iris_dataset:

Iris plants dataset
--------------------

**Data Set Characteristics:**

    :Number of Instances: 150 (50 in each of three classes)
    :Number of Attributes: 4 numeric, predictive attributes and the class
    :Attribute Information:
        - sepal length in cm
        - sepal width in cm
        - petal length in cm
        - petal width in cm
        - class:
                - Iris-Setosa
                - Iris-Versicolour
                - Iris-Virginica
                
    :Summary Statistics:

    ============== ==== ==== ======= ===== ====================
                    Min  Max   Mean    SD   Class Correlation
    ============== ==== ==== ======= ===== ====================
    sepal length:   4.3  7.9   5.84   0.83    0.7826
    sepal width:    2.0  4.4   3.05   0.43   -0.4194
    petal length:   1.0  6.9   3.76   1.76    0.9490  (high!)
    petal width:    0.1  2.5   1.20   0.76    0.9565  (high!)
    ============== ==== ==== ======= ===== ====================

    :Missing Attribute Values: None
    :Class Distribution: 33.3% for each of 3 classes.
    :Creator: R.A. Fisher
    :Donor: Michael Marshall (MARSHALL%PLU@io.arc.nasa.gov)
    :Date: July, 1988

The famous Iris database, first used by Sir R.A. Fisher. The dataset is taken
from Fisher's paper. Note that it's the same as in R, but not as in the UCI
Machine Learning Repository, which has two wrong data points.

This is perhaps the best known database to be found in the
pattern recognition literature.  Fisher's paper is a classic in the field and
is referenced frequently to this day.  (See Duda & Hart, for example.)  The
data set contains 3 classes of 50 instances each, where each class refers to a
type of iris plant.  One class is linearly separable from the other 2; the
latter are NOT linearly separable from each other.

.. topic:: References

   - Fisher, R.A. "The use of multiple measurements in taxonomic problems"
     Annual Eugenics, 7, Part II, 179-188 (1936); also in "Contributions to
     Mathematical Statistics" (John Wiley, NY, 1950).
   - Duda, R.O., & Hart, P.E. (1973) Pattern Classification and Scene Analysis.
     (Q327.D83) John Wiley & Sons.  ISBN 0-471-22361-1.  See page 218.
   - Dasarathy, B.V. (1980) "Nosing Around the Neighborhood: A New System
     Structure and Classification Rule for Recognition in Partially Exposed
     Environments".  IEEE Transactions on Pattern Analysis and Machine
     Intelligence, Vol. PAMI-2, No. 1, 67-71.
   - Gates, G.W. (1972) "The Reduced Nearest Neighbor Rule".  IEEE Transactions
     on Information Theory, May 1972, 431-433.
   - See also: 1988 MLC Proceedings, 54-64.  Cheeseman et al"s AUTOCLASS II
     conceptual clustering system finds 3 classes in the data.
   - Many, many more ...
数据集特征值的名字: ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
数据值大小: (150, 4)
目标值 ['setosa' 'versicolor' 'virginica']

1.3.2 数据集的划分

  • 训练数据:用于训练,构建模型
  • 测试数据:在模型检验时使用,用于评估模型是否有效

划分比例:

  • 训练集:70% 80% 75%
  • 测试集:30% 20% 30%
from sklearn.model_selection import train_test_split
def split_datasets():
    iris = load_iris()
    # 返回值:训练集特征值,测试集特征值,训练集目标值,测试集目标值
    x_train, x_test, y_train, y_test = train_test_split(iris['data'], iris['target'], test_size=0.2)
    print("训练集的特征值:", x_train, x_train.shape)  # (120, 4)


if __name__ == '__main__':
    split_datasets()

二、特征工程

业界广泛流传:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。

特征工程是使用专业背景知识和技巧处理数据,使得特征能在机器学习更好的作用的过程。

将任意数据(如文本或图像)转换为可用于机器学习的数字特征。

2.1 特征抽取

2.1.1 字典特征工程

from sklearn.feature_extraction import DictVectorizer
def dict_extraction():
    data = [{'city': '北京', 'temperature': 36}, {'city': '上海', 'temperature': 37}, {'city': '深圳', 'temperature': 35}]
    # 实例化一个转换器 sparse 为稀疏矩阵
    # transfer = DictVectorizer(sparse=True)
    transfer = DictVectorizer(sparse=False)
    data_new = transfer.fit_transform(data)
    print(data_new)


if __name__ == '__main__':
	dict_extraction()

稀疏矩阵:将非零值按位置表示出来。

  (0, 1)	1.0
  (0, 3)	36.0
  (1, 0)	1.0
  (1, 3)	37.0
  (2, 2)	1.0
  (2, 3)	35.0
[[ 0.  1.  0. 36.]
 [ 1.  0.  0. 37.]
 [ 0.  0.  1. 35.]]

对于特征当中存在类别信息的都处理成 one-hot 编码。

2.1.2 文本特征工程

  • 英文文本特征抽取
from sklearn.feature_extraction.text import CountVectorizer
def text_extraction():
    data = ["life is too short,i like python", "python is very efficient for machine learning "]
    transfer = CountVectorizer()
    data_new = transfer.fit_transform(data)
    name = transfer.get_feature_names_out()
    print(name)
    # 将稀疏矩阵转换为二位列表
    print(data_new.toarray())


if __name__ == '__main__':
    text_extraction()
['efficient' 'for' 'is' 'learning' 'life' 'like' 'machine' 'python'
 'short' 'too' 'very']
[[0 0 1 0 1 1 0 1 1 1 0]
 [1 1 1 1 0 0 1 1 0 0 1]]

统计每个样本特征词出现的个数。

  • 中文文本特征抽取

中文如果不做处理,特征词将会以短句的形式进行特征抽取。因为英文语句默认是以空格来分隔开的,所以以单个单词作为特征名称。

pip install jieba 
from sklearn.feature_extraction.text import CountVectorizer
import jieba
def chinese_text_extraction():
    datas = ["生活苦短", "我爱爬虫"]
    # 将列表转换为字符串,并用空格隔开。
    new_datas = [" ".join(list(jieba.cut(data))) for data in datas]
    transfer = CountVectorizer()
    data_final = transfer.fit_transform(new_datas)
    print(transfer.get_feature_names_out())
    print(data_final.toarray())
if __name__ == '__main__':
    chinese_text_extraction()
['爬虫' '生活' '苦短']
[[0 1 1]
 [1 0 0]]
  • tf-idf 文本特征提取

问题描述:该如何处理某个词或短语在多篇文章中出现的次数高这种情况?

TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。

TF-IDF作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。

  1. 词频(term frequency,tf)指的是某一个给定的词语在该文件中出现的频率
  2. 逆向文档频率(inverse document frequency,idf)是一个词语普遍重要性的度量。某一特定词语的idf,是总文件数目除以包含该词语文件的数目,再将得到的商取以10为底的对数得到。
    在这里插入图片描述
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
import jieba
def tfidf_text():
    datas = ["中国的“动力电池白名单”政策被认为是推动中国新能源车及动力电池产业高速发展的重要政策手段", "中国“白名单”政策从2015年5月实施,到2019年6月废止,共执行四年时间"]
    # 将列表转换为字符串,并用空格隔开。
    new_datas = [" ".join(list(jieba.cut(data))) for data in datas]
    transfer = TfidfVectorizer(stop_words=['认为', '重要'])
    data_final = transfer.fit_transform(new_datas)
    print(transfer.get_feature_names_out())
    print(data_final.toarray())

if __name__ == '__main__':
    tfidf_text()
['2015' '2019' '中国' '产业' '动力电池' '发展' '四年' '实施' '废止' '手段' '执行' '推动' '政策'
 '新能源' '时间' '白名单' '车及' '高速']
[[0.         0.         0.3607931  0.25354106 0.50708212 0.25354106
  0.         0.         0.         0.25354106 0.         0.25354106
  0.3607931  0.25354106 0.         0.18039655 0.25354106 0.25354106]
 [0.34261985 0.34261985 0.24377685 0.         0.         0.
  0.34261985 0.34261985 0.34261985 0.         0.34261985 0.
  0.24377685 0.         0.34261985 0.24377685 0.         0.        ]]

2.2 特征预处理

通过一些转换函数将特征数据转换成更加适合算法模型的特征数据过程。

数值型数据的无量纲化:

  • 归一化
  • 标准化

为什么我们要进行归一化/标准化?

  • 特征的单位或者大小相差较大,或者某特征的方差相比其他的特征要大出几个数量级,容易影响(支配)目标结果,使得一些算法无法学习到其它的特征。

2.2.1 归一化

在这里插入图片描述

from sklearn.preprocessing import MinMaxScaler
import pandas as pd
def normalization():
    # 1.获取数据
    filepath = 'dating.txt'
    datas = pd.read_csv(filepath)
    # 划分:所有行 0到3列 包括3
    datas = datas.iloc[:, 0:3]
    # 2.实例化一个转换器对象 feature_range默认(0,1)
    transfer = MinMaxScaler()
    # 3.调用fit_transform
    data_new = transfer.fit_transform(datas)
    print(data_new)
[[0.44832535 0.39805139 0.56233353]
 [0.15873259 0.34195467 0.98724416]
 [0.28542943 0.06892523 0.47449629]
 ...
 [0.29115949 0.50910294 0.51079493]
 [0.52711097 0.43665451 0.4290048 ]
 [0.47940793 0.3768091  0.78571804]]

2.2.2 标准化

通过对原始数据进行变换把数据变换到均值为0标准差为1

在这里插入图片描述

作用于每一列,mean为平均数,σ为标准差。

from sklearn.preprocessing import StandardScaler
import pandas as pd
def standardization():
    # 1.获取数据
    filepath = 'dating.txt'
    datas = pd.read_csv(filepath)
    # 划分:所有行 0到3列 包括3
    datas = datas.iloc[:, 0:3]
    # 2.实例化一个转换器对象 feature_range默认(0,1)
    transfer = StandardScaler()
    # 3.调用fit_transform
    data_new = transfer.fit_transform(datas)
    print(data_new)

[[ 0.33193158  0.41660188  0.24523407]
 [-0.87247784  0.13992897  1.69385734]
 [-0.34554872 -1.20667094 -0.05422437]
 ...
 [-0.32171752  0.96431572  0.06952649]
 [ 0.65959911  0.60699509 -0.20931587]
 [ 0.46120328  0.31183342  1.00680598]]

2.3 特征降维

降维是指在某些限定条件下,降低随机变量(特征)个数,得到一组“不相关”主变量的过程(特征与特征不相关)。

  • 特征相关

相对湿度与降雨量之间的相关

正是因为在进行训练的时候,我们都是使用特征进行学习。如果特征本身存在问题或者特征之间相关性较强,对于算法学习预测会影响较大。

2.3.1 特征选择

Filter(过滤式):主要探究特征本身特点、特征与特征和目标值之间关联。

  • 方差选择法:低方差特征过滤
  • 相关系数
2.3.1.1 方差选择法

方差是衡量一组数据的波动情况,数据与平均数之差平方和的平均数。

  • 特征方差小:某个特征大多样本的值比较相近
  • 特征方差大:某个特征很多样本的值都有差别
from sklearn.feature_selection import VarianceThreshold
import pandas as pd
def low_variance():
    # 1.获取factor_return.csv数据
    filepath = 'factor_returns.csv'
    datas = pd.read_csv(filepath)
    datas = datas.iloc[:, 1:-2]
    print(datas.shape)
    # 2.实例化一个转换器对象 默认方差为0,即threshold为零。一列数据元素相等
    transform = VarianceThreshold(threshold=5)
    # 3.调用fit_transform
    data_new = transform.fit_transform(datas)
    print(data_new.shape)
(2318, 9)
(2318, 8)
2.3.1.2 相关系数

皮尔逊相关系数(Pearson Correlation Coefficient)反映变量之间相关关系密切程度的统计指标。

在这里插入图片描述

特点:

相关系数的值介于 -1 与 +1 之间,即 -1 ≤ r ≤ 1。其性质如下:

  • r > 0 时,表示两变量正相关r < 0时,两变量为负相关
  • |r| = 1 时,表示两变量为完全相关,当 r = 0 时,表示两变量间无相关关系
  • 0 < |r| < 1 时,表示两变量存在一定程度的相关。且 Irl 越接近1,两变量间线性关系越密切;** Irl越接近于0**,表示两变量的线性相关越弱
  • 一般可按三级划分:Irl < 0.4为低度相关;0.4 < Irl < 0.7为显著性相关;0.7 < |r| < 1为高度线性相关

安装conda

conda install scipy

from scipy.stats import pearsonr
import pandas as pd
def correlation():
    filepath = 'factor_returns.csv'
    datas = pd.read_csv(filepath)
    datas = datas.iloc[:, 1:-2]
    print(datas)
    # 计算 pe_ratio 和 pb_ratio 之间的相关系数
    corr = pearsonr(datas['pe_ratio'], datas['pb_ratio'])
    print(corr)
      pe_ratio  pb_ratio  ...       revenue  total_expense
0       5.9572    1.1818  ...  2.070140e+10   1.088254e+10
1       7.0289    1.5880  ...  2.930837e+10   2.378348e+10
2    -262.7461    7.0003  ...  1.167983e+07   1.203008e+07
3      16.4760    3.7146  ...  9.189387e+09   7.935543e+09
4      12.5878    2.5616  ...  8.951453e+09   7.091398e+09
...        ...       ...  ...           ...            ...
2313   25.0848    4.2323  ...  1.148170e+10   1.041419e+10
2314   59.4849    1.6392  ...  1.731713e+09   1.089783e+09
2315   39.5523    4.0052  ...  1.789082e+10   1.749295e+10
2316   52.5408    2.4646  ...  6.465392e+09   6.009007e+09
2317   14.2203    1.4103  ...  4.509872e+10   4.132842e+10

[2318 rows x 9 columns]
(-0.004389322779936285, 0.8327205496564927)

散点图可以直观地看出特征 revenuetotal_expense 之间的相关程度

def scatter_diagram():
    filepath = 'factor_returns.csv'
    datas = pd.read_csv(filepath)
    datas = datas.iloc[:, 1:-2]
    print(datas)
    plt.figure(figsize=(20, 8), dpi=100)
    plt.title('the correlation of revenue and total_expense')
    plt.xlabel('revenue')
    plt.ylabel('total_expense')
    plt.scatter(x=datas['revenue'], y=datas['total_expense'])
    plt.show()

在这里插入图片描述
计算这两者的相关系数

corr2 = pearsonr(datas['revenue'], datas['total_expense'])
# (0.99584504131361, 0.0)

这两者之间的相关系数很大,可以作进一步的处理,比如合成。

2.3.2 主成分分析

  • PCA(Principal Components Analysis)即主成分分析技术
  • 定义:高维数据转化为低维数据的过程,在此过程中可能会舍弃原有数据、创造新的变量
  • 作用:是数据维数压缩,尽可能降低原数据的维数(复杂度),损失少量信息。
from sklearn.decomposition import PCA
import pandas as pd
def pca():
    datas = np.array([[1, 3, 8, 9], [5, 7, 4, 9], [5, 6, 9, 2]])
    # 降到维度为3
    transfer = PCA(n_components=3)
    data_new = transfer.fit_transform(datas)
    print(data_new)
[[-2.64575131e+00 -3.46410162e+00  1.79236038e-16]
 [-2.64575131e+00  3.46410162e+00  1.79236038e-16]
 [ 5.29150262e+00  1.63168795e-15  1.79236038e-16]]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数产第一混子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值