我的libsvm文档java 文档_第1页
我的libsvm文档java 文档_第2页
我的libsvm文档java 文档_第3页
我的libsvm文档java 文档_第4页
我的libsvm文档java 文档_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、LibSVMJAVA)二次开发接口调用及源码更改的文档浙江大学协调服务研究所文档整理:陈伟chenweishaoxing#F载libsvm方法:googlelibsvm找到官网下载: HYPERLINK .tw/cjlin/libsvm/%ef%bc%8c%e5%85%b6%e4%b8%ad%e5%9b%be%e7%89%87%e4%b8%ad%e6%a4%ad%e5%9c%86%e7%9a%84 .tw/cjlin/libsvm/,其中图片中椭圆的Chih-ChungChangandCIiih-JenLin解压文档下载下来libsvm工具包有几个版本的,其中python的最经典,用的人比较多

2、,还支持matlab,C+等等。我们用的java版的,就到解压开的java文件夹中!立件四盂龄査看加收荒工&帮助肓退T文件夹电址3I二1比、我的诚栩ElLibmT.LjMlb57T-3.lL迺Fjivni-toy|toolE.jvaadw怛COPYEEtfr囿F阳hVil直hcart_3cnLc.t馬H血Fih宜inn.cpp2svn.dfIItsvn.h回EWi-priiLct.c|ETV-LC1-CKvri-trxiTicava.i7j-JKBKBEB文件FirtfoMZliJCjncD.1.LEBIEBBKB7KB9KB屮语菖源程序文悴:DEB文悴C血“址fili缩誣憧序文件坯胡融丈杵坯

3、言瓏序丈件脚El期SO11-L1-5L4:E3SOil-LO-lO12:40S011-L1-5L4:22EOji-5-jiL0:152O31-LO-3D22:01E0-L-5an3-7-EO-6Z55:35L:S?:35LZ:D?3:552O:1L2Q11-LO-3013;402Q11-5-2TLl;3201Q-9-12;1L2011-5-TLL.14S03J-M2021tJJ-Er-2fl22:19SU31-&-2?L:2fjava文件夹lib5V1TIlibsj:HgM:4zef辽E圍vttiPrydict.jivaevttiec:ale.JavaEPTTitoy.javasTTtrain

4、.javatest_:=Lpplet.html.大小i类型修改日期丈件夹2011-11-514:23毎KEJAR文件2011-11-514;231KES009-2-188:415KBJAVA丈件2009-3-184:Z09KBJAVA立悴2011-5-2821912KEJAVA丈件-.2010-12-1317:43:9KBJAVA文件2011-5-28隣:191KEFiref03:DocuiTiHjiLt200-7-fK12:07沥码直接复制Jeclipze中导入到eclipse工程中创建一个java工程,把上图的源码复制到eclipse中,如同所示11ewiffl-ffl-fflffiaff

5、la3:aa-fflm:甲.国:由由国:国:-A由:ffl.毎ST-Tii_model.avast-tti_ilo1a.java5Wi_p:arametei-jaya5T-Tii_firint_interface.j:iv:swijroblem.javaET-TTi.jst-tii.mA71ceST-Tiijredict.javaEWi_EC:ilf!.jaT.raswi_toy.java三wri.tr:elltl.java口-呢TEESystemLibraryrMvEclLPs6.01在工程下创建一个文件夹,里面存放训练测试用的数据LibsiTi1ez-ztJEmo-1,Z7Li-bSTml

6、estDeinoE-罗型icorri.t;rL-iii:l.p:pr.:lib三VTTi+冷servi十SJRESystemLibraryIdata_-test.txtNyEclipse6.0dmrh:=li3jtie_七盟ttrain1txttr:=LLn2_txtT丄Tl首次调用的Demo举例在java的工程中创建一个属于自己的包,然后写一个mian类。如图-.LibSvmrexiDemo2.-勢srcIIJLibL-wiTe;-:tDeniL_lLitiSijiriTextDeniij?coms-s-:s-;s-:s-;s-;s-:.as-;s-;s-:h-u-0-1-0囚-121圍-e

7、niln;Bl.CunMain.P?tiIJJaa皿vttitrain,lavaETjTri_nijiiel.javaEWi_rL-:idt!.j:歸赶swij:r:iiTiet&r.javaVTri_pfintintEirEajiw.javaELTTijircihlj:vaswi.j:ivaswi.ComMamjavapackagecom.endual.paper.main;importjava.io.IOException;importservice.svm_predict;importservice.svm_train;publicclassComMainpublicstaticvoid

8、main(Stringargs)throwsIOExceptionStringarg=trainfileWtrainl.txt,存放SVM训练模型用的数据的路径trainfileWmodel_r.txt;存放SVM通过训练数据训/练出来的模型的路径Stringparg=trainfiletrain2.txt,这个是存放测试数据trainfileWmodel_r.txt,调用的是训练以后的模型trainfileWout_r.txt;生成的结果的文件的路径System.out.println(”SVM运行开始);创建一个训练对象svm_traint=newsvm_train();创建一个预测或者分

9、类的对象svm_predictp=newsvm_predict();t.main(arg);调用p.main(parg);调用6.运行工程就可以看到了结果了Libsvm二次开发的首先要熟悉调用接口的源码你一定会有疑问:SVM的参数怎么设置,cross-validation怎么用。那么我们首先来说明一个问题,交叉验证在一般情况下要自己开发自己写。Libsvm内置了交叉验证,但是如果我希望用同交叉验证的数据用决策树来做,怎么办,显然Libsvm并没有保存交叉验证的数据。我已经将注释写在了源码中。Svm_train类的文档说明packageservice;importlibsvm.*;importj

10、ava.io.*;importjava.util.*;publicclasssvm_trainprivatesvm_parameterparam;/setbyparse_command_lineprivatesvm_problemprob;/setbyread_problemprivatesvm_modelmodel;privateStringinput_file_name;/setbyparse_command_lineprivateStringmodel_file_name;/setbyparse_command_lineprivateStringerror_msg;privateintc

11、ross_validation;privateintnr_fold;privatestaticsvm_print_interfacesvm_print_null=newsvm_print_interface()publicvoidprint(Strings);privatestaticvoidexit_with_help()System.out.print(Usage:svm_trainoptionstraining_set_filemodel_filen+options:n+-ssvm_type:settypeofSVM(default0)n+0-C-SVCn+1-nu-SVCn+2-one

12、-classSVMn+3-epsilon-SVRn+4-nu-SVRn+-tkernel_type:settypeofkernelfunction(default2)n+0-linear:u*vn+1-polynomial:(gamma*u*v+coef0)Adegreen+2-radialbasisfunction:exp(-gamma*lu-v|A2)n+3-sigmoid:tanh(gamma*u*v+coef0)n+4-precomputedkernel(kernelvaluesintraining_set_file)n+-ddegree:setdegreeinkernelfuncti

13、on(default3)n+-ggamma:setgammainkernelfunction(default1/num_features)n+-rcoef0:setcoef0inkernelfunction(default0)n+-ccost:settheparameterCofC-SVC,epsilon-SVR,andnu-SVR(default1)n+-nnu:settheparameternuofnu-SVC,one-classSVM,andnu-SVR(default0.5)n+-pepsilon:settheepsiloninlossfunctionofepsilon-SVR(def

14、ault0.1)n+-mcachesize:setcachememorysizeinMB(default100)n+-eepsilon:settoleranceofterminationcriterion(default0.001)n+-hshrinking:whethertousetheshrinkingheuristics,0or1(default1)n+-bprobability_estimates:whethertotrainaSVCorSVRmodelforprobabilityestimates,0or1(default0)n+-wiweight:settheparameterCo

15、fclassitoweight*C,forC-SVC(default1)n+-vn:n-foldcrossvalidationmoden+-q:quietmode(nooutputs)n);System.exit(1);privatevoiddo_cross_validation()inti;inttotal_correct=0;doubletotal_error=0;doublesumv=0,sumy=0,sumvv=0,sumyy=0,sumvy=0;doubletarget=newdoubleprob.l;svm.svm_cross_validation(prob,param,nr_fo

16、ld,target);if(param.svm_type=svm_parameter.EPSILON_SVR|param.svm_type=svm_parameter.NU_SVR)for(i=0;iprob.l;i+)doubley=prob.yi;doublev=targeti;total_error+=(v-y)*(v-y);sumv+=v;sumy+=y;sumvv+=v*v;sumyy+=y*y;sumvy+=v*y;System.out.print(CrossValidationMeansquarederror=+total_error/prob.l+n);System.out.p

17、rint(CrossValidationSquaredcorrelationcoefficient=+(prob.l*sumvy-sumv*sumy)*(prob.l*sumvy-sumv*sumy)/(prob.l*sumvv-sumv*sumv)*(prob.l*sumyy-sumy*sumy)+n);elsefor(i=0;iprob.l;i+)if(targeti=prob.yi)+total_correct;System.out.print(CrossValidationAccuracy=+100.0*total_correct/prob.l+%n);privatevoidrun(S

18、tringargv)throwsIOExceptionSystemout.printn(我的数组的长度是:+argv.length);parse_command_line(argv);/解析svm参数的配置,我们去这个方法看看,你可以按住crlt,然后鼠标点击这个方法read_problem();error_msg=svmsvm_check_parameter(prob,param);if(error_msg!=null)Systemerrprint(ERROR:+error_msg+n);Systemexit(1);if(cross_validation!=0)do_cross_valida

19、tion();elsemodel=svm.svm_train(prob,param);svm.svm_save_model(model_file_name,model);publicstaticvoidmain(Stringargv)throwsIOExceptionsvm_traint=newsvm_train();t.run(argv);privatestaticdoubleatof(Strings)doubled=Double.valueOf(s).doubleValue();if(Double.isNaN(d)|Double.isInfinite(d)System.err.print(

20、NaNorInfinityininputn);System.exit(1);return(d);解析控制台输入的string类型的值,因为svm的参数是由整数来代表的,/那么通过这个方法将控制台输入的字符串解析成为整数的privatestaticintatoi(Strings)returnInteger.parseInt(s);/欢迎来到解析svm参数的方法privatevoidparse_command_line(Stringargv)inti;设置了一个方法域的一个i变量,用于遍历argv这个字符串数组的的哦svm_print_interfaceprint_func=null;/defau

21、ltprintingtostdout,这个是一个接口创建一个SVM的参数对象,SVM的参数都在这个对象中。具体的参数对象可以看svm_parameter这个类param=newsvm_parameter();/默认的SVM设置的值,如果需要修改,那么要从控制台输入,然后下面的for循环会解析svm的参数设置/我还没用全部搞懂这些参数的意思,但是这些参数的作用完全可以在帮助信息中看到。param.svm_type=svm_parameter.C_SVC;/默认的支持向量/param.svm_type=svm_parameter.NU_SVC;param.kernel_type=svm_param

22、eter.RBF;/默认的核函数高斯核函数param.degree=3;param.gamma=0;/1/num_featuresparam.coef0=0;param.nu=0.01;param.cache_size=100;param.C=1;param.eps=1e-3;param.p=0.1;param.shrinking=1;bability=0;param.nr_weight=0;param.weight_label=newint0;param.weight=newdouble0;cross_validation=0;/表示关闭交叉验证,1表示开启交叉验证(这里不能设置1,因为你设

23、置了也没用)/解析选项SVM参数的选项,如果控制台没有输入对于的字符串,那么SVM将使用的是默认的SVM的参数设置for(i=0;i=argv.length这个应该是先用i再加1,那么下面的操作的时候就是i=i+1了(i=5)if(+i=argv.length)exit_with_help();如果执行了第二个f那么会执行到这里了。这里的i=5switch(argvi-1.charAt(1)/用到的字符串仍然是argv5-1=argv4,解析的是第2个字符。cases:/设置svm的类型param.svm_type=atoi(argvi);/这个赋值就是将argv5,赋值过去了break;ca

24、set:/设置svm的核函数类型param.kernel_type=atoi(argvi);break;cased:/设置svm参数d的大小,用于多项式核函数param.degree=atoi(argvi);break;caseg:/赋值gamma的param.gamma=atof(argvi);break;caser:/赋值coef0的值param.coef0=atof(argvi);break;casen:/赋值n的值param.nu=atof(argvi);break;casem:/赋值缓存的值param.cache_size=atof(argvi);break;casec:/赋值的是惩

25、罚因子的大小param.C=atof(argvi);break;casee:/赋值的eps的值param.eps=atof(argvi);break;casep:/赋值*我不想写下去了,因为在实际的应用中,我还没用用到下面的参数。抱歉。param.p=atof(argvi);break;caseh:/param.shrinking=atoi(argvi);break;caseb:/要不要打印出分类的准确率的值bability=atoi(argvi);break;caseq:print_func=svm_print_null;i-;break;casev:/设置的交叉验证的值cross_vali

26、dation=1;/开启交叉验证nr_fold=atoi(argvi);if(nr_fold=2n);exit_with_help();break;casew:+param.nr_weight;intold=param.weight_label;param.weight_label=newintparam.nr_weight;System.arraycopy(old,0,param.weight_label,0,param.nr_weight-1);doubleold=param.weight;param.weight=newdoubleparam.nr_weight;System.array

27、copy(old,0,param.weight,0,param.nr_weight-1);param.weight_labelparam.nr_weight-1=atoi(argvi-1.substring(2);param.weightparam.nr_weight-1=atof(argvi);break;default:如果一个字符都匹配不到,很遗憾要中断JVM了,并且会打印出那个位子的字符出现了错误,然后打印出帮助信息System.err.print(Unknownoption:+argvi-1+n);exit_with_help();/endswitch/endforsvm.svm_s

28、et_print_string_function(print_func);/打印出是不是静音模/determinefilenames决定文件名/*我必须中断下操作来说明控制台应该怎么输入的argv=-s,1,-t,3,-w,5,我是训练用的文件路径,我是训练完以后保存模型的路径具体的1,3,5参数要参考官方说明文档,或者查看设置参数那个类的参数。看到这,你可以继续看下去了*/f(i=argvlength)这里是了防止没有输入存放文件的路径,或者存放文件的路径不够exit_with_help();到这里,i的应该是字符串数组的倒数第二个了其实我一直搞不清楚,为什么for循环完毕了,这个i不是ar

29、gv数组的长度呢?不是的i的值是数组长度-1也就是数组中倒数第二个位子input_file_name=argvi;/将训练的文件路径赋值System.out.println(POSITION=+(i+1)+我的训练用的数据存放的路径是:+input_file_name);if(iargv.length-1)/如果i的值比数组长度-1还小,那么将argvi下一个字符串赋值给存放模型的路径model_file_name=argvi+1;/将训练以后的模型路径赋值elseintp=argvilastIndexOf(/);+p;/whewmodel_file_name=argvisubstring(p

30、)+model;Systemoutprintln(我的训练用的数据存放的路径是:+model_file_name);/endrunfunction/readinaproblem(insvmlightformat)privatevoidread_problem()throwsIOExceptionBufferedReaderfp=newBufferedReader(newFileReader(input_file_name);Vectorvy=newVector();Vectorvx=newVector();intmax_index=0;while(true)Stringline=fp.read

31、Line();if(line=null)break;StringTokenizerst=newStringTokenizer(line,tnrf:);vy.addElement(atof(st.nextToken();intm=st.countTokens()/2;svm_nodex=newsvm_nodem;for(intj=0;j0)max_index=Math.max(max_index,xm-1.index);vx.addElement(x);prob=newsvm_problem();prob.l=vy.size();prob.x=newsvm_nodeprob.l;for(inti

32、=0;iprob.l;i+)prob.xi=vx.elementAt(i);prob.y=newdoubleprob.l;for(inti=0;i0)param.gamma=1.0/max_index;if(param.kernel_type=svm_parameter.PRECOMPUTED)for(inti=0;iprob.l;i+)if(prob.xi0.index!=0)System.err.print(Wrongkernelmatrix:firstcolumnmustbe0:sample_serial_numbern);System.exit(1);if(int)prob.xi0.v

33、aluemax_index)System.err.print(Wronginputsample_serial_numberoutofrangen);System.exit(1);fp.close();Svm_predict类的文档说明packageservice;importlibsvm.*;importjava.io.*;importjava.util.*;publicclasssvm_predictprivatestaticdoubleatof(Strings)returnDouble.valueOf(s).doubleValue();privatestaticintatoi(String

34、s)returnInteger.parseInt(s);privatestaticvoidpredict(BufferedReaderinput,DataOutputStreamoutput,model,intpredict_probability)throwsIOException/欢迎来到这个预测方法,下面开始分析/设置方法内局部变量/这个是预测正确的个数的format:svm_modelintcorrect=0;/这个是预测的个数一共有几个inttotal=0;/分类或者预测的准确率,所以用doubleerror=correct/total;doubleerror=0;/几个中间变量的参

35、数doublesumv=0,sumy=0,sumvv=0,sumyy=0,sumvy=0;intsvm_type=svm.svm_get_svm_type(model);intnr_class=svm.svm_get_nr_class(model);doubleprob_estimates=null;/如果传入进来的1(默认是0),那么从这里开始执行/这个是不能用回归svm的if(predict_probability=1)if(svm_type=svm_parameter.EPSILON_SVR|/回归SVMsvm_type=svm_parameter.NU_SVR)/回归SVM打印出出错误

36、了,svm数据不匹配System.out.print(Prob.modelfortestdata:targetvalue=predictedvalue+z,nz:LaplacedistributioneA(-lzl/sigma)/(2sigma),sigma=+svm.svm_get_svr_probability(model)+n);/用于分类的话就执行这个了elseintlabels=newintnr_class;/取得标签。分类用的标签svm.svm_get_labels(model,labels);prob_estimates=newdoublenr_class;output.writ

37、eBytes(labels);写入到文件中去for(intj=0;jnr_class;j+)output.writeBytes(+labelsj);output.writeBytes(n);/endif/这个一定会执行的while(true)Stringline=input.readLine();/一行一行的读取if(line=null)break;/如果出现空行,那么就停止,所以在文件中中间不能有空行StringTokenizerst=newStringTokenizer(line,tnrf:);doubletarget=atof(st.nextToken();intm=st.countTo

38、kens()/2;svm_nodex=newsvm_nodem;for(intj=0;jm;j+)xj=newsvm_node();xj.index=atoi(st.nextToken();xj.value=atof(st.nextToken();doublev;如果是分类svm就执行这个if(predict_probability=1&(svm_type=svm_parameter.C_SVC|svm_type=svm_parameter.NU_SVC)v=svm.svm_predict_probability(model,x,prob_estimates);output.writeByte

39、s(v+);for(intj=0;jnr_class;j+)output.writeBytes(prob_estimatesj+);output.writeBytes(n);/endidelsev=svm.svm_predict(model,x);output.writeBytes(v+n);/*做二次开发,这里可动手脚,你可以输入要具体预测对的类在这里显示出来等等*/if(v=target)/如果预测正确,那么分类的正确就加一+correct;error+=(v-target)*(v-target);sumv+=v;sumy+=target;sumvv+=v*v;sumyy+=target*

40、target;sumvy+=v*target;+total;/endwhile/如果是回归的svm就用这个if(svm_type=svm_parameter.EPSILON_SVR|svm_type=svm_parameter.NU_SVR)/*这里打印出来的是用于回归问题的信息regression*/System.out.print(Meansquarederror=+error/total+(regression)n);System.out.print(Squaredcorrelationcoefficient=+(total*sumvy-sumv*sumy)*(total*sumvy-s

41、umv*sumy)/(total*sumvv-sumv*sumv)*(total*sumyy-sumy*sumy)+(regression)n);else/这里打印出来的是用于分类问题的信息classificationSystem.out.print(Accuracy=+(double)correct/total*100+%(+correct+/+total+)(classification)n);/endfunctionprivatestaticvoidexit_with_help()System.err.print(usage:svm_predictoptionstest_filemode

42、l_fileoutput_filen+options:n+-bprobability_estimates:whethertopredictprobabilityestimates,0or1(default0);one-classSVMnotsupportedyetn);System.exit(1);/首先从这里读publicstaticvoidmain(Stringargv)throwsIOExceptioninti,predict_probability=0;/设置两个值,后面一个0表示不开启/parseoptions解析选项,解析和train类类似不做说明for(i=0;i=argv.le

43、ngth-2)exit_with_help();tryBufferedReaderinput=newBufferedReader(newFileReader(argvi);DataOutputStreamoutput=newDataOutputStream(newBufferedOutputStream(newFileOutputStream(argvi+2);svm_modelmodel=svm.svm_load_model(argvi+1);if(predict_probability=1)if(svm.svm_check_probability_model(model)=0)System

44、.err.print(Modeldoesnotsupportprobabiliyestimatesn);System.exit(1);elseif(svm.svm_check_probability_model(model)!=0)System.out.print(Modelsupportsprobabilityestimates,butdisabledinprediction.n);/*重点来看这个,我们要预测或者分类,中想返回一个预测正确或者分类正确的类别的*你可以按住Ctrl,然后用鼠标点击这个类三个个参数:一个是模型,已经训练出来的模型一个是输入的测试数据一个是是不是要打印出信息(我没

45、用过,默认是0)*/prediCt(input,output,model,prediCt_probability);input.Close();/涉及到文件的操作有关闭的一些操作output.Close();CatCh(FileNotFoundExCeptione)exit_with_help();catch(ArrayIndexOutOfBoundsExceptione)exit_with_help();卜面是一些二次开发的介绍隔点搜索的代码怎么写?1己直gdm,.iiitfudld:g:ee;:1.我们在寻找最佳svm的参数组合的时候不可能自己去手动的去设置.比如高斯核函数有两个参数要设置

46、,c和gamma.我们要改写train的代码,将c和gama的参数设置到man方法中去,直接通过调用main就可以改变c和gamma的privatevoidinn(StringJdouble了吐2,/parsecomadLine(arc-/;:arsecmeMliiejamjWl险raliegreer?clmefQ);reel:r2blEr.i;叨g=于汕血比咄髀i訊汀巴需:险】芒迎|;打圈的是自己改的。11u-Bvmpzintinterfaceprintfune=null/defaultpr-intinatoatdout-param.=new3vm_paxair.eLei();/leiaul

47、cvaluesaram.日vm_trppe-asTiti_pararceter丿/巌轅颓35_上兀己=svm_paranaeterONE_CXHk5S:/garankemel_type=smparaneter:EOLY汀/冬项式核函数aramkerne1t;ype=儿磁您Emh_说已/Etarankeruel_t了卫eBvm_parableterSBF/集性核函数=3vn_raraneter,LINEAR:默认是径向&=sJTparane匸皂is.SJQoiD;/araiii-degree=3;核函数中fr:bdegree:置(趺认Mrsram.decree=val_deo-ree:caram

48、.garrma=val_cairmfi;f/股蜀校函数中丁的旨默.肋j_,WKjuE(:或圣说是RI1)软/-ireiL.cz:cz2-0;/杭函懸口旳二=上嚴蚩(默认D)param.ucoef0=valccef3;faram.n-j=0.5;/iSv-S7Csone-class-SM-I与n-3VR卩枣数!i、默认113-5:parainc己日丄z已=10D;paramCv-al_c;/V茫名犬悻疋旳短用系歎u竹必,默认值为二param.eps=le:taram.t:=0.;:打请酋丁一二*坯勺恆兴函剳口肘已默认乍拘J.1pardm.snriziring=1;F/是舌便用启发式,可选值为a或

49、二默认(1肯二;bahility=Q;param.rrweignt=0param.eignldce1=newintD;gcram,weight=new曰口ub-leQ|;-O33_-.-3.1ldi3z:n-扌斤去艾萤证桓弍如果你能看懂上面的意思,那么我想你的java基础完全可以想出来怎么讲correct正确的作为返回值返回到主main中,你又可以利用这个来写出属于自己的交叉验证你可以参考一下的调用代码packagecom.endual.paper.main_RBF;importjava.io.BufferedWriter;importjava.io.File;importja

50、va.io.FileWriter;importjava.io.IOException;importservice.svm_predict;importservice.svm_train;publicclassComMain_data_dea/*paramargsthrowsIOException*/publicvoidmain(intix)throwsIOException/TODOAuto-generatedmethodstub/Stringarg=file_traintrainl.txt,file_modeltrainl_model.txt;/Stringparg=file_testtest1.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论