收藏 分销(赏)

R数据挖掘实例.pptx

上传人:xrp****65 文档编号:12550733 上传时间:2025-10-29 格式:PPTX 页数:99 大小:1.07MB 下载积分:10 金币
下载 相关 举报
R数据挖掘实例.pptx_第1页
第1页 / 共99页
R数据挖掘实例.pptx_第2页
第2页 / 共99页


点击查看更多>>
资源描述
#,Crime&Shock,数据集分析展示,探索性数据分析,Communities and CrimeUnnormalized Data Set,(,Data source,),2,一、数据预处理,#,导入,crime,数据,修改变量名称,并查看数据属性,crim=read.table(crim.txt,sep=,na.string=?),name=read.table(attr_vol.txt),name=name,2,colnames(crim)-name,summary(crim)dim(crim),3,观测值:,2215,变量数:,147,部分数据严重缺失,四、犯罪率分布情况,4,在,3,月份的行业销售旺季,东北地区及北部地区销售额占到公司全月总额的,70%,,西部地区仅为,10%,,西部死去市场潜力还需深度挖掘。,可看出,violentPerPop nonViolPerPop,都出现了不同程度的拖尾特征,考虑对数据进行对数变换,由图可知,四、对数化变换,5,做变换后两变量数据较为对称,由图可知,四、犯罪率地区差异,6,三个地区犯罪率的中位数由西向东递减,分布相对集中,但东部地区出现了较为明显的离群值,7,缺失值处理,nrow(crim!complete.cases(crim),)#,缺失值项的总行数,#,基本每行都有缺失值,na.sta=c(),for(i in 1:2215),na.sta=c(na.sta,length(which(is.na(crimi,),max(na.sta),#,缺失值基本在,20,左右,没有,#,缺失过于严重的样本,无需删除,8,缺失值处理:临近值插补,从数据集中选取若干条其他属性和它相似的样本,(,即和它在空间欧式距离最短的,n,条样本,),,求其中位数进行插补,crim$gangUnit=as.factor(gangUnit),crim1=crim,c(6:126,128:147),library(cluster)#,调用,R,语言中的,cluster,包,#,计算空间距离,dist.mtx-as.matrix(daisy(crim1,stand=T),#,计算这,2215,个样品的空间距离,9,缺失值处理:临近值插补,#,先处理非因子型变量的缺失值,需要将以下步骤进行两次,for(r in which(!complete.cases(crim1),crim1r,which(is.na(crim1r,)0.7,),Linear Regression,for(i in 1:5),crim.test=data.frame(crim1ddi,),crim.train=data.frame(crim1-ddi,),lm.vio=lm(violentPerPop.,data=crim.train,c(6:129,146),pre.train=predict(lm.vio),pre.test=predict(lm.vio,crim.test,c(6:129,146),NM.train=mean(crim.train$violentPerPop-pre.train)2)/,mean(mean(crim.train$violentPerPop)-crim.train$violentPerPop)2),NM.test=mean(crim.test$violentPerPop-pre.test)2)/,mean(mean(crim.test$violentPerPop)-crim.test$violentPerPop)2),M.train=mean(crim.train$violentPerPop-pre.train)2),M.test=mean(crim.test$violentPerPop-pre.test)2),NMSE.train=c(NMSE.train,NM.train),NMSE.test=c(NMSE.test,NM.test),MSE.train=c(MSE.train,M.train),MSE.test=c(MSE.test,M.test),16,Linear Regression,17,Stepwise,#,逐步回归:全部、前向、后向,lm1both-step(lm.vio,direction=both),lm1forward-step(lm.vio,direction=forward),lm1back-step(lm.vio,direction=backward),final.lm-step(lm.vio),summary(final.lm),18,Stepwise,19,Stepwise,20,Stepwise,:,diagnose,21,Stepwise,22,Stepwise,23,Conclusion,由结果可以看出,逐步回归调整后的的,R-Square,为,0.6957,,模型检验的结果显示,回归的残差项并不满足正态性假定,同时模型的,AIC,值,25573.06,依然过高,这启发我们建立更加精确的预测模型。,24,Ridge,25,Ridge,cor(crim,6:129,use=complete.obs)#,变量间的相关性,计算时不考虑缺失值,symnum(cor(crim,6:129,use=complete.obs)#,简单明显示出变量间的相关,#,只截取部分结果显示,可以看出,#,变量之间的共线性较为明显,26,Ridge,library(MASS),ridgelm-lm.ridge(violentPerPop.,data=crim.train,c(6:129,146),lambda=seq(0,200,0.01),model=TRUE),names(ridgelm),ridgelm$lambdawhich.min(ridgelm$GCV)#,找到,GCV,最小时对应的,lambda,#,广义的交叉验证准则,GCV,,越小越好,ridgelm$coef,which.min(ridgelm$GCV)#,找到,GCV,最小时对应的系数,27,Ridge,#lamda,同,GCV,之间关系的图形,plot(ridgelm$lambda,ridgelm$GCV,type=l),abline(v=ridgelm$lambdawhich.min(ridgelm$GCV),col=green),28,Lasso,LASSO,方法,在线性模型中,人们必须选择合适的变量;比如常用的逐步回归法就是选择显著的变量而抛弃那些不显著的。,Tibshirani(1996),1,提出了一个新的方法来处理变量选择的问题。该方法在模型系数绝对值的和小于某常数的条件下,谋求残差平方和最小。该方法既提供了如子集选择方法那样的可以解释的模型,也具有岭回归那样的稳定性。,它不删除变量,但使得一些回归系数收缩、变小,甚至为,0,。因而,该方法被称为,lasso(least absolute shrinkage and selection operator,,最小绝对值收缩和选择算子,2,),。,29,Lasso,#,将数据集中的因子变量,gangUnit,转换为哑元变量,#,训练集,gangUnit5=rep(0,1772);gangUnit5which(crim.train$gangUnit=5)=1,gangUnit10=rep(0,1772);gangUnit10which(crim.train$gangUnit=10)=1,crim.train1=crim.train,c(6:129);crim.train1$gangUnit=NULL,crim.train2=data.frame(crim.train1,1:121,gangUnit5,gangUnit10,crim.train1,-(1:121),#,测试集,gangUnit5=rep(0,443);gangUnit5which(crim.test$gangUnit=5)=1,gangUnit10=rep(0,443);gangUnit10which(crim.test$gangUnit=10)=1,crim.test1=crim.test,c(6:129);crim.test1$gangUnit=NULL,crim.test2=data.frame(crim.test1,1:121,gangUnit5,gangUnit10,crim.test1,-(1:121),30,Lasso(lars),library(lars),attach(crim.train),lassolm-lars(as.matrix(crim.train2),violentPerPop),Lassolm,31,Lasso(msgps),library(msgps),fit-msgps(as.matrix(crim.train2),crim.train$violentPerPop),summary(fit),32,Lasso(lars),lassolm$Cp,33,Lasso(msgps),coef(fit)#extract coefficients at t selected by model selection criteria,cbind(coef(fit),ridgelm$coef,which.min(ridgelm$GCV)1:10,),注:如图,根据前三个准则得出的最终模型系数基本一致,最后一列为岭回归,Cp,原则的系数,可以看出,lasso,方法可以使更多的系数“收缩”到,0,。,34,Lasso(msgps),plot(fit,criterion=cp,main=lasso),35,Lasso(lars),36,Lasso(lars),predict11-predict(lassolm,data.matrix(crim.train2),mode=,fraction,s=best,type=fit),predict1-predict(lassolm,data.matrix(crim.test2),mode=,fraction,s=best,type=fit),cat(lasso,训练集上的,NMSE,为,:,mean(crim.train$violentPerPop-as.numeric(predict11$fit)2)/,mean(mean(crim.train$violentPerPop)-crim.train$violentPerPop)2),n),lasso,训练集上的,NMSE,为,:0.3050613(,依据,10,折交叉验证,),cat(lasso,测试集上的,NMSE,为,:,mean(crim.test$violentPerPop-as.numeric(predict1$fit)2)/,mean(mean(crim.test$violentPerPop)-crim.test$violentPerPop)2),n),lasso,测试集上的,NMSE,为,:0.3388574(,依据,10,折交叉验证,),37,Lasso(lars),predict11-predict(lassolm,data.matrix(crim.train2),mode=,step,s=best,type=fit),predict1-predict(lassolm,data.matrix(crim.test2),mode=,step,s=best,type=fit),cat(lasso,训练集上的,NMSE,为,:,mean(crim.train$violentPerPop-as.numeric(predict11$fit)2)/,mean(mean(crim.train$violentPerPop)-crim.train$violentPerPop)2),n),#lasso,训练集上的,NMSE,为,:0.3248435(,依据,Cp,准则,),cat(lasso,测试集上的,NMSE,为,:,mean(crim.test$violentPerPop-as.numeric(predict1$fit)2)/,mean(mean(crim.test$violentPerPop)-crim.test$violentPerPop)2),n),#lasso,测试集上的,NMSE,为,:0.3352093(,依据,Cp,准则,),38,Lasso,#,下面我们来看看上面(根据,10,折交叉验证得出的,lasso,回归方程)它的残差项的正态性检验。,shapiro.test(crim.train$violentPerPop-predict11$fit)#,训练集上的残差检验,#W=0.8679,p-value 2.2e-16,shapiro.test(crim.test$violentPerPop-predict1$fit)#,测试集上的残差检验,W=0.8839,p-value 2.2e-16,可以看出上述模型的残差项仍然不满足正态性的分布假定,虽然达到了较好的预测精度,但是我们的模型还需要进一步改进,39,Ridge&Lasso,实际上,岭回归和,lasso,方法都是用于处理模型变量共线性的方式。在传统线性回归当中,变量共线性极有可能导致估计的回归系数的不稳定(这一特性在样本总量较少而变量总数较多的情形下尤其显著),这一缺点可以通过对回归系数加以约束得到改善。,不妨设约束函数为如下形式,则岭回归和,lasso,回归可以在参数族的形式下得到统一(岭回归:,r=2;lasso:r=1,),虽然只是参数取法上的不一致,但由于约束函数凹凸函数不同的特性(,r1,为凸函数)导致了最终系数特点的不一致。对于岭回归,随着,t,的减小,模型系数绝对值一般“步调一致”的收缩;对于,lasso,回归,则更倾向于将部分变量的系数收敛到,0,而保持另外一些变量系数的大小来达到约束条件(这实际上增加了最终系数的差异),对于,r,取值的其他情形而导致的后果也可由函数凹凸性作相似推断。具体参见,Fast Sparse Regression and Classification,Jerome H.Friedman 2008,40,Ridge&Lasso,这一参数族中,r,的选取也带来很多问题,对于,r1,,最终系数不易收缩到,0,,这不助于变量的筛选;而对于,r1/2,时也能得到同样的效果。这一方法提高了原系数估计的稳定性。,42,Generalized elastic net,#elastic net,fit2-msgps(as.matrix(crim.train2),crim.train$violentPerPop,penalty=enet,alpha=0.5),summary(fit2),coef(fit2),plot(fit2,criterion=cp),43,Generalized elastic net,44,Generalized elastic net,#,根据,Cp,原则,NMSE.train=c(),NMSE.test=c(),for(i in 1:5),crim.test=crim1ddi,crim.train=crim1-ddi,#,训练集,gangUnit5=rep(0,1772);gangUnit5which(crim.train$gangUnit=5)=1,gangUnit10=rep(0,1772);gangUnit10which(crim.train$gangUnit=10)=1,crim.train1=crim.train,c(6:129);crim.train1$gangUnit=NULL,crim.train2=data.frame(crim.train1,1:121,gangUnit5,gangUnit10,crim.train1,-(1:121),#,测试集,gangUnit5=rep(0,443);gangUnit5which(crim.test$gangUnit=5)=1,gangUnit10=rep(0,443);gangUnit10which(crim.test$gangUnit=10)=1,crim.test1=crim.test,c(6:129);crim.test1$gangUnit=NULL,crim.test2=data.frame(crim.test1,1:121,gangUnit5,gangUnit10,crim.test1,-(1:121),45,Generalized elastic net,fit-msgps(as.matrix(crim.train2),crim.train$violentPerPop,penalty=enet,alpha=0.5),#,训练集,predict11-predict(fit,as.matrix(crim.train2),1,NMSE.train=c(NMSE.train,mean(crim.train$violentPerPop-as.numeric(predict11)2)/,mean(mean(crim.train$violentPerPop)-crim.train$violentPerPop)2),#,测试集,predict1-predict(fit,as.matrix(crim.test2),1,NMSE.test=c(NMSE.test,mean(crim.test$violentPerPop-as.numeric(predict1)2)/,mean(mean(crim.test$violentPerPop)-crim.test$violentPerPop)2),NMSE.train;mean(NMSE.train),NMSE.test;mean(NMSE.test),46,Generalized elastic net,penalty=“genet”(penalty=“alasso”,时计算出现奇异值系统报错,),47,Model buildingData Mining,48,K,临近回归,library(kknn),NMSE=c(),MSE=c(),for(i in 1:5),crim.test=crim1ddi,crim.train=crim1-ddi,knn1lm-kknn(murders.,crim.train,6:130,crim.test,6:130,k=1,distance=1,kernel=rectangular),NM=mean(crim.test$murders-knn1lm$fitted.values)2)/mean(mean(crim.test$murders),-crim.test$murders)2),M=mean(crim.test$murders-knn1lm$fitted.values)2),NMSE=c(NMSE,NM),MSE=c(MSE,M),49,虽然该算法主要用于分类。不用于拟合模型,但其较为稳定,可先利用该模型观察拟合效果以及预测精度再试图从不稳定模型中得到提升。,K,临近回归,50,最终达到的预测精度如下,可见该方法的预测精度仍然较低:,回归树,library(rpart)#,调用,rpart,包,crim.test=data.frame(crim1dd1,),crim.train=data.frame(crim1-dd1,),rt.train=rpart(violentPerPop.,data=crim.train,c(6:129,146),plot(rt.train,uniform=T,branch=1,margin=0.1,cex=0.9,main=violentPerPop)#,画出回归树,text(rt.train,cex=0.75)#,在树中显示分枝的信息。,printcp(rt.train)#,显示回归树,rt.train,每一步得出的,sub-trees,的详细信息,51,回归树,52,回归树,treepre.train=predict(rt.train,crim.train,c(6:129,146),cat(tree,训练集上的,NMSE,为,:,mean(crim.train,c(6:129,146)$violentPerPop-as.numeric(treepre.train)2)/,mean(mean(crim.train,c(6:129,146)$violentPerPop)-crim.train,c(6:129,146)$violentPerPop)2),n),#tree,训练集上的,NMSE,为,:0.3664984,treepre.test=predict(rt.train,crim.test,c(6:129,146),cat(tree,训练集上的,NMSE,为,:,mean(crim.test,c(6:129,146)$violentPerPop-as.numeric(treepre.test)2)/,mean(mean(crim.test,c(6:129,146)$violentPerPop)-crim.test,c(6:129,146)$violentPerPop)2),n),#tree,测试集上的,NMSE,为,:0.4828972,53,回归树:五折交叉验证,for(i in 1:5),crim.test=data.frame(crim1ddi,),crim.train=data.frame(crim1-ddi,),rt.train=rpart(violentPerPop.,data=crim.train,c(6:129,146),treepre.train=predict(rt.train,crim.train,c(6:129,146),treepre.test=predict(rt.train,crim.test,c(6:129,146),NM.train=mean(crim.train$violentPerPop-treepre.train)2)/,mean(mean(crim.train$violentPerPop)-crim.train$violentPerPop)2),NM.test=mean(crim.test$violentPerPop-treepre.test)2)/,mean(mean(crim.test$violentPerPop)-crim.test$violentPerPop)2),M.train=mean(crim.train$violentPerPop-treepre.train)2),M.test=mean(crim.test$violentPerPop-treepre.test)2),NMSE.train=c(NMSE.train,NM.train),NMSE.test=c(NMSE.test,NM.test),MSE.train=c(MSE.train,M.train),MSE.test=c(MSE.test,M.test),54,回归树,55,Boosting(mboost),for(i in 1:5),crim.test=data.frame(crim1ddi,),crim.train=data.frame(crim1-ddi,),boost.train=blackboost(violentPerPop.,control=boost_control(mstop=50),data=crim.train,c(6:129,146),treepre.train=predict(boost.train,crim.train,c(6:129,146),treepre.test=predict(boost.train,crim.test,c(6:129,146),NM.train=mean(crim.train$violentPerPop-treepre.train)2)/,mean(mean(crim.train$violentPerPop)-crim.train$violentPerPop)2),NM.test=mean(crim.test$violentPerPop-treepre.test)2)/,mean(mean(crim.test$violentPerPop)-crim.test$violentPerPop)2),M.train=mean(crim.train$violentPerPop-treepre.train)2),M.test=mean(crim.test$violentPerPop-treepre.test)2),NMSE.train=c(NMSE.train,NM.train),NMSE.test=c(NMSE.test,NM.test),MSE.train=c(MSE.train,M.train),MSE.test=c(MSE.test,M.test),56,Boosting,57,Bagging,Bagging,是,Breiman,提出的与,Boosting,相似的技术。,Bagging,技术的主要思想是给定一弱学习算法和一训练集,1 1(,),.,(,)n n x y x y,。让该学习算法训练多轮,每轮的训练集由从初始的训练集中随机取出的,n,个训练例组成,初始训练例在某轮训练集中可以出现多次或根本不出现。训练之后可得到一个预测函数序列:,1,.,t h h,,最终的预测函数,H,对分类问题采用投票方式,对回归问题采用简单平均方法对新示例进行判别。,Bagging,与,Boosting,的区别在于,Bagging,的训练集的选择是随机的,各轮训练集之间相互独立,而,Boosting,的训练集的选择不是独立的,各轮训练集的选择与前面各轮的学习结果有关;,Bagging,的各个预测函数没有权重,而,Boosting,是有权重的;,Bagging,的各个预测函数可以并行生成,而,Boosting,的各个预测函数只能顺序生成。对于象神经网络这样极为耗时的学习方法,,Bagging,可通过并行训练节省大量时间开销。以下我将通过,R,语言中的,ipred,包运用,Bagging,算法对该数据集进行分析研究。,58,Bagging(ipred),for(i in 1:5),crim.test=data.frame(crim1ddi,),crim.train=data.frame(crim1-ddi,),bagging.vio=bagging(violentPerPop.,data=crim.train,c(6:129,146),coob=T,control=rpart.control(xval=10),pre.train=predict(bagging.vio,crim.train,c(6:129,146),pre.test=predict(bagging.vio,crim.test,c(6:129,146),NM.train=mean(crim.train$violentPerPop-pre.train)2)/,mean(mean(crim.train$violentPerPop)-crim.train$violentPerPop)2),NM.test=mean(crim.test$violentPerPop-pre.test)2)/,mean(mean(crim.test$violentPerPop)-crim.test$violentPerPop)2),M.train=mean(crim.train$violentPerPop-pre.train)2),M.test=mean(crim.test$violentPerPop-pre.test)2),NMSE.train=c(NMSE.train,NM.train),NMSE.test=c(NMSE.test,NM.test),MSE.train=c(MSE.train,M.train),MSE.test=c(MSE.test,M.test),59,Bagging,60,随机森林(,randomForest,),randomforest.violentPerPop-randomForest(violentPerPop .,data=crim.train,c(6:129,146),ntree=500,importance=TRUE,proximity=TRUE),randomforest.violentPerPop$importance#,查看解释变量对模型的贡献性的大小,randomforest.violentPerPop$importanceSD,61,随机森林(,randomForest,),#,贡献度最大的前十个变量,names(crim.train,c(6:129,146)sort(randomforest.violentPerPop$importance,1,decreasing=T,index.return=T)$ix1:10,plot(randomforest.violentPerPop$importanceSD),identify(1:124,randomforest.violentPerPop$importanceSD,labels=names(randomforest.violentPerPop$importanceSD),62,随机森林(,randomForest,),63,随机森林(,randomForest,),64,总结,65,方法,NMSE,训练集,测试集,传统统计方法,线性回归,0.2900,0.3729,逐步回归,0.2964,0.3774,lasso,0.3051,0.3389,Generalized elastic net,0.2938,0.3677,数据挖掘,K,临近回归,无,0.6257,回归树,0.3529,0.4627,Boosting,0.2753,0.3496,Bagging,0.2695,0.3589,随机森林,0.3258,0.3228,Shock Data,(Data source),66,数据预处理,67,shock=read.table(shock.txt,header=T),head(shock),shock$SHOCK_TYP=as.factor(shock$SHOCK_TYP),shock$SURVIVE=as.factor(shock$SURVIVE),shock$SEX=as.factor(shock$SEX),shock$RECORD=as.factor(shock$RECORD),数据描述,68,69,数据描述,70,数据描述,71,数据描述,Record,不同时的,shock type,完全相同,72,数据描述,由图可知,Record,不同时各观测值有差异但不明显,由箱盒图可以看到,HT,与,RCI,中存在离群值,贝叶斯分类,distinguish.bayes-function,(TrnX,TrnG,p=rep(1,length(levels(TrnG),TstX=NULL,var.equal=FALSE),if(is.factor(TrnG)=FALSE),mx-nrow(TrnX);mg-nrow(TrnG),TrnX-rbind(TrnX,TrnG),TrnG-factor(rep(1:2,c(mx,mg),if(is.null(TstX)=TRUE)TstX-TrnX,if(is.vector(TstX)=TRUE)TstX-t(as.matrix(TstX),else if(is.matrix(TstX)!=TRUE),TstX-as.matrix(TstX),if(is.matrix(TrnX)!=TRUE)TrnX-as.matrix(TrnX),nx-nrow(TstX),blong-matrix(rep(0,nx),nrow=1,dimnames=list(blong,1:nx),g-length(levels(TrnG),mu-matrix(0,nrow=g,ncol=ncol(TrnX),73,贝叶斯分类,for(i in 1:g),mui,-colMeans(TrnXTrnG=i,),D-matrix(0,nrow=g,ncol=nx),if(var.equal=TRUE|var.equal=T),for(i in 1:g),d2-mahalanobis(TstX,mui,var(TrnX),Di,-d2-2*log(pi),else,for(i in 1:g),S-var(TrnXTrnG=i,),d2-mahalanobis(TstX,mui,S),Di,-d2-2*log(pi)-log(det(S),for(j in 1:nx),dmin-Inf,for(i in 1:g),if(Di,j dmin),dmin-Di,j;blongj-i,blong,74,贝叶斯分类,shock2=shock,shock2$SURVIVE=as.numeric(shock2$SURVIVE),shock2$SEX=as.numeric(shock2$SEX),shock2$RECORD=as.numeric(shock2$RECORD),distinguish.bayes(shock2,-c(1,6),shock2$SHOCK_TYP),#,将因子数据转化为,0 1,变量,shock2=shock,-c(which(names(shock)=SHOCK_TYP),which(names(shock)=SURVIVE),which(names(shock)=SEX),which(names(shock)=RECORD),shock3=cbind(shock2,sex=as.numeric(sex,1),survive=as.numeric(survive,1),record=as.numeric(record,1),75,决策树,library(rpart)#,调用,rpart,包,rt.type-rpart(SHOCK_TYP .,data=shock-dd1,-1),rt.type,76,决策树,77,决策树,printcp(rt.type)#,显示回归树,rt.type,每一步得出的,sub-trees,的详细信息,78,决策树,#,五折交叉验证,train=c();test=c();,for(i in 1:5),rt.type-rpart(SHOCK_TYP .,data=shock-ddi,),c1=t(table(predict(rt.type,shock-ddi,type=class),shock-ddi,6),c2=t(table(predict(rt.type,shockddi,type=class),shockddi,6),train=c(train,sum(diag(c1)/sum(c1),test=c(test,sum(diag(c2)/sum(c2),train;mean(train),test;mean(test),79,最邻近算法,80,#,五折交叉验证,对,k=1:15,做循环,final.test=c();final.mean=c(),for(j in 1:15),test=c();,for(i in 1:5),knn1lm-kknn(SHOCK_TYP.,shock-ddi,shockddi,k=j,distance=1,kernel=rectangular),c=table(shockddi,6,knn1lm$fitted.values),test=c(test,sum(diag(c)/sum(c),final.test=cbind(final.test,test),final.mean=c(final.mean,mean(test),final.mean;max(final
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 环境建筑 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服