private <V extends Number> ClusterAffinityDistribution<V> evaluateDistance(ValueFactory<V> valueFactory, ComparisonMeasure comparisonMeasure, List<ClusteringField> clusteringFields, List<FieldValue> values){ ClusteringModel clusteringModel = getModel(); List<Cluster> clusters = clusteringModel.getClusters(); Value<V> adjustment; MissingValueWeights missingValueWeights = clusteringModel.getMissingValueWeights(); if(missingValueWeights != null){ Array array = missingValueWeights.getArray(); List<? extends Number> adjustmentValues = ArrayUtil.asNumberList(array); if(values.size() != adjustmentValues.size()){ throw new InvalidElementException(missingValueWeights); } adjustment = MeasureUtil.calculateAdjustment(valueFactory, values, adjustmentValues); } else { adjustment = MeasureUtil.calculateAdjustment(valueFactory, values); } ClusterAffinityDistribution<V> result = createClusterAffinityDistribution(Classification.Type.DISTANCE, clusters); for(Cluster cluster : clusters){ List<FieldValue> clusterValues = CacheUtil.getValue(cluster, ClusteringModelEvaluator.clusterValueCache); if(values.size() != clusterValues.size()){ throw new InvalidElementException(cluster); } Value<V> distance = MeasureUtil.evaluateDistance(valueFactory, comparisonMeasure, clusteringFields, values, clusterValues, adjustment); result.put(cluster, distance); } return result; }
@Override public VisitorAction accept(Visitor visitor) { VisitorAction status = visitor.visit(this); if (status == VisitorAction.CONTINUE) { visitor.pushParent(this); if ((status == VisitorAction.CONTINUE)&&hasExtensions()) { status = PMMLObject.traverse(visitor, getExtensions()); } if (status == VisitorAction.CONTINUE) { status = PMMLObject.traverse(visitor, getMiningSchema(), getOutput(), getModelStats(), getModelExplanation(), getLocalTransformations(), getComparisonMeasure()); } if ((status == VisitorAction.CONTINUE)&&hasClusteringFields()) { status = PMMLObject.traverse(visitor, getClusteringFields()); } if (status == VisitorAction.CONTINUE) { status = PMMLObject.traverse(visitor, getCenterFields(), getMissingValueWeights()); } if ((status == VisitorAction.CONTINUE)&&hasClusters()) { status = PMMLObject.traverse(visitor, getClusters()); } if (status == VisitorAction.CONTINUE) { status = PMMLObject.traverse(visitor, getModelVerification()); } visitor.popParent(); } if (status == VisitorAction.TERMINATE) { return VisitorAction.TERMINATE; } return VisitorAction.CONTINUE; }
@Override public VisitorAction accept(Visitor visitor) { VisitorAction status = visitor.visit(this); if (status == VisitorAction.CONTINUE) { visitor.pushParent(this); if ((status == VisitorAction.CONTINUE)&&hasExtensions()) { status = PMMLObject.traverse(visitor, getExtensions()); } if (status == VisitorAction.CONTINUE) { status = PMMLObject.traverse(visitor, getMiningSchema(), getOutput(), getModelStats(), getModelExplanation(), getLocalTransformations(), getComparisonMeasure()); } if ((status == VisitorAction.CONTINUE)&&hasClusteringFields()) { status = PMMLObject.traverse(visitor, getClusteringFields()); } if (status == VisitorAction.CONTINUE) { status = PMMLObject.traverse(visitor, getCenterFields(), getMissingValueWeights()); } if ((status == VisitorAction.CONTINUE)&&hasClusters()) { status = PMMLObject.traverse(visitor, getClusters()); } if (status == VisitorAction.CONTINUE) { status = PMMLObject.traverse(visitor, getModelVerification()); } visitor.popParent(); } if (status == VisitorAction.TERMINATE) { return VisitorAction.TERMINATE; } return VisitorAction.CONTINUE; }