/** * Computes the euclidean centroid, it may not be the formal centroid for different metrics but * intuitively the average counts should provide a good cluster representative which is what this * method intends to return * * @param pwmSet - Collection of pwms from which to compute the centroid0 * @return The euclidean centroid * @throws IllegalArgumentException - When not all PWMs have the same dimension. */ public PositionWeightMatrix centroidOf(Collection<PositionWeightMatrix> pwmSet) throws IllegalArgumentException { Matrix centroidMatrix = null; Iterator<PositionWeightMatrix> pwmIt = pwmSet.iterator(); if (pwmIt.hasNext()) { PositionWeightMatrix first = pwmIt.next(); PositionWeightColumn firstCol = first.get(0); centroidMatrix = new Matrix(firstCol.getAlphabetSize(), first.getNumCol()); addToCentroid(centroidMatrix, first); } while (pwmIt.hasNext()) { PositionWeightMatrix pwm = pwmIt.next(); if (pwm.getNumCol() != centroidMatrix.getColumnDimension()) { throw new IllegalArgumentException( "Error computing centroid. All PWMs in set should have the same dimension"); } addToCentroid(centroidMatrix, pwm); } centroidMatrix.times(1 / (double) pwmSet.size()); PositionWeightMatrix centroid = new PositionWeightMatrix("centroid"); for (int j = 0; j < centroidMatrix.getColumnDimension(); j++) { centroid.addColumn(centroidMatrix.getColumn(j)); } return centroid; }
/** * Creates a PWM of similar dimension to this PWM but with all columns set to the given vector, * usually a neutral mutation vector. * * @param column * @return */ public PositionWeightMatrix createIsoPWM(double[] column, String name) { PositionWeightMatrix pwm = new PositionWeightMatrix(name); for (int i = 0; i < size(); i++) { pwm.addColumn(column); } return pwm; }
public void addPWMColumn(double[] col) { pwm.addColumn(col); }