private boolean recalculateMedoids( Map<Word, Integer> groups, List<Word> medoids, ClusterResult result) { List<Word> temp = new ArrayList<>(); temp.addAll(medoids); boolean changed = false; double minCost = result.quality(); List<Word> nonMedoids = new ArrayList<>(); nonMedoids.addAll(words); nonMedoids.removeAll(temp); if (nonMedoids.size() == 0) return false; // replace a random element in the medoids list with a random element in the non-medoids list int index = new Random().nextInt(nonMedoids.size()); temp.set(new Random().nextInt(k), nonMedoids.get(index)); Map<Word, Integer> newGroups = groupPoints(temp); double newCost = computeCost(temp, newGroups); if (newCost < minCost) { result = updateClusters(temp, newGroups, newCost); changed = true; } return changed; }
public void printTheBestByThr(long thr) { System.out.println("------THE BEST BY SPEAKERil------"); Hashtable cluster = clusterResultSet.getCluster(); Iterator<String> it = cluster.keySet().iterator(); Hashtable<String, Vector> speaker = new Hashtable<String, Vector>(); while (it.hasNext()) { String cr_it = (String) it.next(); // System.out.println(cr_it); ClusterResult cr = (ClusterResult) cluster.get(cr_it); Object[] db_arr = cr.getValue().keySet().toArray(); Arrays.sort(db_arr); int ln = db_arr.length; if (speaker.keySet().contains((String) cr.getValue().get(db_arr[ln - 1]))) { Vector<String> tmp = speaker.get(cr.getValue().get(db_arr[ln - 1])); tmp.add(cr_it); speaker.put((String) cr.getValue().get(db_arr[ln - 1]), tmp); } else { Vector<String> tmp = new Vector<String>(); tmp.add(cr_it); speaker.put((String) cr.getValue().get(db_arr[ln - 1]), tmp); } // System.out.println("score="+db_arr[ln-1] +" name="+cr.getValue().get(db_arr[ln-1]) ); } Iterator<String> sp_it = speaker.keySet().iterator(); // String f // ="/Users/labcontenuti/Documents/workspace/AudioActive/84/test_file/properties/testindent.txt"; OutputStreamWriter dos; try { dos = new OutputStreamWriter(new FileOutputStream(outputRoot + "/" + baseName + "_ident.txt")); while (sp_it.hasNext()) { String key = (String) sp_it.next(); System.out.println("name=" + key); for (int i = 0; i < ((Vector) speaker.get(key)).size(); i++) { TreeMap<Integer, Segment> map = clusterSetResult .getCluster((String) ((Vector) speaker.get(key)).get(i)) .clusterToFrames(); System.out.println( " cluster=" + ((Vector) speaker.get(key)).get(i) + " lenght=" + clusterSetResult .getCluster((String) ((Vector) speaker.get(key)).get(i)) .getLength()); dos.write(((Vector) speaker.get(key)).get(i) + "=" + key + "\n"); } } dos.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
public ClusterSet make( AudioFeatureSet featureSet, ClusterSet clusterSet, GMMArrayList gmmList, GMMArrayList gmmTopList, Parameter parameter) throws DiarizationException, IOException { logger.info("Compute Score"); int size = gmmList.size(); logger.finer("GMM size:" + size); ArrayList<String> genderString = new ArrayList<String>(); ArrayList<String> bandwidthString = new ArrayList<String>(); for (int i = 0; i < size; i++) { String gmmName = gmmList.get(i).getName(); if (parameter.getParameterScore().isGender() == true) { if (gmmName.equals("MS")) { genderString.add(Cluster.genderStrings[1]); bandwidthString.add(Segment.bandwidthStrings[2]); } else if (gmmName.equals("FS")) { genderString.add(Cluster.genderStrings[2]); bandwidthString.add(Segment.bandwidthStrings[2]); } else if (gmmName.equals("MT")) { genderString.add(Cluster.genderStrings[1]); bandwidthString.add(Segment.bandwidthStrings[1]); } else if (gmmName.equals("FT")) { genderString.add(Cluster.genderStrings[2]); bandwidthString.add(Segment.bandwidthStrings[1]); } else { genderString.add(Cluster.genderStrings[0]); bandwidthString.add(Segment.bandwidthStrings[0]); } } else { genderString.add(Cluster.genderStrings[0]); bandwidthString.add(Segment.bandwidthStrings[0]); } } ClusterSet clusterSetResult = new ClusterSet(); for (Cluster cluster : clusterSet.clusterSetValue()) { double[] sumScoreVector = new double[size]; int[] sumLenghtVector = new int[size]; double ubmScore = 0.0; GMM gmmTop = null; if (parameter.getParameterTopGaussian().getScoreNTop() >= 0) { gmmTop = gmmTopList.get(0); } Arrays.fill(sumScoreVector, 0.0); Arrays.fill(sumLenghtVector, 0); for (Segment currantSegment : cluster) { Segment segment = (currantSegment.clone()); int end = segment.getStart() + segment.getLength(); featureSet.setCurrentShow(segment.getShowName()); double[] scoreVector = new double[size]; double maxScore = 0.0; int idxMaxScore = 0; for (int i = 0; i < size; i++) { gmmList.get(i).score_initialize(); } for (int start = segment.getStart(); start < end; start++) { for (int i = 0; i < size; i++) { GMM gmm = gmmList.get(i); if (parameter.getParameterTopGaussian().getScoreNTop() >= 0) { if (i == 0) { gmmTop.score_getAndAccumulateAndFindTopComponents( featureSet, start, parameter.getParameterTopGaussian().getScoreNTop()); } gmm.score_getAndAccumulateForComponentSubset( featureSet, start, gmmTop.getTopGaussianVector()); } else { gmm.score_getAndAccumulate(featureSet, start); } } } if (parameter.getParameterTopGaussian().getScoreNTop() >= 0) { ubmScore = gmmTop.score_getMeanLog(); gmmTop.score_getSumLog(); gmmTop.score_getCount(); gmmTop.score_reset(); } for (int i = 0; i < size; i++) { GMM gmm = gmmList.get(i); scoreVector[i] = gmm.score_getMeanLog(); sumLenghtVector[i] += gmm.score_getCount(); sumScoreVector[i] += gmm.score_getSumLog(); if (i == 0) { maxScore = scoreVector[0]; idxMaxScore = 0; } else { double value = scoreVector[i]; if (maxScore < value) { maxScore = value; idxMaxScore = i; } } gmm.score_reset(); } if (parameter.getParameterScore().isTNorm()) { double sumScore = 0; double sum2Score = 0; for (int i = 0; i < size; i++) { sumScore += scoreVector[i]; sum2Score += (scoreVector[i] * scoreVector[i]); } for (int i = 0; i < size; i++) { double value = scoreVector[i]; double mean = (sumScore - value) / (size - 1); double et = Math.sqrt(((sum2Score - (value * value)) / (size - 1)) - (mean * mean)); scoreVector[i] = (value - mean) / et; } } if (parameter.getParameterScore().isGender() == true) { segment.setBandwidth(bandwidthString.get(idxMaxScore)); segment.setInformation("segmentGender", genderString.get(idxMaxScore)); } if (parameter.getParameterScore().isBySegment()) { for (int k = 0; k < size; k++) { double score = scoreVector[k]; GMM gmm = gmmList.get(k); segment.setInformation("score:" + gmm.getName(), score); currantSegment.setInformation("score:" + gmm.getName(), score); } if (parameter.getParameterTopGaussian().getScoreNTop() >= 0) { segment.setInformation("score:" + "UBM", ubmScore); currantSegment.setInformation("score:" + "UBM", ubmScore); } } String newName = cluster.getName(); if (parameter.getParameterScore().isByCluster() == false) { if ((scoreVector[idxMaxScore] > parameter.getParameterSegmentation().getThreshold()) && (parameter.getParameterScore().getLabel() != ParameterScore.LabelType.LABEL_TYPE_NONE.ordinal())) { if (parameter.getParameterScore().getLabel() == ParameterScore.LabelType.LABEL_TYPE_ADD.ordinal()) { newName += "_"; newName += gmmList.get(idxMaxScore).getName(); } else { newName = gmmList.get(idxMaxScore).getName(); } } Cluster temporaryCluster = clusterSetResult.getOrCreateANewCluster(newName); temporaryCluster.setGender(cluster.getGender()); if (parameter.getParameterScore().isGender() == true) { temporaryCluster.setGender(genderString.get(idxMaxScore)); } temporaryCluster.addSegment(segment); } } if (parameter.getParameterScore().isByCluster()) { for (int i = 0; i < size; i++) { sumScoreVector[i] /= sumLenghtVector[i]; } if (parameter.getParameterScore().isTNorm()) { double sumScore = 0; double sum2Score = 0; for (int i = 0; i < size; i++) { sumScore += sumScoreVector[i]; sum2Score += (sumScoreVector[i] * sumScoreVector[i]); } for (int i = 0; i < size; i++) { double value = sumScoreVector[i]; double mean = (sumScore - value) / (size - 1); double et = Math.sqrt(((sum2Score - (value * value)) / (size - 1)) - (mean * mean)); sumScoreVector[i] = (value - mean) / et; } } double maxScore = sumScoreVector[0]; int idxMaxScore = 0; for (int i = 1; i < size; i++) { double s = sumScoreVector[i]; if (maxScore < s) { maxScore = s; idxMaxScore = i; } } String newName = cluster.getName(); if ((sumScoreVector[idxMaxScore] > parameter.getParameterSegmentation().getThreshold()) && (parameter.getParameterScore().getLabel() != ParameterScore.LabelType.LABEL_TYPE_NONE.ordinal())) { if (parameter.getParameterScore().getLabel() == ParameterScore.LabelType.LABEL_TYPE_ADD.ordinal()) { newName += "_"; newName += gmmList.get(idxMaxScore).getName(); } else { newName = gmmList.get(idxMaxScore).getName(); } // logger.finer("cluster name=" + cluster.getName() + " new_name=" + newName); } Cluster tempororaryCluster = clusterSetResult.getOrCreateANewCluster(newName); tempororaryCluster.setGender(cluster.getGender()); if (parameter.getParameterScore().isGender() == true) { tempororaryCluster.setGender(genderString.get(idxMaxScore)); } tempororaryCluster.setName(newName); for (Segment currantSegment : cluster) { Segment segment = (currantSegment.clone()); if (parameter.getParameterScore().isGender() == true) { segment.setBandwidth(bandwidthString.get(idxMaxScore)); } tempororaryCluster.addSegment(segment); } for (int k = 0; k < size; k++) { double score = sumScoreVector[k]; GMM gmm = gmmList.get(k); // logger.finer("****clustername = " + newName + " name=" + gmm.getName() + " =" + score+" // k="+k); // logger.log(Level.SEVERE, "****clustername = " + newName + " name=" + gmm.getName() + " // =" + score); tempororaryCluster.setInformation("score:" + gmm.getName(), score); ClusterResult cr = new ClusterResult(); cr.setName(newName); cr.getValue().put(score, gmm.getName()); System.out.println( "------ clusterResultSet.putValue(newName, gmm.getName(), score)=----------------"); System.out.println(newName + " " + gmm.getName() + " " + score); if (isName(gmm.getName())) { clusterResultSet.putValue(newName, gmm.getName(), score); } else { System.out.println("*****************" + gmm.getName() + " Non nome valido "); } } if (parameter.getParameterTopGaussian().getScoreNTop() >= 0) { // tempororaryCluster.putInformation("score:" + "length", ubmSumLen); // tempororaryCluster.putInformation("score:" + "UBM", ubmSumScore / ubmSumLen); } } } this.clusterSetResult = clusterSetResult; return clusterSetResult; }