@Override public NumericVectorFeature getCentroid() { // create the centroid geospatial feature set NumericVectorFeature mean = new NumericVectorFeature(name); mean.setValue(meanVector); mean.setWeight(weight); return mean; }
@Override public String toString() { return (this.getName() + ":" + vectorToString()); }
@Override public void remove(NumericVectorFeature feature) { double removedWeight = feature.getWeight(); double newWeight = weight - removedWeight; if (0.0 == weight) return; // decrement centroid vector for (int i=0; i < meanVector.length; i++) { meanVector[i] = (meanVector[i] * weight - feature.getValue()[i] * removedWeight) / newWeight; } weight = newWeight; }
public NumericVectorFeature fieldToNumericVectorFeature(String name) { Field field = fields.get(name); if (field == null) return null; NumericVectorFeature feature = null; try { feature = new NumericVectorFeature(field.name); String val = field.value.substring(1, field.value.length()-1); // strip off enclosing [ ] if (val.isEmpty()) return null; String[] entries = val.split(";"); double[] vector = new double[entries.length]; for (int i=0; i < entries.length; i++) { if (entries[i].isEmpty()) continue; vector[i] = Double.parseDouble(entries[i]); } feature.setValue(vector); } catch (Exception e) { e.printStackTrace(); } return feature; } }
public void setValue(List<Double> vector) { setValue(new ArrayList<Double>(vector)); }
@Override public double distance(NumericVectorFeature x, NumericVectorFeature y) { double[] vector1 = x.getValue(); double[] vector2 = y.getValue(); double d = 0; for (int i = 0; i < vector1.length; i++) { d += Math.pow(vector1[i] - vector2[i], 2); } // return euclidean distance return Math.sqrt( d / (double)vector1.length ); } }
@Override public void add(NumericVectorFeature feature) { double addedWeight = feature.getWeight(); double newWeight = weight + addedWeight; if (meanVector == null) { if (feature.getValue() != null) { meanVector = feature.getValue().clone(); weight = addedWeight; } } else { if (feature.getValue() != null) { // incrementally revise the centroid vector for (int i=0; i < meanVector.length; i++) { meanVector[i] = (meanVector[i] * weight + feature.getValue()[i] * addedWeight) / newWeight; } weight = newWeight; } } }