实现代码
package Package1;
import java.io.FileNotFoundException;
import java.util.*;
import java.util.Map.Entry;
public class Computation {
private static final String OTHER_MATRIX_PATH = "F:\\MyProjects\\XMGL\\resources\\other.txt";
private static final String TARGET_MATRIX_PATH = "F:\\MyProjects\\XMGL\\resources\\target.txt";
private static final String SORTED_SIM_PATH = "F:\\MyProjects\\XMGL\\resources\\tempSim.txt";
private static final String NEIGHBOUR_MATRIX_PATH = "F:\\MyProjects\\XMGL\\resources\\Neighbour.txt";
private static final String SIM_MATRIX_PATH = "F:\\MyProjects\\XMGL\\resources\\SimMatrix.txt";
private static final int TARGET_MATRIX_ROWS = 1;
private static final int TARGET_MATRIX_COLS = 1682;
private static final int OTHER_MATRIX_ROWS = 942;
private static final int OTHER_MATRIX_COLS = 1682;
private static final int SORTED_MATRIX_ROWS = TARGET_MATRIX_ROWS;
private static final int SORTED_MATRIX_COLS = TARGET_MATRIX_COLS;
private static final int NEIGHBOUR_MATRIX_ROWS = TARGET_MATRIX_ROWS;
private static final int NEIGHBOUR_MATRIX_COLS = TARGET_MATRIX_COLS;
private static final int NEIGHBOUR_NUMS = 50;
private static final String RESULT_SIM_OUTPUT_PATH = "F:\\MyProjects\\XMGL\\resources\\Result.txt";
private static final String RESULT_INDEX_OUTPUT_PATH = "F:\\MyProjects\\XMGL\\resources\\ResultIndex.txt";
private static final int MEANINGLESS_VALUE = -1000;
public static void main(String[] args) {
try {
int[][] neighbourMatrix = KnnInputOutput.TxtToIntArray(NEIGHBOUR_MATRIX_PATH, NEIGHBOUR_MATRIX_ROWS, OTHER_MATRIX_ROWS);
double[][] simMatrix = KnnInputOutput.TxtToDouArray(SIM_MATRIX_PATH, SORTED_MATRIX_ROWS, SORTED_MATRIX_COLS);
double[][] targetMatrix = KnnInputOutput.TxtToDouArray(TARGET_MATRIX_PATH, TARGET_MATRIX_ROWS, TARGET_MATRIX_COLS);
double[][] otherMatrix = KnnInputOutput.TxtToDouArray(OTHER_MATRIX_PATH, OTHER_MATRIX_ROWS, OTHER_MATRIX_COLS);
double[][] preRatingsMatrix = getPreRatingsMatrix(targetMatrix, otherMatrix, simMatrix, neighbourMatrix);
List<Entry<Integer, Double>> sortedMatrix = sortMatrix(preRatingsMatrix);
outputSortedMatrixAndNeighbourMatrix(sortedMatrix);
} catch (Exception e) {
e.printStackTrace();
}
}
public static double[][] getPreRatingsMatrix(double[][] targetMatrix, double[][] otherMatrix, double[][] simMatrix, int[][] neighbour) {
double[][] preRatings = new double[1][TARGET_MATRIX_COLS];
for (int i = 0; i < TARGET_MATRIX_COLS; i++) {
if (targetMatrix[0][i] == 0) {
preRatings[0][i] = calcPredictionScore(i, targetMatrix, otherMatrix, simMatrix, neighbour);
} else {
preRatings[0][i] = MEANINGLESS_VALUE;
}
}
return preRatings;
}
public static double calcPredictionScore(int i, double[][] targetMatrix, double[][] otherMatrix, double[][] simMatrix, int[][] neighbour) {
double molecule = 0d;
double denominator = 0d;
double avg_rua = avgInMatrixRowWithout0(targetMatrix, 1);
for (int j = 0; j < NEIGHBOUR_NUMS; j++) {
int currentNeighbour = neighbour[0][j];
double sim = simMatrix[0][currentNeighbour];
if (sim == MEANINGLESS_VALUE || otherMatrix[currentNeighbour][i] == 0) {
continue;
}
double r_ret = otherMatrix[currentNeighbour][i] - avgInMatrixRowWithout0(otherMatrix, currentNeighbour + 1);
molecule += sim * r_ret;
denominator += Math.abs(sim);
}
return denominator == 0 ? MEANINGLESS_VALUE : avg_rua + (molecule / denominator);
}
public static double avgInMatrixRowWithout0(double[][] matrix, int row) {
double sum = 0;
int divideCount = 0;
for (int j = 0; j < matrix[row - 1].length; j++) {
if (matrix[row - 1][j] == 0) {
continue;
}
sum += matrix[row - 1][j];
divideCount++;
}
return sum / divideCount;
}
public static List<Map.Entry<Integer, Double>> sortMatrix(double[][] matrix) {
Map<Integer, Double> resultMap = new HashMap<Integer, Double>();
for (int i = 0; i < matrix[0].length; i++) {
resultMap.put(i, matrix[0][i]);
}
List<Map.Entry<Integer, Double>> sortedList = new ArrayList<Map.Entry<Integer, Double>>(resultMap.entrySet());
Collections.sort(sortedList, new Comparator<Map.Entry<Integer, Double>>() {
public int compare(Entry<Integer, Double> o1,
Entry<Integer, Double> o2) {
return o2.getValue().compareTo(o1.getValue());
}
});
return sortedList;
}
public static void outputSortedMatrixAndNeighbourMatrix(List<Map.Entry<Integer, Double>> sortedList) {
double[][] sortedMatrix = new double[SORTED_MATRIX_ROWS][SORTED_MATRIX_COLS];
int[][] neighborMatrx = new int[NEIGHBOUR_MATRIX_ROWS][NEIGHBOUR_MATRIX_COLS];
for (int i = 0; i < sortedList.size(); i++) {
Entry<Integer, Double> entry = sortedList.get(i);
neighborMatrx[0][i] = entry.getKey();
sortedMatrix[0][i] = entry.getValue();
}
KnnInputOutput.douArrayToTxt(RESULT_SIM_OUTPUT_PATH, sortedMatrix, SORTED_MATRIX_ROWS, SORTED_MATRIX_COLS);
KnnInputOutput.intArrayToTxt(RESULT_INDEX_OUTPUT_PATH, neighborMatrx, NEIGHBOUR_MATRIX_ROWS, NEIGHBOUR_MATRIX_COLS);
}
}