⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 quadraticparameteroptimizationoperator.java

📁 一个很好的LIBSVM的JAVA源码。对于要研究和改进SVM算法的学者。可以参考。来自数据挖掘工具YALE工具包。
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
		}
		else{
		    currentIndex[i] = bestIndex[i];
		};
		paramIndex = paramIndex*(values[i]).length+currentIndex[i];
	    };

	    int row=0;
	    int c;
	    while(row < Designmatrix.getRowDimension()){
		y.set(row,0,allParameters[paramIndex].getPerformance().getMainCriterion().getValue()); // Performance Zahl?		
		Designmatrix.set(row,0,1.0);
		c = 1;
		// compute A
		for(int i=0;i<nrParameters;i++){
		    if((values[i]).length > 2){
			Designmatrix.set(row,c,param2coded(values[i][currentIndex[i]], logBase[i]));
			c++;
		    };
		};
		// compute C
		for(int i=0;i<nrParameters;i++){
		    if((values[i]).length > 2){
			for(int j=i+1;j<nrParameters;j++){
			    if((values[j]).length > 2){
				Designmatrix.set(row,c,
						 param2coded(values[i][currentIndex[i]], logBase[i])*
						 param2coded(values[j][currentIndex[j]], logBase[j]));
			        c++;
			    };
			};
		    };
		};
		// compute Q:
		for(int i=0;i<nrParameters;i++){
		    if((values[i]).length > 2){
			Designmatrix.set(row,c,
					 param2coded(values[i][currentIndex[i]], logBase[i])*
					 param2coded(values[i][currentIndex[i]], logBase[i]));
                        c++;
		    };
		};

		// update currentIndex and paramIndex
		int k=0;
		c=1;
		while(k<parameterList.size()){
		    if((values[k]).length > 2){
			currentIndex[k]++;
			paramIndex+=c;
			if(currentIndex[k] > bestIndex[k]+1){
			    currentIndex[k] = bestIndex[k]-1;
			    paramIndex -= 3*c;
			    c *= values[k].length;
			    k++;
			}
			else{
			    break;
			};
		    }
		    else{
			c *= values[k].length;
			k++;
		    };
		};

		row++;
	    };
            // compute Designmatrix
            Matrix beta = Designmatrix.solve(y);
	    // generate Matrix P~
            Matrix p = new Matrix(nrParameters , nrParameters);
            int betapos = nrParameters + 1;           
            for (int j  = 0; j < (nrParameters - 1); j++) {
                for (int i = 1 + j; i < nrParameters; i++) {
                    p.set(i, j, (beta.get(betapos,0)*0.5));
                    p.set(j, i, (beta.get(betapos,0)*0.5));
                    betapos++;               
                }   
	    }
            for (int i = 0; i < nrParameters; i++) {
                p.set(i, i, beta.get(betapos,0));
                betapos++; 
            }
            // generate Matrix y~
            Matrix y2 = new Matrix(nrParameters,1);
            for (int i = 0; i < nrParameters; i++) {
		y2.set(i,0,beta.get(i+1,0));
	    }
            y2 = y2.times(-0.5);
	    // get stationary point x 
            Matrix x = new Matrix(nrParameters,1);
            try {
		x = p.solve(y2);
	    } catch (RuntimeException e) {
		LogService.logMessage("Quadratic optimization failed! (invalid matrix)", LogService.WARNING);
	    }
	    
            String[] Qvalues = new String[parameterList.size()];
	    int pc = 0;
	    boolean ok=true;
	    for (int j = 0; j < parameterList.size(); j++) {
		if((values[j]).length > 2){
		    if((x.get(pc,0) > Double.parseDouble(values[j][bestIndex[j]+1])) ||
		       (x.get(pc,0) < Double.parseDouble(values[j][bestIndex[j]-1]))){
			LogService.logMessage("Parameter "+parameters[j]+" exceeds region of interest ("+x.get(pc,0)+")", LogService.WARNING);
			if(ifExceedsRegion == CLIP){
			    // clip to bound
			    if(x.get(pc,0) > Double.parseDouble(values[j][bestIndex[j]+1])){
				x.set(pc,0,Double.parseDouble(values[j][bestIndex[j]+1]));
			    }
			    else{
				x.set(pc,0,Double.parseDouble(values[j][bestIndex[j]-1]));
			    };
			}
			else if(ifExceedsRegion == FAIL){
			    ok = false;
			};
		    };
		    if((x.get(pc,0) < Double.parseDouble(values[j][0])) ||
		       (x.get(pc,0) > Double.parseDouble(values[j][values[j].length-1]))){
			LogService.logMessage("Parameter "+parameters[j]+" exceeds range ("+x.get(pc,0)+")", LogService.WARNING);
			if(ifExceedsRange == IGNORE){
			    // ignore error
			    LogService.logMessage("  but no measures taken. Check parameters manually!", LogService.WARNING);
			}
			else if(ifExceedsRange == CLIP){
			    //  clip to bound
			    if(x.get(pc,0) > Double.parseDouble(values[j][0])){
				x.set(pc,0,Double.parseDouble(values[j][0]));
			    }
			    else{
				x.set(pc,0,Double.parseDouble(values[j][values[j].length-1]));
			    };
			}
			else{
			    ok = false;
			};
		    };


		    Qvalues[j] = coded2param(x.get(pc,0), logBase[j]);
		    pc++;
		    // Werte im richtigen Bereich?
		}
		else{
		    Qvalues[j] = values[j][bestIndex[j]];
		};
	    };
	   
	    LogService.logMessage("Optimised parameter set:", LogService.TASK);
	    for (int j = 0; j < operators.length; j++) {
		operators[j].getParameters().setParameter(parameters[j], Qvalues[j]);
		LogService.logMessage("  "+operators[j]+"."+parameters[j]+
				      " = " + Qvalues[j], LogService.TASK);
	    }
	    
	    if(ok){
		setInput(input.copy());
		PerformanceVector Qperformance = getPerformance();
		LogService.logMessage("Old: "+(best.getPerformance().getMainCriterion().getValue()), LogService.STATUS);
		LogService.logMessage("New: "+(Qperformance.getMainCriterion().getValue()), LogService.STATUS);
		if (Qperformance.compareTo(best.getPerformance()) > 0) {
		    best = new ParameterSet(operators, parameters, Qvalues, Qperformance);
		    // log
		    LogService.logMessage("Optimised parameter set does increase the performance",LogService.STATUS);
		}
		else{
		    // anderes log
		    LogService.logMessage("Could not increase performance by quadratic optimization",LogService.STATUS);
		};
	    }
	    else{
		// not ok
		LogService.logMessage("Parameters outside admissible range, not using optimised parameter set.", LogService.WARNING);
	    };
	}
	else{
	    // Warning: no parameters to optimize
	    LogService.logMessage("No parameters to optimize",LogService.WARNING);
	};

	// end quadratic optimization

	String parameterFile = getParameterAsString("parameter_file");
	if (parameterFile != null) {
	    try {
		LogService.logMessage("Writing parameter file: '"+parameterFile+"'", LogService.TASK);
		best.write(new PrintWriter(new FileWriter(getExperiment().resolveFileName(parameterFile))));
	    } catch (IOException e) {
		LogService.logMessage("Cannot write parameter file: '"+parameterFile+"'", LogService.ERROR);
	    }
	}

	return new IOObject[] { best, best.getPerformance() };
    }

    /** Applies the inner operator and employs the PerformanceEvaluator for calculating a list
     *  of performance criteria which is returned. */
    protected PerformanceVector getPerformance() throws OperatorException {
	IOObject[] evalout = super.apply();
	IOContainer evalCont = new IOContainer(evalout);
	return (PerformanceVector)evalCont.getInput(PerformanceVector.class);
    }

    public Class[] getInputClasses() {
	return new Class[0];
    }

    public Class[] getOutputClasses() {
	return OUTPUT_CLASSES;
    }

    public Class[] checkIO(Class[] input) throws IllegalInputException {
	for (int i = 0; i < getNumberOfOperators(); i++) {
	    Operator o = getOperator(i);
	    input = o.checkIO(input);
	}
	return OUTPUT_CLASSES;
    }


    /** Returns the highest possible value for the maximum number of innner operators. */
    public int getMaxNumberOfInnerOperators() { return Integer.MAX_VALUE; }
    /** Returns 1 for the minimum number of innner operators. */
    public int getMinNumberOfInnerOperators() { return 1; }

    public int getNumberOfSteps() {
	return 1+numberOfCombinations * (getNumberOfChildrensSteps() + 1);
    }


    public List getParameterTypes() {
	List types = super.getParameterTypes();
// 	ParameterType type = new ParameterTypeList("parameters", "A list of parameters to optimise", 
// 						   new ParameterTypeString("value", "The values of the parameter (comma-separated"));
	ParameterType type = new ParameterTypeList("parameters", "List of key value pairs where the key is the parameter name and the value specifies the parameter value to optimize.", 
						   new ParameterTypeParameterValue("parameter", "operator.OPERATORNAME.PARAMETER_NAME.PARAMETER_VALUE"));
	type.setExpert(false);
	types.add(type);
	types.add(new ParameterTypeFile("parameter_file", "A file that the optimal parameter set will be written to.", true));

	types.add(new ParameterTypeCategory("if_exceeds_region", "What to do if range is exceeded.", EXCEED_BEHAVIORS, CLIP));	
	types.add(new ParameterTypeCategory("if_exceeds_range", "What to do if range is exceeded.", EXCEED_BEHAVIORS, FAIL));

	return types;
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -