运营实力 网站建设,网络游戏公司,东莞微信公众号小程序,wordpress 列表展开收缩文章目录 1、简介2、Mlxtend库2.1 安装2.2 功能2.2.1 User Guide2.2.2 User Guide - data2.2.3 User Guide - frequent_patterns 2.3 入门示例 3、Apriori算法3.1 基本概念3.2 apriori3.2.1 示例 1 -- 生成频繁项集3.2.2 示例 2 -- 选择和筛选结果3.2.3 示例 3 -- 使用稀疏表示… 文章目录 1、简介2、Mlxtend库2.1 安装2.2 功能2.2.1 User Guide2.2.2 User Guide - data2.2.3 User Guide - frequent_patterns 2.3 入门示例 3、Apriori算法3.1 基本概念3.2 apriori3.2.1 示例 1 -- 生成频繁项集3.2.2 示例 2 -- 选择和筛选结果3.2.3 示例 3 -- 使用稀疏表示 3.3 association_rules3.3.1 示例 1 -- 从频繁项集生成关联规则3.3.2 示例 2 -- 规则生成和选择标准3.3.3 示例 3 -- 具有不完整的先前和后续信息的频繁项集3.3.4 示例 4 -- 修剪关联规则 结语 1、简介
官网地址 https://rasbt.github.io/mlxtend/ Mlxtend (machine learning extensions) is a Python library of useful tools for the day-to-day data science tasks. 关联规则分析是数据挖掘中最活跃的研究方法之一目的是在一个数据集中找到各项之间的关联关系而这种关系并没有在数据中直接体现出来。各种关联规则分析算法从不同方面入手减少可能的搜索空间大小以及减少扫描数据的次数。Apriori算法是最经典的挖掘频繁项集的算法第一次实现在大数据集上的可行的关联规则提取其核心思想是通过连接产生候选项及其支持度然后通过剪枝生成频繁项集。
关联规则Association Rules是海量数据挖掘Mining Massive DatasetsMMDs非常经典的任务其主要目标是试图从一系列事务集中挖掘出频繁项以及对应的关联规则。关联规则来自于一个家喻户晓的“啤酒与尿布”的故事。
2、Mlxtend库
2.1 安装
pip install mlxtend
# or
pip install mlxtend --upgrade --no-deps
# or
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple mlxtend2.2 功能
2.2.1 User Guide
classifierclusterdataevaluatefeature_extractionfeature_selectionfile_iofrequent_patternsimagemathplottingpreprocessingregressortextutils
2.2.2 User Guide - data
autompg_data The Auto-MPG dataset for regression. A function that loads the autompg dataset into NumPy arrays.
from mlxtend.data import autompg_data
X, y autompg_data()print(Dimensions: %s x %s % (X.shape[0], X.shape[1]))
print(\nHeader: %s % [cylinders, displacement, horsepower, weight, acceleration,model year, origin, car name])
print(1st row, X[0])boston_housing_data The Boston housing dataset for regression. A function that loads the boston_housing_data dataset into NumPy arrays.
from mlxtend.data import boston_housing_data
X, y boston_housing_data()print(Dimensions: %s x %s % (X.shape[0], X.shape[1]))
print(1st row, X[0])iris_data The 3-class iris dataset for classification A function that loads the iris dataset into NumPy arrays.
from mlxtend.data import iris_data
X, y iris_data()print(Dimensions: %s x %s % (X.shape[0], X.shape[1]))
print(\nHeader: %s % [sepal length, sepal width,petal length, petal width])
print(1st row, X[0])import numpy as np
print(Classes: Setosa, Versicolor, Virginica)
print(np.unique(y))
print(Class distribution: %s % np.bincount(y))loadlocal_mnist A function for loading MNIST from the original ubyte files A utility function that loads the MNIST dataset from byte-form into NumPy arrays.
from mlxtend.data import loadlocal_mnist
import platform
if not platform.system() Windows:X, y loadlocal_mnist(images_pathtrain-images-idx3-ubyte, labels_pathtrain-labels-idx1-ubyte)else:X, y loadlocal_mnist(images_pathtrain-images.idx3-ubyte, labels_pathtrain-labels.idx1-ubyte)
print(Dimensions: %s x %s % (X.shape[0], X.shape[1]))
print(\n1st row, X[0])import numpy as npprint(Digits: 0 1 2 3 4 5 6 7 8 9)
print(labels: %s % np.unique(y))
print(Class distribution: %s % np.bincount(y))make_multiplexer_dataset A function for creating multiplexer data Function that creates a dataset generated by a n-bit Boolean multiplexer for evaluating supervised learning algorithms.
import numpy as np
from mlxtend.data import make_multiplexer_datasetX, y make_multiplexer_dataset(address_bits2, sample_size10,positive_class_ratio0.5, shuffleFalse,random_seed123)print(Features:\n, X)
print(\nClass labels:\n, y)mnist_data A subset of the MNIST dataset for classification A function that loads the MNIST dataset into NumPy arrays.
from mlxtend.data import mnist_data
X, y mnist_data()print(Dimensions: %s x %s % (X.shape[0], X.shape[1]))
print(1st row, X[0])three_blobs_data The synthetic blobs for classification A function that loads the three_blobs dataset into NumPy arrays.
from mlxtend.data import three_blobs_data
X, y three_blobs_data()print(Dimensions: %s x %s % (X.shape[0], X.shape[1]))
print(1st row, X[0])import numpy as npprint(Suggested cluster labels)
print(np.unique(y))
print(Label distribution: %s % np.bincount(y))import matplotlib.pyplot as pltplt.scatter(X[:,0], X[:,1],cwhite,markero,s50)plt.grid()
plt.show()wine_data A 3-class wine dataset for classification A function that loads the Wine dataset into NumPy arrays.
from mlxtend.data import wine_data
X, y wine_data()print(Dimensions: %s x %s % (X.shape[0], X.shape[1]))
print(\nHeader: %s % [alcohol, malic acid, ash, ash alcalinity,magnesium, total phenols, flavanoids,nonflavanoid phenols, proanthocyanins,color intensity, hue, OD280/OD315 of diluted wines,proline])
print(1st row, X[0])import numpy as np
print(Classes: %s % np.unique(y))
print(Class distribution: %s % np.bincount(y))2.2.3 User Guide - frequent_patterns
apriori 1通过Apriori算法的频繁项集用于提取频繁项集以进行关联规则挖掘的先验函数。 2Apriori 是一种流行的算法用于提取具有关联规则学习应用的频繁项集。先验算法被设计为在包含交易的数据库上运行例如商店顾客的购买。如果项集满足用户指定的支持阈值support threshold则将其视为“频繁”。例如如果支持阈值support threshold设置为 0.5 50%则常用项集定义为在数据库中至少 50% 的事务中一起出现的一组项。
from mlxtend.frequent_patterns import aprioriaprioridf min_support0.5 use_colnamesFalse max_lenNone verbose0 low_memoryFalseassociation_rules 从频繁项集生成关联规则从频繁项集生成关联规则的函数。
from mlxtend.frequent_patterns import association_rules# 生成关联规则的数据帧包括 指标“得分”、“置信度”和“提升”
association_rulesdf metricconfidence min_threshold0.8 support_onlyFalsefpgrowth 1通过 FP-growth 算法的频繁项集实现 FP-Growth 以提取频繁项集以进行关联规则挖掘的函数。 2FP-Growth 是一种用于提取频繁项集的算法其应用在关联规则学习中成为已建立的先验算法的流行替代方案。 通常该算法被设计为在包含交易的数据库上运行例如商店客户的购买。如果项集满足用户指定的支持阈值则将其视为“频繁”。例如如果支持阈值设置为 0.5 50%则常用项集定义为在数据库中至少 50% 的事务中一起出现的一组项。特别是与Apriori频繁模式挖掘算法的不同之处在于FP-Growth是一种不需要生成候选模式的频繁模式挖掘算法。在内部它使用所谓的FP树频繁模式树数据而无需显式生成候选集这对于大型数据集特别有吸引力。
from mlxtend.frequent_patterns import apriori# Get frequent itemsets from a one-hot DataFrame
fpgrowthdf min_support0.5 use_colnamesFalse max_lenNone verbose0fpmax 1通过 FP-Max 算法实现的最大项集实现 FP-Max 以提取最大项集以进行关联规则挖掘的函数。 2Apriori 算法是用于频繁生成项集的最早也是最流行的算法之一然后频繁项集用于关联规则挖掘。但是Apriori 的运行时可能非常大特别是对于具有大量唯一项的数据集因为运行时会根据唯一项的数量呈指数级增长。 与Apriori相比FP-Growth 是一种频繁的模式生成算法它将项目插入到模式搜索树中这允许它在运行时相对于唯一项目或条目的数量线性增加。FP-Max是FP-Growth的变体专注于获取最大项集。如果 X 频繁且不存在包含 X 的频繁超模式则称项集 X 为最大值。换句话说频繁模式 X 不能是较大频繁模式的子模式以符合定义最大项集。
from mlxtend.frequent_patterns import apriori# Get maximal frequent itemsets from a one-hot DataFrame
fpmax(df, min_support0.5, use_colnamesFalse, max_lenNone, verbose0)2.3 入门示例
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import itertools
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.ensemble import RandomForestClassifier
from mlxtend.classifier import EnsembleVoteClassifier
from mlxtend.data import iris_data
from mlxtend.plotting import plot_decision_regions# Initializing Classifiers
clf1 LogisticRegression(random_state0)
clf2 RandomForestClassifier(random_state0)
clf3 SVC(random_state0, probabilityTrue)
eclf EnsembleVoteClassifier(clfs[clf1, clf2, clf3],weights[2, 1, 1], votingsoft)# Loading some example data
X, y iris_data()
X X[:,[0, 2]]# Plotting Decision Regionsgs gridspec.GridSpec(2, 2)
fig plt.figure(figsize(10, 8))labels [Logistic Regression,Random Forest,RBF kernel SVM,Ensemble]for clf, lab, grd in zip([clf1, clf2, clf3, eclf],labels,itertools.product([0, 1],repeat2)):clf.fit(X, y)ax plt.subplot(gs[grd[0], grd[1]])fig plot_decision_regions(XX, yy,clfclf, legend2)plt.title(lab)plt.show()3、Apriori算法
3.1 基本概念 关联规则的一般形式 关联规则的支持度(相对支持度) 项集A、B同时发生的概率称为关联规则的支持度(相对支持度)。Support(AB)P(A∪B)关联规则的置信度 项集A发生则项集B发生的概率为关联规则的置信度。Confidence(AB)P(B∣A) 最小支持度和最小置信度 最小支持度是衡量支持度的一个阈值表示项目集在统计意义上的最低重要性最小置信度是衡量置信度的一个阈值表示关联规则的最低可靠性强规则是同时满足最小支持度阈值和最小置信度阈值的规则 项集 项集是项的集合。包含k 个项的集合称为k 项集项集出现的频率是所有包含项集的事务计数又称为绝对支持度或支持度计数如果项集的相对支持度满足预定义的最小支持度阈值则它是频繁项集。 支持度计数 项集A的支持度计数是事务数据集中包含项集A的事务个数简称项集的频率或计数一旦得到项集A 、 B 和A∪B的支持度计数以及所有事务个数就可以导出对应的关联规则AB和BA并可以检查该规则是否为强规则。
关联分析Association Analysis在大规模数据集中寻找有趣的关系。
频繁项集Frequent Item Sets经常出现在一块的物品的集合即包含0个或者多个项的集合称为项集。
支持度Support数据集中包含该项集的记录所占的比例是针对项集来说的。
置信度Confidence出现某些物品时另外一些物品必定出现的概率针对规则而言。
关联规则Association Rules暗示两个物品之间可能存在很强的关系。形如A-B的表达式规则A-B的度量包括支持度和置信度
项集支持度一个项集出现的次数与数据集所有事物数的百分比称为项集的支持度支持度 首先是个百分比值指的是某个商品组合出现的次数与总次数之间的比例。支持度越高代表这个组合可以是单个商品出现的频率越大。
置信度首先是个条件概率。指的是当你购买了商品A会有多大的概率购买商品B
提升度 商品A的出现对商品B的出现概率提升的程度。提升度(A→B)置信度(A→B)/支持度(B)什么样的数据才是频繁项集呢从名字上来看就是出现次数多的集合没错但是上面算次数多呢这里我们给出频繁项集的定义。**频繁项集**支持度大于等于最小支持度(Min Support)阈值的项集。1、导入数据并将数据预处理
2、计算频繁项集
3、根据各个频繁项集分别计算支持度和置信度
4、根据提供的最小支持度和最小置信度输出满足要求的关联规则1找出频繁项集支持度必须大于等于给定的最小支持度阈值 生成频繁项目集。 一个频繁项集的所有子集必须也是频繁的。 指定最小支持度min_support过滤掉非频繁项集既能减轻计算负荷又能提高预测质量。
2找出上步中频繁项集的规则 生成关联规则。 指定最小置信度metric “confidence”, min_threshold 0.01来过滤掉弱规则。 由频繁项集产生强关联规则。由第一步可知未超过预定的最小支持阈值的项集已被剔除如果剩下的这些项集又满足了预定的最小置信度阈值那么就挖掘出了强关联规则。
3Metrics
‘support’: ‘confidence’: ‘lift’: ‘leverage’: ‘conviction’: ‘zhangs_metric’: Apriori算法的主要思想是找出存在于事务数据集中最大的频繁项集再利用得到的最大频繁项集与预先设定的最小置信度阈值生成强关联规则。频繁项集的所有非空子集一定是频繁项集。
Apriori算法流程
1、首先对数据库中进行一次扫描统计每一个项出现的次数形成候选1-项集
2、根据minsupport阈值筛选出频繁1-项集
3、将频繁1-项集进行组合形成候选2-项集
4、对数据库进行第二次扫描为每个候选2-项集进行计数并筛选出频繁2-项集
5、重复上述流程直到候选项集为空
6、根据生成的频繁项集通过计算相应的置信度来生成管理规则。3.2 apriori Frequent itemsets via the Apriori algorithm. Apriori function to extract frequent itemsets for association rule mining. 3.2.1 示例 1 – 生成频繁项集
我们可以通过以下方式将其转换为正确的格式TransactionEncoder
dataset [[Milk, Onion, Nutmeg, Kidney Beans, Eggs, Yogurt],[Dill, Onion, Nutmeg, Kidney Beans, Eggs, Yogurt],[Milk, Apple, Kidney Beans, Eggs],[Milk, Unicorn, Corn, Kidney Beans, Yogurt],[Corn, Onion, Onion, Kidney Beans, Ice cream, Eggs]]import pandas as pd
from mlxtend.preprocessing import TransactionEncoderte TransactionEncoder()
te_ary te.fit(dataset).transform(dataset)
df pd.DataFrame(te_ary, columnste.columns_)
print(df)现在让我们返回至少具有 60% 支持的项和项集
from mlxtend.frequent_patterns import apriorifrequent_itemsets apriori(df, min_support0.6)
print(frequent_itemsets)默认情况下 返回项的列索引这在下游操作如关联规则挖掘中可能很有用。为了更好的可读性我们可以设置将这些整数值转换为相应的项目名称aprioriuse_colnamesTrue
from mlxtend.frequent_patterns import apriorifrequent_itemsets apriori(df, min_support0.6, use_colnamesTrue)
print(frequent_itemsets)3.2.2 示例 2 – 选择和筛选结果
在于我们可以使用pandas它方便的功能来过滤结果。例如假设我们只对长度为 2 且支持至少为 80% 的项集感兴趣。首先我们通过创建频繁的项集并添加一个新列来存储每个项集的长度.
from mlxtend.frequent_patterns import apriorifrequent_itemsets apriori(df, min_support0.6, use_colnamesTrue)
frequent_itemsets[length] frequent_itemsets[itemsets].apply(lambda x: len(x))
print(frequent_itemsets)然后我们可以选择满足我们所需标准的结果如下所示
from mlxtend.frequent_patterns import apriorifrequent_itemsets apriori(df, min_support0.6, use_colnamesTrue)
frequent_itemsets[length] frequent_itemsets[itemsets].apply(lambda x: len(x))
frequent_itemsets frequent_itemsets[ (frequent_itemsets[length] 2) (frequent_itemsets[support] 0.8) ]
print(frequent_itemsets)同样使用 Pandas API我们可以根据“项集”列选择条目
from mlxtend.frequent_patterns import apriorifrequent_itemsets apriori(df, min_support0.6, use_colnamesTrue)
frequent_itemsets[length] frequent_itemsets[itemsets].apply(lambda x: len(x))
frequent_itemsets frequent_itemsets[ frequent_itemsets[itemsets] {Onion, Eggs} ]
print(frequent_itemsets)3.2.3 示例 3 – 使用稀疏表示
为了节省内存您可能希望以稀疏格式表示事务数据。
import pandas as pd
from mlxtend.preprocessing import TransactionEncoderte TransactionEncoder()
oht_ary te.fit(dataset).transform(dataset, sparseTrue)
sparse_df pd.DataFrame.sparse.from_spmatrix(oht_ary, columnste.columns_)
print(sparse_df)import pandas as pd
from mlxtend.preprocessing import TransactionEncoder
from mlxtend.frequent_patterns import apriorite TransactionEncoder()
oht_ary te.fit(dataset).transform(dataset, sparseTrue)
sparse_df pd.DataFrame.sparse.from_spmatrix(oht_ary, columnste.columns_)
# print(sparse_df)frequent_itemsets apriori(sparse_df, min_support0.6, use_colnamesTrue, verbose1)
print(frequent_itemsets)3.3 association_rules Association rules generation from frequent itemsets. Function to generate association rules from frequent itemsets. 3.3.1 示例 1 – 从频繁项集生成关联规则
我们首先创建一个由 fpgrowth 函数生成的频繁项集的pandas.
import pandas as pd
from mlxtend.preprocessing import TransactionEncoder
from mlxtend.frequent_patterns import apriori, fpmax, fpgrowthdataset [[Milk, Onion, Nutmeg, Kidney Beans, Eggs, Yogurt],[Dill, Onion, Nutmeg, Kidney Beans, Eggs, Yogurt],[Milk, Apple, Kidney Beans, Eggs],[Milk, Unicorn, Corn, Kidney Beans, Yogurt],[Corn, Onion, Onion, Kidney Beans, Ice cream, Eggs]]te TransactionEncoder()
te_ary te.fit(dataset).transform(dataset)
df pd.DataFrame(te_ary, columnste.columns_)frequent_itemsets fpgrowth(df, min_support0.6, use_colnamesTrue)
### alternatively:
#frequent_itemsets apriori(df, min_support0.6, use_colnamesTrue)
#frequent_itemsets fpmax(df, min_support0.6, use_colnamesTrue)print(frequent_itemsets)该函数允许您 1 指定您感兴趣的指标和 2 相应的阈值。目前实施的措施是信心和提升。假设仅当置信度高于 70% 阈值 时您才对从频繁项集派生的规则感兴趣。
from mlxtend.frequent_patterns import association_rulesrules association_rules(frequent_itemsets, metricconfidence, min_threshold0.7)
print(rules)3.3.2 示例 2 – 规则生成和选择标准
如果您对根据不同兴趣指标的规则感兴趣您可以简单地调整和参数。例如如果您只对提升分数为 1.2 的规则感兴趣则可以执行以下操作
from mlxtend.frequent_patterns import association_rulesrules association_rules(frequent_itemsets, metriclift, min_threshold1.2)
print(rules)我们可以按如下方式计算先行长度
from mlxtend.frequent_patterns import association_rulesrules association_rules(frequent_itemsets, metriclift, min_threshold1.2)
# print(rules)
rules[antecedent_len] rules[antecedents].apply(lambda x: len(x))
print(rules)假设我们对满足以下条件的规则感兴趣
至少 2 个前因置信度 0.75提升得分 1.2
from mlxtend.frequent_patterns import association_rulesrules association_rules(frequent_itemsets, metriclift, min_threshold1.2)
# print(rules)
rules[antecedent_len] rules[antecedents].apply(lambda x: len(x))
# print(rules)
rules rules[ (rules[antecedent_len] 2) (rules[confidence] 0.75) (rules[lift] 1.2) ]
print(rules)同样使用 Pandas API我们可以根据“前因”或“后因”列选择条目
from mlxtend.frequent_patterns import association_rulesrules association_rules(frequent_itemsets, metriclift, min_threshold1.2)
# print(rules)
rules[antecedent_len] rules[antecedents].apply(lambda x: len(x))
# print(rules)
rules[rules[antecedents] {Eggs, Kidney Beans}]
print(rules)3.3.3 示例 3 – 具有不完整的先前和后续信息的频繁项集
计算的大多数指标取决于频繁项集输入数据帧中提供的给定规则的结果和先前支持分数。
import pandas as pddict {itemsets: [[177, 176], [177, 179],[176, 178], [176, 179],[93, 100], [177, 178],[177, 176, 178]],support:[0.253623, 0.253623, 0.217391,0.217391, 0.181159, 0.108696, 0.108696]}freq_itemsets pd.DataFrame(dict)
print(freq_itemsets)import pandas as pddict {itemsets: [[177, 176], [177, 179],[176, 178], [176, 179],[93, 100], [177, 178],[177, 176, 178]],support:[0.253623, 0.253623, 0.217391,0.217391, 0.181159, 0.108696, 0.108696]}freq_itemsets pd.DataFrame(dict)
print(freq_itemsets)from mlxtend.frequent_patterns import association_rules
res association_rules(freq_itemsets, support_onlyTrue, min_threshold0.1)
print(res)import pandas as pddict {itemsets: [[177, 176], [177, 179],[176, 178], [176, 179],[93, 100], [177, 178],[177, 176, 178]],support:[0.253623, 0.253623, 0.217391,0.217391, 0.181159, 0.108696, 0.108696]}freq_itemsets pd.DataFrame(dict)
print(freq_itemsets)from mlxtend.frequent_patterns import association_rules
res association_rules(freq_itemsets, support_onlyTrue, min_threshold0.1)
print(res)res res[[antecedents, consequents, support]]
print(res)3.3.4 示例 4 – 修剪关联规则
没有用于修剪的特定 API。相反可以在生成的数据帧上使用 pandas API 来删除单个行。
import pandas as pd
from mlxtend.preprocessing import TransactionEncoder
from mlxtend.frequent_patterns import apriori, fpmax, fpgrowth
from mlxtend.frequent_patterns import association_rulesdataset [[Milk, Onion, Nutmeg, Kidney Beans, Eggs, Yogurt],[Dill, Onion, Nutmeg, Kidney Beans, Eggs, Yogurt],[Milk, Apple, Kidney Beans, Eggs],[Milk, Unicorn, Corn, Kidney Beans, Yogurt],[Corn, Onion, Onion, Kidney Beans, Ice cream, Eggs]]te TransactionEncoder()
te_ary te.fit(dataset).transform(dataset)
df pd.DataFrame(te_ary, columnste.columns_)frequent_itemsets fpgrowth(df, min_support0.6, use_colnamesTrue)
rules association_rules(frequent_itemsets, metriclift, min_threshold1.2)
print(rules)我们想删除规则“洋葱、芸豆-鸡蛋”。为此我们可以定义选择掩码并删除此行
import pandas as pd
from mlxtend.preprocessing import TransactionEncoder
from mlxtend.frequent_patterns import apriori, fpmax, fpgrowth
from mlxtend.frequent_patterns import association_rulesdataset [[Milk, Onion, Nutmeg, Kidney Beans, Eggs, Yogurt],[Dill, Onion, Nutmeg, Kidney Beans, Eggs, Yogurt],[Milk, Apple, Kidney Beans, Eggs],[Milk, Unicorn, Corn, Kidney Beans, Yogurt],[Corn, Onion, Onion, Kidney Beans, Ice cream, Eggs]]te TransactionEncoder()
te_ary te.fit(dataset).transform(dataset)
df pd.DataFrame(te_ary, columnste.columns_)frequent_itemsets fpgrowth(df, min_support0.6, use_colnamesTrue)
rules association_rules(frequent_itemsets, metriclift, min_threshold1.2)
print(rules)antecedent_sele rules[antecedents] frozenset({Onion, Kidney Beans}) # or frozenset({Kidney Beans, Onion})
consequent_sele rules[consequents] frozenset({Eggs})
final_sele (antecedent_sele consequent_sele)rules rules.loc[ ~final_sele ]
print(rules) 结语
如果您觉得该方法或代码有一点点用处可以给作者点个赞或打赏杯咖啡╮(▽)╭ 如果您感觉方法或代码不咋地//(ㄒoㄒ)//就在评论处留言作者继续改进o_O??? 如果您需要相关功能的代码定制化开发可以留言私信作者(✿◡‿◡) 感谢各位大佬童鞋们的支持( ´ ▽´ ) ( ´ ▽´)っ