版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、简介:2主要特点:2scikit-learn安装:(ubuntu版本14.04.1)2classification21.监督学习21.1广义线性模型:21.2 支持向量机71.3 随机梯度下降81.4 最近邻91.5 gaussian processes131.6 cross decomposition141.7 naive bayes141.8 decision trees151.9 ensemble methods181.10 multiclass and multilabel algorithms231.11 feature selection241.14 isotonic regres
2、sion272.272.3 clustering282.5 decomposing signals in components (matrix factorization problems)303.model selection and evaluation303.1 cross-validation: evaluating estimator performance303.2 grid search: searching for estimator parameters343.3 pipeline: chaining estimators353.4 featureunion: combini
3、ng feature extractors363.5. model evaluation: quantifying the quality of predictions363.6. model persistence373.7. validation curves: plotting scores to evaluate models374.384.2 preprocessing data384.4 random projection43简介:scikit-learn是一个用于机器学习的python模块,建立在scipy基础之上。主要特点:操作简单、高效的数据挖掘和数据分析无访问限制,在任何情
4、况下可重新使用建立在numpy、scipy和matplotlib基础上使用商业开源协议-bsd许可证scikit-learn安装:(ubuntu版本14.04.1)安装依赖:sudoapt-getinstallbuild-essentialpython-devpython-numpypython-setuptoolspython-scipylibatlas-devlibatlas3-base python-matplotlib安装pipsudo apt-get install python-pip安装scikit-learnsudo pip install -u scikit-learn标准库
5、classification1.监督学习1.1广义线性模型:1.1.1普通最小二乘法:无偏估计的通过计算最小二乘的损失函数的最小值来求得参数得出模型通常用在观测有误差的情况,解决线性回归问题求实际观测值与预测值差的平方最小值数学公式:是由sklearn.linear_model模块中的linearregression类实现回归linearregression的构造方法:sklearn.linear_model.linearregression(fit_intercept=true #默认值为true,表示计算随机变量,false表示不计算随机变量 , normalize=false #默认值为
6、false,表示在回归前是否对回归因子x进行归一化,true表示是 , copy_x=true)linearregression的属性有:coef_和intercept_。coef_存储到的值,与x的维数一致。intercept_存储的值。linearregression的常用方法有:decision_function(x) #返回x的预测值yfit(x,y,n_jobs) #拟合模型get_params(deep) #获取linearregression构造方法的参数信息predict(x) #求预测值 #同decision_functionscore(x,y,sample_weight)
7、#计算公式为set_params(*params) #设置linearregression构造方法的参数值 参考示例:from sklearn import linear_modelx= 0, 0, 1, 1, 2, 2y = 0, 1, 2clf = linear_model.linearregression()clf.fit(x, y)print clf.coef_print ercept_print clf.predict(3, 3)print clf.decision_function(x)print clf.score(x, y)print clf.get_params
8、()print clf.set_params(fit_intercept = false)普通最小二乘法的复杂性:假设影响因素x为一个n行p列的矩阵那么其算法复杂度为假设缺点:要求每个影响因素相互独立,否则会出现随机误差。回归用于解决预测值问题1.1.2 ridge回归有偏估计的,回归系数更符合实际、更可靠,对病态数据的拟合要强于最小二乘数学公式:=0,越大,w值越趋于一致改良的最小二乘法,增加系数的平方和项和调整参数的积是由sklearn.linear_model模块中的ridge类实现ridge回归用于解决两类问题:一是样本少于变量个数,二是变量间存在共线性ridge的构造方法:sklea
9、rn.linear_model.ridge(alpha=1.0 #公式中的值,默认为1.0,fit_intercept=true,normalize=false,copy_x=true,max_iter=none #共轭梯度求解器的最大迭代次数,tol=0.001 #默认值0.001,solver=auto) #ridge回归复杂性:同最小二乘法使用:from sklearn import linear_modelx= 0, 0, 1, 1, 2, 2y = 0, 1, 2clf = linear_model.ridge(alpha = 0.1)clf.fit(x, y)print clf.c
10、oef_print ercept_print clf.predict(3, 3)print clf.decision_function(x)print clf.score(x, y)print clf.get_params()print clf.set_params(fit_intercept = false)调整参数设置():通过广义交叉验证的方式(ridgecv)设置调整参数ridgecv构造方法:sklearn.linear_model.ridgecv(alphas=array( 0.1,1.,10. ),fit_intercept=true,normalize=false
11、,scoring=none #交叉验证发生器,cv=none,gcv_mode=none ,store_cv_values=false)使用示例:from sklearn import linear_modelx= 0, 0, 1, 1, 2, 2y = 0, 1, 2clf = linear_model.ridgecv(alpha = 0.1, 1.0, 10.0)clf.fit(x, y)print clf.coef_print ercept_print clf.predict(3, 3)print clf.decision_function(x)print clf.scor
12、e(x, y)print clf.get_params()print clf.set_params(fit_intercept = false)1.1.3 lasso数学公式:估计稀疏系数的线性模型适用于参数少的情况,因其产生稀疏矩阵,可用与特征提取实现类是lasso,此类用于监督分类较好的解决回归分析中的多重共线性问题思想:在回归系数的绝对值之和小于一个常数的约束条件下,使残差平方和最小化使用:clf = linear_model.lasso(alpha = 0.1)设置调整参数():交叉验证:lassocv(适用于高维数据集)或lassolarscv(适合于样本数据比观察数据小很多)基于模
13、式选择的信息标准:lassolarsic(bic/aic)1.1.4 elastic net是一个使用l1和l2训练的线性模型,适合于在参数很少的情况下(如lasso)并保持ridge性能的情况,既是多种影响因素依赖与另外一种因素。继承ridge的旋转稳定性。数学表达式:from sklearn.linear_model import elasticnetenet = elasticnet(alpha=alpha, l1_ratio=0.7)求取和的值使用elasticnetcv1.1.5 multi-task lasso用于估计y值不是一元的回归问题用于估计联合多元回归问题的稀疏系数,y是一
14、个2维矩阵(n_samples,n_tasks)。对于所有的回归问题,选的的因素必须相同,也叫tasks。使用:clf = linear_model.multitasklasso(alpha=0.1)1.1.6 least angle regression是一个计算高维数据的回归算法。实现类是sklearn.linear_model中的lars类优点:当维数大于点数的时候在上下文中是有效的复杂度和最小二乘相同,但计算很快产生一个分片解决方案路径用于交叉验证或相似的调整模型方法如果两个变量响应相关,则会有相同的增长率很融合修改变成其他的评估方法缺点:噪声敏感使用:clf = linear_mod
15、el.lars(n_nonzero_coefs=1)1.1.7 lars lasso是一个使用lars算法实现的lasso模型。使用:clf = linear_model.lassolars(alpha=0.01)1.1.8 omp(orthogonal matching pursuit)通过固定的非零元素数得到最优解omp基于贪心算法实现,每一步的原子项都与残余高度相关。使用:omp = orthogonalmatchingpursuit(n_nonzero_coefs=n_nonzero_coefs)omp_cv = orthogonalmatchingpursuitcv()1.1.9 贝
16、叶斯回归(bayesian regression)可以再估计过程包含正则化参数,参数可以手动设置,用于估计概率回归问题优点:适用于手边数据可用于在估计过程中包含正规化参数缺点:耗时bayesian ridge regression:bayesianridge用于估计回归问题的概率模型 用法:clf = linear_model.bayesianridge() by default ard(automatic relevance determination ):类似于bayesian ridge regression,但可产生稀疏的值 用法:clf = ardregression(compute
17、_score=true)1.1.10 逻辑回归可以做概率预测,也可用于分类仅能用于线性问题通过计算真实值与预测值的概率,然后变换成损失函数,求损失函数最小值来计算模型参数从而得出模型使用:clf_l1_lr = logisticregression(c=c, penalty=l1, tol=0.01)clf_l2_lr = logisticregression(c=c, penalty=l2, tol=0.01)clf_l1_lr.fit(x, y)clf_l2_lr.fit(x, y)1.1.11 sgd(stochastic gradient descent )用于样本数据非常大的情况由s
18、gdclassifier和sgdregressor使用:clf = linear_model.sgdregressor()clf = linear_model.sgdclassifier()对于sgdclassifier,当loss=”log”时拟合成一个逻辑回归模型,当loss=”hinge”时拟合成一个线性支持向量机1.1.12 perceptron是另一个大规模学习的算法不需要学习率不是正则的只有错误的时候更新模型使用:同sgdclassifier1.1.13 passive aggressive algorithms不要求学习率的时候同perceptron,与perceptron不同的
19、是包含正则参数c使用:同sgdclassifier1.1.14 ransac(random sample consensus)是一个从完整数据集中的一个子集中健壮估计参数的迭代算法,是非确定性算法,此算法把数据分成很多子集,根据子集估计算法步骤:(1)从原始数据中选择最小的随机样本,并检查数据时候有效(is_data_valid)(2)根据(1)的随机子集拟合模型(base_estimator.fit),并检查模型是否有效(is_model_valid)(3)通过计算估计模型的方法来分类数据(4)如果临近样本数是最大的,并且当前的评估模型有同样的数则保存模型为最优模型。使用:model_ran
20、sac = linear_model.ransacregressor(linear_model.linearregression()1.1.15多项式回归机器学习中的常见模式,使用线性模型训练数据的非线性函数1.2 支持向量机拟合出来的模型为一个超平面解决与样本维数无关,适合做文本分类解决小样本、非线性、高维是用于分类、回归、孤立点检测的监督学习方法的集合。优点:有效的高维空间维数大于样本数的时候仍然有效在决策函数中使用训练函数的子集通用(支持不同的内核函数:线性、多项式、s型等)缺点:不适用于特征数远大于样本数的情况不直接提供概率估计接受稠密和稀疏的输入1.2.1 classificatio
21、n由svc、nusvc或linearsvc实现,可进行多类分类linearsvc只支持线性分类svc和nusvc实现一对一,linearsvc实现一对多使用:clf = svm.svc()lin_clf = svm.linearsvc()svc、nusvc和linearsvc均无support_、support_vectors_和n_support_属性1.2.2 回归支持向量分类的方法也支持向量回归,有svr和nusvr,同分类一样,只是y向量需要是浮点数使用:clf = svm.svr()1.2.3 density estimation, novelty detection由oneclas
22、ssvm实现,是非监督学习,只需要一个x矩阵,没有类标签1.2.4 complexityand 1.3 随机梯度下降应用于大量稀疏的机器学习问题,输入数据为稀疏的常用于文本分类和自然语言处理是处理大样本数据的非常有效的方法优点:高效易于实施缺点:需要一些调整参数对尺度特征敏感1.3.1 classification使用sgdclassifier实现,拟合参数为xn_samples,n_features和yn_samples可以实现多类分类,此时是通过多个binary分类实现实现方式是one-vs-all(ova),每一个binary分类把其中一个分出来,剩下的作为一个。测试的时候计算每一个分类
23、器的得分并选择得分最高的1.3.2 regression由sgdregressor实现1.3.3 复杂度x为(n,p),则复杂度为1.4 最近邻无监督的最近邻是其他学习方法的基础,监督的近邻学习分为:分类(数据有离散标记)和回归(数据有连续标记)最近邻分类:计算待分类样本与训练样本中各个类的距离,求出距离最小的k紧邻是求出k个最小的,然后计算分别属于某一类的个数,选个数最大的类,若相等则选择跟训练集中的序列有关近邻分类:解决离散数据近邻回归:解决连续数据1.4.1 无监督的最近邻由nearestneighbors实现,在sklearn.neighbors中,有三种算法:ball_tree(ba
24、lltree)、kd_tree(kdtree)、brute(brute-force)、auto(默认)from sklearn.neighbors import nearestneighborssklearn.neighbors.nearestneighbors(n_neighbors=5 #邻居数,默认为5 , radius=1.0 #参数空间范围,默认值为1.0 , algorithm=auto #用于计算最近邻的算法(ball_tree、kd_tree、brute、auto) , leaf_size=30 #传递给balltree或kdtree叶大小 , metric=minkowski
25、 , p=2 , metric_params=none , *kwargs)使用:nbrs = nearestneighbors(n_neighbors=2, algorithm=ball_tree).fit(x)distances, indices = nbrs.kneighbors(x) kdtree and balltree使用:x = np.array(-1, -1, -2, -1, -3, -2, 1, 1, 2, 1, 3, 2)kdt = kdtree(x, leaf_size=30, metric=euclidean)kdt.query(x, k=2, retur
26、n_distance=false) balltree用法同kdtree 1.4.2 最近邻分类是基于实例的非泛华学习,有两种不同的最近邻分类:kneighborsclassifier和radiusneighborsclassifier(非均匀采样时比较合适)kneighborsclassifier:实现k近邻,k是一个用户输入的整数,k高度依赖与数据sklearn.neighbors.kneighborsclassifier(n_neighbors=5 #邻居数,默认为5 , weights=uniform #用于预测的权重方法 , algorithm=auto #用于计算最近邻的算法(bal
27、l_tree、kd_tree、brute、auto) , leaf_size=30 #传递给balltree或kdtree叶大小 , p=2 # , metric=minkowski #用于树的度量距离 , metric_params=none #度量参数 , *kwargs)使用:from sklearn.neighbors import kneighborsclassifierneigh = kneighborsclassifier(n_neighbors=3)neigh.fit(x, y)radiusneighborsclassifier:实现基于给定的半径r内的邻居数。用于不是均匀采样
28、的数据,不适合高维参数空间的数据sklearn.neighbors.radiusneighborsclassifier(radius=1.0 , weights=uniform #参数空间范围 , algorithm=auto #用于计算最近邻的算法(ball_tree、kd_tree、brute、auto) , leaf_size=30 #传递给balltree或kdtree叶大小 , p=2 , metric=minkowski #用于树的度量距离 , outlier_label=none #离散群体的标签 , metric_params=none #度量参数 , *kwargs)使用:f
29、rom sklearn.neighbors import radiusneighborsclassifierneigh = radiusneighborsclassifier(radius=1.0)neigh.fit(x, y)1.4.3 近邻回归近邻回归用于标记数据是连续的情况,有两种不同的最近邻分类:kneighborsregressor和radiusneighborsregressorkneighborsregressor:实现k近邻,k是一个用户输入的整数sklearn.neighbors.kneighborsregressor(n_neighbors=5 #邻居数,默认为5 , we
30、ights=uniform #用于预测的权重方法 , algorithm=auto #用于计算最近邻的算法(ball_tree、kd_tree、brute、auto) , leaf_size=30 #传递给balltree或kdtree叶大小 , p=2 # , metric=minkowski #用于树的度量距离 , metric_params=none #度量参数 , *kwargs)使用:from sklearn.neighbors import kneighborsregressorneigh = kneighborsregressor(n_neighbors=3)neigh.fit(
31、x, y)radiusneighborsregressor:实现基于给定的半径r内的邻居数。sklearn.neighbors.radiusneighborsregressor(radius=1.0 , weights=uniform #参数空间范围 , algorithm=auto #用于计算最近邻的算法(ball_tree、kd_tree、brute、auto) , leaf_size=30 #传递给balltree或kdtree叶大小 , p=2 , metric=minkowski #用于树的度量距离 , outlier_label=none #离散群体的标签 , metric_par
32、ams=none #度量参数 , *kwargs)使用:from sklearn.neighbors import radiusneighborsregressorneigh = radiusneighborsregressor(radius=1.0)neigh.fit(x, y)1.4.4 最近邻算法 brute force搜索时通过sklearn.neighbors中的algorithm参数设置为brute实现,计算是通过sklearn.metrics.pairwise此种方法计算效率低,d维空间的n个样本时间复杂度为 k-d tree为了解决bruteforc
33、e计算效率低的问题,通过减少计算距离所需的数据实现,思想是:如果a距离b非常远,b距离c非常近,那么认为a与c距离非常远而不需要进行计算。相比于bruteforce,时间复杂度降低为,但高维数据空间效率低 balltree解决k-dtree高维空间效率低的问题 最近邻算法选择n为样本数,d为维数,k表示邻居数当n=30的时候选择bruteforce比较合适数据集结构化的时候,选择k-d tree或k-d tree当k相当于与n来说变得非常大时选择bruteforce如果查询点数少时bruteforce leaf_size的影响1)影响构建树的时间,le
34、af_size越大,构建树时间越短2)影响查询时间,leaf_size最合适的值为303)影响内存,随着leaf_size的增大,存储内存减小1.4.5 nearest centroid classifier构造方法:sklearn.neighbors.nearestcentroid(metric=euclidean , shrink_threshold=none)用法:x = np.array(-1, -1, -2, -1, -3, -2, 1, 1, 2, 1, 3, 2) y = np.array(1, 1, 1, 2, 2, 2)clf = nearestcentroid() clf.
35、fit(x, y)1.5 gaussian processesgpml是一种监督学习方法,主要用于解决回归问题,已经扩展到概率分类,但目前的研究只是一个回归练习的后处理优点:预测插值观测预测是概率的,可以预测经验置信空间,改变预测值通用缺点:非离散高维空间效率低分类仅仅是一个后处理实现类是gaussianprocess构造方法:sklearn.gaussian_process.gaussianprocess(regr=constant #回归函数返回信息 , corr=squared_exponential #自相关信息 , beta0=none #回归权重向量 , storage_mode=
36、full , verbose=false , theta0=0.1 , thetal=none , thetau=none , optimizer=fmin_cobyla , random_start=1 , normalize=true , nugget=2.2204460492503131e-15 , random_state=none)使用:import numpy as npfrom sklearn.gaussian_process import gaussianprocessx = np.array(1., 3., 5., 6., 7., 8.).ty = (x * np.sin(x
37、).ravel()gp = gaussianprocess(theta0=0.1, thetal=.001, thetau=1.)gp.fit(x, y) 1.6 cross decomposition包括两类算法pls和cca,用于计算两个多变数据集的线性相关,需要拟合的多变集x和y是2d数组当预测矩阵比实际数据有更多的变量时适合用pls1.7 naive bayesnaive bayes方法是监督学习的集合基于假设每对特征之间都是独立的贝叶斯理论朴素贝叶斯方法是基于贝叶斯理论并假设每个特征都是独立的应用于文档分类和垃圾邮件过滤需要训练数据比较少朴素贝叶斯通过计算属于每个类的概率并取概率最大
38、的类作为预测类naive bayes is a decent classifier, but a bad estimator1.7.1 gaussian naive bayes实现分类的是高斯贝叶斯算法是实现类gaussiannb构造方法:sklearn.naive_bayes.gaussiannbgaussiannb类构造方法无参数,属性值有:class_prior_ #每一个类的概率theta_ #每个类中各个特征的平均sigma_ #每个类中各个特征的方差示例: import numpy as npx = np.array(-1, -1, -2, -1, -3, -2, 1, 1, 2,
39、 1, 3, 2)y = np.array(1, 1, 1, 2, 2, 2)from sklearn.naive_bayes import gaussiannbclf = gaussiannb()clf.fit(x, y)gaussiannb类无score方法1.7.2 multinomial naive bayes用于文本分类用于处理多项离散数据集的naive bayes算法的类是multinomial nb构造方法:sklearn.naive_bayes.multinomialnb(alpha=1.0 #平滑参数 , fit_prior=true #学习类的先验概率 , class_pr
40、ior=none) #类的先验概率示例: import numpy as npx = np.random.randint(5, size=(6, 100)y = np.array(1, 2, 3, 4, 5, 6)from sklearn.naive_bayes import multinomialnbclf = multinomialnb()clf.fit(x, y)1.7.3 bernoulli naive bayes处理根据multivariate bernoulli离散的训练和分类数据算法,实现类是bernoullinb构造方法:sklearn.naive_bayes.bernoull
41、inb(alpha=1.0 #平滑参数 , binarize=0.0#样本特征阈值二值比 , fit_prior=true #学习类的先验概率 , class_prior=none) #类的先验概率示例:import numpy as npx = np.random.randint(2, size=(6, 100)y = np.array(1, 2, 3, 4, 4, 5)from sklearn.naive_bayes import bernoullinbclf = bernoullinb()clf.fit(x, y)1.8 decision trees是一个无参数的分类和回归的监督学习方法
42、,目标是创建一个模型用于预测目标变量的值,通过学习从数据特征中推断出来的简单规则。优点:易于理解只需要很少的准备数据复杂度是数据点数的对数能够同时处理数值和分类数据能够处理多输出问题采用白盒模型使用统计测试可以验证模型即使假设有点错误也可以表现很好缺点:可以创建复杂树但不能很好的推广不稳定是np问题有很难学习的概念如果一些类占主导地位创建的树就有偏差1.8.1 分类实现类是decisiontreeclassifier,能够执行数据集的多类分类输入参数为两个数组xn_samples,n_features和yn_samples,x为训练数据,y为训练数据的标记数据decisiontreeclass
43、ifier构造方法为:sklearn.tree.decisiontreeclassifier(criterion=gini , splitter=best , max_depth=none , min_samples_split=2 , min_samples_leaf=1 , max_features=none , random_state=none , min_density=none , compute_importances=none , max_leaf_nodes=none)decisiontreeclassifier示例:from sklearn import treex = 0
44、, 0, 1, 1y = 0, 1clf = tree.decisiontreeclassifier()clf = clf.fit(x, y)1.8.2 回归实现类是decisiontreeregressor,输入为x,y同上,y为浮点数decisiontreeregressor构造方法为:sklearn.tree.decisiontreeregressor(criterion=mse , splitter=best , max_depth=none , min_samples_split=2 , min_samples_leaf=1 , max_features=none , random_
45、state=none , min_density=none , compute_importances=none , max_leaf_nodes=none)decisiontreeregressor示例:from sklearn import treex = 0, 0, 2, 2y = 0.5, 2.5clf = tree.decisiontreeregressor()clf = clf.fit(x, y)clf.predict(1, 1)1.8.3 多输出问题实现类有:decisiontreeclassifier和decisiontreeregressor.decisiontreeclas
46、sifier构造方法:sklearn.tree.decisiontreeclassifier(criterion=gini, splitter=best, max_depth=none, min_samples_split=2, min_samples_leaf=1, max_features=none, random_state=none, min_density=none, compute_importances=none, max_leaf_nodes=none)decisiontreeclassifier示例:from sklearn.datasets import load_iris
47、from sklearn.cross_validation import cross_val_scorefrom sklearn.tree import decisiontreeclassifierclf = decisiontreeclassifier(random_state=0)iris = load_iris()cross_val_score(clf, iris.data, iris.target, cv=10)decisiontreeregressor构造方法:sklearn.tree.decisiontreeregressor(criterion=mse, splitter=best, max_depth=none, min_samples_split=2, min_samples_leaf=1, max_features=none, random_state=none, min_density=none, compute_importances=none, max_leaf_nodes=none)decisiontreeregressor
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 32151.23-2024温室气体排放核算与报告要求第23部分:种植业机构
- 住宿协议书范本3篇
- 公司合作协议解除合同
- 解除房屋租赁合同
- 2024年度软件开发与技术支持合同
- 卫生间防水工程施工合同范本 3篇
- 外墙真石漆施工协议书
- 2024年度版权许可合同版权授权期限规定2篇
- 货车租赁合同电子版
- 工程施工安全协议书范本
- 中国农业大学信纸(电子版)
- 资产收购税收政策解读及案例分析
- 领导艺术与管理智慧
- 八年级英语试卷分析10篇
- 毕业设计(论文)-圆柱滚子轴承受力有限元分析设计(含全套CAD图纸)
- 春天三国507版本所有物品解释
- 学院学生工作思路、目标、举措
- 精干高效企业人力资源管理方法探析
- 著名外企安全培训资料之:LOF危害因素识别
- 最新挡圈标准
- 在新社会阶层人士联谊会成立大会讲话
评论
0/150
提交评论