数据处理和分析之分类算法:K近邻算法(KNN):数据分析与KNN算法案例研究

数据处理和分析之分类算法:K近邻算法(KNN):数据分析与KNN算法案例研究

在这里插入图片描述

数据处理基础

数据清洗

数据清洗是数据分析过程中的关键步骤,旨在提高数据质量,确保后续分析的准确性。数据清洗涉及识别并修正或删除数据集中的错误、不完整、不准确或不相关部分。以下是一些常见的数据清洗任务:

  1. 处理缺失值:数据集中可能包含缺失值,这可能是因为数据收集过程中的错误或遗漏。处理缺失值的方法包括删除含有缺失值的记录、填充缺失值(如使用平均值、中位数或众数)或使用预测模型来估计缺失值。

  2. 去除重复记录:数据集中可能包含重复的记录,这可能导致分析结果的偏差。通过检查数据集并删除重复记录来解决这一问题。

  3. 纠正数据格式:数据可能以不一致的格式存储,如日期格式、货币格式等。数据清洗需要将这些数据转换为统一的格式。

  4. 异常值检测:异常值是数据集中与其他数据点显著不同的值,可能由测量错误或数据输入错误引起。检测并处理异常值是数据清洗的重要部分。

示例代码:处理缺失值

import pandas as pd

# 创建一个包含缺失值的数据框
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David'],
        'Age': [25, 30, None, 35],
        'Salary': [50000, 60000, 70000, None]}
df = pd.DataFrame(data)

# 使用平均年龄填充缺失的年龄值
mean_age = df['Age'].mean()
df['Age'].fillna(mean_age, inplace=True)

# 打印处理后的数据框
print(df)

数据预处理技术

数据预处理是将原始数据转换为适合机器学习算法使用的格式的过程。这包括数据的规范化、标准化、编码和转换。

  1. 数据规范化:将数据转换到一个特定的范围内,如0到1之间,以消除量纲的影响。

  2. 数据标准化:将数据转换为具有零均值和单位方差的标准正态分布,这对于许多机器学习算法(如KNN)来说是必要的。

  3. 编码:将分类数据转换为数值形式,以便机器学习算法可以处理。常见的编码方法包括独热编码(One-Hot Encoding)和标签编码(Label Encoding)。

  4. 特征转换:通过数学变换(如对数变换、平方根变换)来改变特征的分布,使其更符合算法的假设。

示例代码:数据标准化

from sklearn.preprocessing import StandardScaler
import numpy as np

# 创建一个数据集
data = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])

# 创建一个StandardScaler对象
scaler = StandardScaler()

# 拟合数据并进行标准化
data_scaled = scaler.fit_transform(data)

# 打印标准化后的数据
print(data_scaled)

特征选择与工程

特征选择是从原始数据中选择最相关和最有信息量的特征的过程,而特征工程则是创建新的特征或修改现有特征以提高模型性能的过程。

  1. 特征选择:通过统计测试、相关性分析或使用特征选择算法(如递归特征消除)来识别和选择对模型预测能力有贡献的特征。

  2. 特征工程:这可能包括创建组合特征、处理时间序列数据、使用领域知识来创建新特征等。

示例代码:特征选择 - 递归特征消除

from sklearn.datasets import make_classification
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression

# 创建一个分类数据集
X, y = make_classification(n_samples=100, n_features=10, n_informative=5)

# 创建一个Logistic Regression模型
model = LogisticRegression()

# 创建一个RFE对象
rfe = RFE(model, n_features_to_select=5)

# 拟合数据
rfe.fit(X, y)

# 打印被选择的特征
print("Selected Features: %s" % list(rfe.support_))

以上代码和数据样例展示了数据处理基础中的关键概念和操作,包括数据清洗、数据预处理技术和特征选择与工程。通过这些步骤,可以确保数据的质量和适用性,为后续的分析和建模奠定坚实的基础。

数据处理和分析之分类算法:K近邻算法 (KNN)

KNN算法简介

K近邻算法(K-Nearest Neighbors, KNN)是一种基于实例的学习方法,用于分类和回归。在分类问题中,KNN算法通过计算待分类样本与训练集中所有样本的距离,找到距离最近的K个训练样本,然后根据这K个样本的类别来预测待分类样本的类别。预测类别通常是这K个样本中出现次数最多的类别。

算法步骤

  1. 计算距离:选择一个距离度量方法,计算待分类样本与训练集中每个样本的距离。
  2. 找到K个最近邻:从计算出的距离中,选择距离最小的K个训练样本。
  3. 投票决定类别:根据这K个最近邻样本的类别,采用多数表决的方式决定待分类样本的类别。

优点与缺点

  • 优点:算法简单,易于理解和实现;对于多分类问题效果较好;不需要训练过程,可以处理非线性数据。
  • 缺点:计算量大,尤其是当数据集很大时;对于样本不平衡的数据集,预测结果可能偏向于数量较多的类别;K值的选择对结果影响较大。

距离度量方法

在KNN算法中,距离度量是关键步骤之一。常见的距离度量方法包括:

  • 欧氏距离:最常用的距离度量方法,适用于数值型特征。
  • 曼哈顿距离:适用于数值型特征,尤其是在高维空间中,欧氏距离可能不是最佳选择。
  • 余弦相似度:适用于文本或向量数据,衡量两个向量之间的夹角余弦值。

欧氏距离示例

假设我们有两个样本点,sample1 = [1, 2]sample2 = [4, 6],我们可以使用Python的scipy库来计算它们之间的欧氏距离。

from scipy.spatial import distance

# 定义样本点
sample1 = [1, 2]
sample2 = [4, 6]

# 计算欧氏距离
euclidean_distance = distance.euclidean(sample1, sample2)
print("欧氏距离:", euclidean_distance)

K值的选择策略

K值的选择对KNN算法的性能有显著影响。较小的K值容易受到噪声的影响,较大的K值则可能包含更多无关样本的信息。选择K值的策略包括:

  • 交叉验证:通过交叉验证来选择最佳的K值,即在训练集上进行多次实验,每次实验使用不同的K值,选择分类准确率最高的K值。
  • 奇数原则:在二分类问题中,选择奇数作为K值,可以避免出现投票平局的情况。

交叉验证示例

使用sklearn库中的KNeighborsClassifierGridSearchCV来选择最佳的K值。

from sklearn.model_selection import GridSearchCV
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

# 加载数据集
iris = load_iris()
X = iris.data
y = iris.target

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 定义KNN模型
knn = KNeighborsClassifier()

# 定义参数网格
param_grid = {'n_neighbors': [1, 3, 5, 7, 9]}

# 使用GridSearchCV进行交叉验证
grid_search = GridSearchCV(knn, param_grid, cv=5)
grid_search.fit(X_train, y_train)

# 输出最佳参数
print("最佳K值:", grid_search.best_params_)

KNN算法案例研究

数据预处理

在应用KNN算法之前,数据预处理是必要的步骤,包括数据清洗、特征选择、特征缩放等。

示例:特征缩放

使用scikit-learn库中的StandardScaler进行特征缩放。

from sklearn.preprocessing import StandardScaler

# 定义特征缩放器
scaler = StandardScaler()

# 拟合并转换训练集
X_train_scaled = scaler.fit_transform(X_train)

# 使用相同的缩放器转换测试集
X_test_scaled = scaler.transform(X_test)

KNN模型训练与预测

使用scikit-learn库中的KNeighborsClassifier进行模型训练和预测。

# 使用最佳K值训练模型
knn_best = KNeighborsClassifier(n_neighbors=grid_search.best_params_['n_neighbors'])
knn_best.fit(X_train_scaled, y_train)

# 在测试集上进行预测
y_pred = knn_best.predict(X_test_scaled)

# 输出预测结果
print("预测结果:", y_pred)

模型评估

使用scikit-learn库中的accuracy_score来评估模型的准确率。

from sklearn.metrics import accuracy_score

# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print("模型准确率:", accuracy)

通过上述步骤,我们可以有效地应用KNN算法进行分类任务,并通过交叉验证和特征缩放等技术提高模型的性能。

数据处理和分析之分类算法:K近邻算法 (KNN) 实现

Python中使用KNN进行分类

K近邻算法(K-Nearest Neighbors, KNN)是一种基于实例的学习方法,用于分类和回归。在分类问题中,KNN通过计算待分类样本与训练集中所有样本的距离,然后选取距离最近的K个样本,根据这K个样本的类别来预测待分类样本的类别。KNN算法简单直观,但计算量可能较大,尤其是在数据量很大的情况下。

示例代码

下面是一个使用Python和scikit-learn库实现KNN分类的示例。我们将使用一个简单的数据集来演示如何训练模型并进行预测。

# 导入必要的库
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import classification_report

# 加载数据集
iris = load_iris()
X = iris.data
y = iris.target

# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 数据预处理
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# 创建KNN分类器
knn = KNeighborsClassifier(n_neighbors=3)

# 训练模型
knn.fit(X_train, y_train)

# 预测
y_pred = knn.predict(X_test)

# 输出分类报告
print(classification_report(y_test, y_pred))

代码解释

  1. 数据加载:使用load_iris函数加载鸢尾花数据集。
  2. 数据划分:使用train_test_split函数将数据集划分为训练集和测试集。
  3. 数据预处理:使用StandardScaler对数据进行标准化处理,确保每个特征的尺度相同,避免距离计算时某些特征的主导作用。
  4. 模型创建:创建一个KNN分类器,参数n_neighbors=3表示选择距离最近的3个邻居。
  5. 模型训练:使用训练集数据和标签调用fit方法训练模型。
  6. 预测:使用测试集数据调用predict方法进行预测。
  7. 评估:使用classification_report函数输出分类报告,评估模型的性能。

KNN算法的步骤详解

KNN算法的实现步骤如下:

  1. 计算距离:对于待分类的样本,计算它与训练集中每个样本的距离。常用的距离度量有欧氏距离、曼哈顿距离等。
  2. 选择邻居:选取距离最近的K个样本作为待分类样本的邻居。
  3. 类别决策:根据这K个邻居的类别,采用多数表决的方式决定待分类样本的类别。如果K个邻居中多数属于某一类别,则待分类样本也属于该类别。

代码实现与调试

实现KNN算法

下面是一个从零开始实现KNN算法的示例,不使用任何机器学习库。

import numpy as np
from collections import Counter

# 欧氏距离计算函数
def euclidean_distance(x1, x2):
    return np.sqrt(np.sum((x1 - x2) ** 2))

# KNN分类器
class KNN:
    def __init__(self, k=3):
        self.k = k

    def fit(self, X, y):
        self.X_train = X
        self.y_train = y

    def predict(self, X):
        y_pred = [self._predict(x) for x in X]
        return np.array(y_pred)

    def _predict(self, x):
        # 计算距离
        distances = [euclidean_distance(x, x_train) for x_train in self.X_train]
        # 获取K个最近的标签
        k_indices = np.argsort(distances)[:self.k]
        k_nearest_labels = [self.y_train[i] for i in k_indices]
        # 多数表决
        most_common = Counter(k_nearest_labels).most_common(1)
        return most_common[0][0]

# 加载数据集
iris = load_iris()
X = iris.data
y = iris.target

# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 数据预处理
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# 创建KNN分类器
knn = KNN(k=3)

# 训练模型
knn.fit(X_train, y_train)

# 预测
y_pred = knn.predict(X_test)

# 输出分类报告
print(classification_report(y_test, y_pred))

调试技巧

  1. 检查数据预处理:确保数据已经被正确地标准化或归一化。
  2. 验证距离计算:检查距离计算函数是否正确实现,可以使用几个样本点手动计算距离进行验证。
  3. K值选择:尝试不同的K值,观察模型性能的变化。K值的选择对模型的性能有重要影响。
  4. 错误分析:对于预测错误的样本,分析其特征和类别,理解模型为何会出错,可能需要调整特征选择或K值。
  5. 性能优化:对于大数据集,可以考虑使用KD树或球树等数据结构来加速最近邻的搜索过程。

通过以上步骤,我们可以深入理解KNN算法的工作原理,并能够有效地在Python中实现和调试KNN分类器。

案例研究:KNN在手写数字识别中的应用

MNIST数据集介绍

MNIST数据集是一个广泛用于训练和测试分类算法的大型手写数字数据库。它包含60,000个训练样本和10,000个测试样本,每个样本是一个28x28像素的灰度图像,代表0到9的数字。MNIST数据集的每个图像都已经被标记,这使得它成为评估机器学习算法性能的理想选择。

数据加载与预处理

加载数据

首先,我们需要加载MNIST数据集。在Python中,可以使用sklearn库中的fetch_openml函数来下载和加载MNIST数据集。

from sklearn.datasets import fetch_openml

# 加载MNIST数据集
mnist = fetch_openml('mnist_784', version=1)
X, y = mnist["data"], mnist["target"]

数据预处理

数据预处理是机器学习中一个关键步骤,它包括数据清洗、特征选择、数据转换等。对于MNIST数据集,预处理主要涉及数据的标准化和划分训练集与测试集。

数据标准化

标准化数据可以提高模型的训练速度和性能。我们将每个像素值除以255,将其范围从0到255缩放到0到1。

X = X / 255.0
划分训练集与测试集

使用train_test_split函数从sklearn.model_selection模块来划分数据集。

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

模型训练与评估

K近邻算法模型训练

K近邻算法(KNN)是一种基于实例的学习方法,用于分类和回归。在分类问题中,KNN算法通过计算测试样本与训练样本之间的距离,然后选择距离最近的K个训练样本,根据这些样本的类别来预测测试样本的类别。

在Python中,可以使用sklearn.neighbors模块中的KNeighborsClassifier类来实现KNN算法。

from sklearn.neighbors import KNeighborsClassifier

# 创建KNN分类器实例
knn = KNeighborsClassifier(n_neighbors=3)

# 训练模型
knn.fit(X_train, y_train)

模型评估

模型评估是通过测试集来检查模型的性能。我们将使用score方法来计算模型的准确率。

# 在测试集上评估模型
accuracy = knn.score(X_test, y_test)
print(f"模型准确率: {accuracy * 100:.2f}%")

此外,我们还可以使用混淆矩阵和分类报告来更详细地评估模型的性能。

from sklearn.metrics import confusion_matrix, classification_report

# 预测测试集
y_pred = knn.predict(X_test)

# 输出混淆矩阵
print("混淆矩阵:")
print(confusion_matrix(y_test, y_pred))

# 输出分类报告
print("分类报告:")
print(classification_report(y_test, y_pred))

交叉验证

为了更准确地评估模型的性能,我们还可以使用交叉验证。sklearn.model_selection模块中的cross_val_score函数可以帮助我们实现这一点。

from sklearn.model_selection import cross_val_score

# 使用交叉验证评估模型
scores = cross_val_score(knn, X_train, y_train, cv=5)
print(f"交叉验证准确率: {scores.mean() * 100:.2f}%")

通过以上步骤,我们不仅训练了一个KNN模型来识别手写数字,还对其性能进行了全面的评估,确保了模型的可靠性和准确性。

KNN算法的优化与改进

算法性能优化

K近邻算法(KNN)在处理大规模数据集时,其性能可能会受到严重影响,因为对于每个待分类的样本,都需要计算其与所有训练样本之间的距离。为了优化KNN算法的性能,可以采用以下几种策略:

1. 索引结构

使用空间索引结构如kd树或球树(ball tree)可以显著减少距离计算的次数。这些数据结构在构建时会将数据点组织成树形结构,从而在搜索最近邻时避免了对所有训练样本的遍历。

示例代码:使用kd树优化KNN
from sklearn.neighbors import KDTree
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

# 加载数据
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=42)

# 构建kd树
tree = KDTree(X_train)

# 查询最近邻
distances, indices = tree.query(X_test, k=3)

2. 特征选择

减少特征数量可以降低计算复杂度。通过选择与分类任务最相关的特征,可以提高KNN的效率。特征选择方法包括过滤式、包裹式和嵌入式。

3. 数据降维

使用PCA或t-SNE等降维技术可以减少数据的维度,从而减少计算距离的时间。

处理不平衡数据集

在不平衡数据集中,某些类别的样本数量远多于其他类别,这可能导致KNN算法偏向于样本数量较多的类别。处理不平衡数据集的方法包括:

1. 重采样

  • 过采样(oversampling):增加少数类样本的数量,如SMOTE算法。
  • 欠采样(undersampling):减少多数类样本的数量。
示例代码:使用SMOTE进行过采样
from imblearn.over_sampling import SMOTE
from sklearn.datasets import make_classification

# 创建不平衡数据集
X, y = make_classification(n_classes=2, class_sep=2, weights=[0.1, 0.9], n_informative=3, n_redundant=1, flip_y=0, n_features=20, n_clusters_per_class=1, n_samples=1000, random_state=10)

# 使用SMOTE进行过采样
sm = SMOTE(random_state=42)
X_res, y_res = sm.fit_resample(X, y)

2. 加权KNN

给不同类别的样本分配不同的权重,使少数类样本在分类决策中具有更大的影响力。

KNN算法的局限性与改进方法

KNN算法虽然简单直观,但在实际应用中存在一些局限性,包括计算复杂度高、对噪声敏感以及在高维空间中效果不佳等。改进方法包括:

1. 动态K值

根据数据的局部密度动态调整K值,以减少噪声的影响。

2. 距离加权

在计算最近邻时,可以给距离更近的样本分配更大的权重,从而减少噪声的影响。

3. 高维数据处理

对于高维数据,可以使用局部敏感哈希(LSH)或近似最近邻(ANN)算法来加速最近邻的搜索。

示例代码:使用局部敏感哈希(LSH)处理高维数据
from sklearn.neighbors import LSHForest
from sklearn.datasets import load_digits

# 加载数据
digits = load_digits()
X_train, X_test, y_train, y_test = train_test_split(digits.data, digits.target, test_size=0.2, random_state=42)

# 构建LSH森林
lshf = LSHForest(random_state=42)
lshf.fit(X_train)

# 查询最近邻
distances, indices = lshf.kneighbors(X_test, n_neighbors=3)

4. 集成学习

使用多个KNN模型进行集成,可以提高分类的准确性和鲁棒性。

5. 特征工程

通过特征选择、特征提取和特征构造等技术,可以提高KNN算法的性能。

6. 模型选择

在不同的数据集上,可能需要选择不同的距离度量和K值,以达到最佳的分类效果。

通过上述优化和改进方法,KNN算法可以在保持其简单性和直观性的同时,提高其在实际应用中的性能和鲁棒性。

KNN算法在实际项目中的部署

模型部署流程

在将K近邻算法(KNN)部署到实际项目中时,遵循一个清晰的流程至关重要。以下是KNN模型部署的一般步骤:

  1. 模型训练与验证:

    • 使用训练数据集训练KNN模型。
    • 通过交叉验证等技术验证模型的准确性。
  2. 模型选择:

    • 根据验证结果选择最佳的K值和模型参数。
  3. 模型测试:

    • 在独立的测试数据集上评估模型性能。
  4. 模型优化:

    • 根据测试结果进行必要的优化,如特征选择或数据预处理。
  5. 模型部署:

    • 将模型封装成API或集成到现有系统中。
    • 确保模型在生产环境中的稳定性和性能。
  6. 持续监控:

    • 监控模型在生产环境中的表现,定期检查模型的准确性和稳定性。
  7. 模型更新:

    • 根据监控结果和业务需求,定期更新或重新训练模型。

示例:KNN模型部署

假设我们有一个基于KNN的分类模型,用于预测用户是否会购买某个产品。我们使用Python的scikit-learn库来实现这个模型。

# 导入必要的库
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score

# 加载数据
data = pd.read_csv('user_data.csv')

# 数据预处理
X = data.drop('purchased', axis=1)
y = data['purchased']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 特征缩放
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# 训练模型
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train, y_train)

# 验证模型
y_pred = knn.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f'模型准确率: {accuracy}')

持续集成与持续部署(CI/CD)

持续集成(CI)和持续部署(CD)是现代软件开发中不可或缺的部分,它们确保了模型的更新和部署过程自动化且高效。

CI/CD流程

  1. 代码提交:

    • 开发者将代码更改提交到版本控制系统,如Git。
  2. 自动构建:

    • CI系统自动构建代码,运行单元测试和集成测试。
  3. 自动部署:

    • CD系统自动将通过测试的代码部署到生产环境。
  4. 监控与反馈:

    • 监控生产环境中的模型性能,将结果反馈给开发团队。

示例:使用Jenkins进行CI/CD

Jenkins是一个广泛使用的CI/CD工具,可以自动化上述流程。以下是一个简单的Jenkinsfile示例,用于自动化KNN模型的构建和部署:

pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                sh 'python setup.py build'
            }
        }
        stage('Test') {
            steps {
                sh 'python tests.py'
            }
        }
        stage('Deploy') {
            steps {
                sh 'python deploy.py'
            }
        }
    }
}

模型监控与维护

模型在生产环境中的表现可能会随时间而变化,因此持续监控和维护是必要的。

监控指标

  • 准确率:
    • 模型预测结果与实际结果的匹配程度。
  • 性能指标:
    • 如响应时间、资源消耗等。
  • 数据漂移:
    • 监测输入数据的分布是否发生变化。

维护策略

  • 定期重新训练:
    • 使用最新数据重新训练模型,以适应数据变化。
  • 模型版本控制:
    • 保持模型版本的历史记录,以便回滚或比较。
  • 异常检测与报警:
    • 当模型性能下降时,自动发送报警通知。

示例:使用Prometheus监控模型性能

Prometheus是一个开源的监控系统,可以用来监控模型的性能指标。以下是一个简单的Prometheus配置示例,用于监控KNN模型的响应时间和准确率:

global:
  scrape_interval:     15s
  evaluation_interval: 15s

scrape_configs:
  - job_name: 'knn_model'
    metrics_path: '/metrics'
    static_configs:
      - targets: ['localhost:8000']

在模型服务中,我们需要实现一个端点来暴露这些指标:

from prometheus_client import start_http_server, Summary, Counter

# 初始化监控指标
REQUEST_TIME = Summary('request_processing_seconds', 'Time spent processing request')
ERROR_COUNT = Counter('request_error_count', 'Number of processing errors')

# 启动Prometheus服务器
start_http_server(8000)

# 在模型预测函数中使用监控指标
@REQUEST_TIME.time()
def predict(input_data):
    try:
        # 模型预测逻辑
        prediction = knn.predict(input_data)
        return prediction
    except Exception as e:
        ERROR_COUNT.inc()
        raise e

通过上述步骤,我们可以确保KNN模型在实际项目中的有效部署、持续集成与部署,以及模型的监控与维护,从而提高模型的稳定性和业务价值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值