/** 计算两个医生的相似度 不管诊次,只计算共同看的病的个数 */ public int getSimilarityByCommonRating( ZhengDoctorRecommendDataset ds, DoctorEntity doctor1, DoctorEntity doctor2) { // System.out.println(doctor1.getId()); List<ZhengRatingEntity> zheng1 = ds.getSortedRatingsByDoctorId().get(doctor1.getId()); // 获取某一个医生所包含的症状 List<ZhengRatingEntity> zheng2 = ds.getSortedRatingsByDoctorId().get(doctor2.getId()); // 如果这两个症状集合有一个为空,则说明两个医生不相似,返回0 int count = 0; if (zheng1 == null || zheng2 == null) { System.err.println("医生没有看过病"); return 0; } // 判断两个症状集合是否有交集,如果有则count+1 for (int i = 0; i < zheng1.size(); i++) { for (int j = 0; j < zheng2.size(); j++) { if (zheng1.get(i).getZhengId() == zheng2.get(j).getZhengId()) { count++; } } } return count; }
/** * 计算两个用户的相似度 计算的方法是欧式距离的方法 * * @param doctor1 * @param doctor2 * @return */ public double getSimilarityByEucliddistance( ZhengDoctorRecommendDataset ds, DoctorEntity doctor1, DoctorEntity doctor2) { List<ZhengRatingEntity> zheng1 = ds.getRatingsByDoctorId().get(doctor1.getId()); // 获取某一个医生所包含的疾病 List<ZhengRatingEntity> zheng2 = ds.getRatingsByDoctorId().get(doctor2.getId()); int commZheng = 0; if (zheng1 == null || zheng2 == null) { // System.err.println("医生没有治过病"); return 0; } // for (int i = 0; i < zheng1.size(); i++) { // System.out.print(zheng1.get(i).getZhengId()+":"+zheng1.get(i).getRating()+" "); // } // System.out.println(); // for (int i = 0; i < zheng2.size(); i++) { // System.out.print(zheng2.get(i).getZhengId()+":"+zheng2.get(i).getRating()+" "); // } // System.out.println(); // // 判断两个疾病集合是否有交集 double sim = 0.0; for (int i = 0; i < zheng1.size(); i++) { for (int j = 0; j < zheng2.size(); j++) { if (zheng1.get(i).getZhengId() == zheng2.get(j).getZhengId()) { commZheng++; int zheng1Rating = zheng1.get(i).getRating(); int zheng2Rating = zheng2.get(j).getRating(); // System.out.println("common zheng id:"+zheng1.get(i).getZhengId()+" "+zheng1Rating+" // "+zheng2Rating); sim += Math.pow((zheng1Rating - zheng2Rating), 2); } } } // System.out.println("欧式距离相似度:"+sim); if (commZheng > 0) { // sim=1.0d - Math.tanh(sim); // sim=1.0/(sim+1); sim = sim; } return sim; }
/** 计算所有医生的相似度 不管诊次,只计算共同看的病的个数 */ public int[][] getAllSimilarityByCommonRating(ZhengDoctorRecommendDataset ds) { int allDoctorSize = ds.getAllDoctor().size(); // System.out.println("allDoctorSize"+allDoctorSize); int[][] doctorSimilarity = new int[allDoctorSize + 1][allDoctorSize + 1]; for (Entry<Integer, DoctorEntity> entry : ds.getAllDoctor().entrySet()) { DoctorEntity doc1 = entry.getValue(); int i = doc1.getId(); for (Entry<Integer, DoctorEntity> entry2 : ds.getAllDoctor().entrySet()) { DoctorEntity doc2 = entry2.getValue(); int j = doc2.getId(); if (doc2.getId() > doc1.getId()) { continue; // 跳出本次循环,执行下次循环 } // System.out.println(doc1.getId()); // System.out.println(doc2.getId()); int count = getSimilarityByCommonRating(ds, doc1, doc2); // 找出相似的个数 doctorSimilarity[i][j] = count; doctorSimilarity[j][i] = count; // 因为是个对称的 } } return doctorSimilarity; }
/** * 计算所有医生的相似度 * * <p>欧式距离 */ public double[][] getAllDoctorSimilarity(ZhengDoctorRecommendDataset ds) { int allDoctorSize = ds.getAllDoctor().size(); // System.out.println("allDoctorSize"+allDoctorSize); double[][] doctorSimilarity = new double[allDoctorSize + 1][allDoctorSize + 1]; for (Entry<Integer, DoctorEntity> entry : ds.getAllDoctor().entrySet()) { DoctorEntity doc1 = entry.getValue(); int i = doc1.getId(); for (Entry<Integer, DoctorEntity> entry2 : ds.getAllDoctor().entrySet()) { DoctorEntity doc2 = entry2.getValue(); int j = doc2.getId(); if (doc2.getId() > doc1.getId()) { continue; // 跳出本次循环,执行下次循环 } // System.out.println(doc1.getId()); // System.out.println(doc2.getId()); double count = 0; count = getSimilarityByEucliddistance(ds, doc1, doc2); // 找出相似的个数 doctorSimilarity[i][j] = count; doctorSimilarity[j][i] = count; // 因为是个对称的 } } // File file = new File(DataSetConfig.SimiResultPath); // if (file.exists()) { // file.delete(); // } // // for (int i = 0; i < doctorSimilarity.length; i++) { // String line=""; // for (int j = 0; j < doctorSimilarity[i].length; j++) { // line +=String.format("%.4f",doctorSimilarity[i][j]) + " "; //// System.out.print(String.format("%.4f",doctorSimilarity[i][j]) + " "); // } // System.out.println(); // FileUtil.appendData(DataSetConfig.SimiResultPath, line); // } return doctorSimilarity; }