Недавно я читаю «Коллективное интеллектуальное программирование» . По сравнению с другими книгами машинного обучения, эта книга имеет много случаев, которые ближе к реальности, а также очень подходят для нас, новичков, которые готовы изучать машины.
Я думаю, что недостаток этой книги заключается в том, что она не объясняет формулу алгоритма, но реализует ее непосредственно кодом, поэтому это вызывает неудобства, чтобы подробно понимать алгоритм, поэтому я хочу написать несколько статей, чтобы объяснить его подробно. Ниже приведена первая статья, которая объясняет коэффициенты корреляции Пирсона и использует язык Java, с которым я больше знаком.
Математическая формула Пирсона следующая, из Википедии.
Где E - математическое ожидание, COV представляет ковариацию, а /sigma_x и /sigma_y - это стандартные отклонения.
После упрощения вы получите:
Алгоритм расчета сходства Пирсона все еще очень прост и не сложно реализовать. Требуются только сумма переменных x, y, продукт xy, квадрат x и квадрат Y. Набор тестов данных, используемый моим кодом, поступает из программирования коллективного интеллекта книг . Код заключается в следующем:
Пакет PearlsonCorrelationsCore; Import java.util.arraylist; import java.util.hashmap; импорт java.util.list; import java.util.map; импорт java.util.map; импорт java.util.map.Entry;/** * @author shencho * * * the book "Collective Intelligent Programming"*/public class PearsonCorrelationScore {private Map<String, Map<String, double>> dataset = null;public PearsonCorrelationScore() {initDataSet();}/*** Initialize the dataset*/private void initDataSet() {dataset = new HashMap<String, Map<String, double>>();// Initialize the Наборы данных Lisa Rose <String, double> (); Rosemap.put («Леди в воде», 2,5); rosemap.put («змеи на самолете», 3.5); rosemap.put («Просто моя удача», 3.0); Rosemap.put («Супермен возвращается», 3.5); Rosemap.put («Вы, я и dupree», 2.5); 3.0); dataSet.put ("Lisa Rose", Rosemap); // Инициализировать карту набора данных Джека Мэтьюса <строка, двойной> jackmap = new Hashmap <String, double> (); Jackmap.put ("Lady in the Water", 3.0); jackmap.put ("Smakes on the Gack Prass", 4.0); Jackmap.put (Supermans ", 5.0pupt". Я и dupree ", 3.5); jackmap.put (" Ночной слушатель ", 3.0); dataSet.put (" jack matthews ", jackmap); // инициализировать наборы набора данных Джека Мэтьюса <строка, двойной> genemap = new hashmap <string, double> (); genemap.put (" Lady in the Water ", 3.0); 3.5); genemap.put («Просто моя удача», 1.5); genemap.put («Супермен возвращает», 5.0); GeneMap.put ("You, Me и Dupree", 3.5); GeneMap.put ("Ночной слушатель", 3.0); DataSet.Put ("Gene SeyMour", GeneMap); DataSet;}/*** @Param Person1* name* @param person2* name* @return Pearson Correlation Value*/public Double Sim_pearson (String Person1, String Person2) {// Найти фильмы, которые обе стороны прокомментировали, (Algorithm Pearson's Algorithm требует) list <string> stist = new ArrayList <string> (); для (string> p1: Double> P1: Pount> P1: Pround> P1: Pround> P1: Pround> P1: Pround> P1: Pround> P1. DataSet.get (person1) .EntrySet ()) {if (dataSet.get (person2) .containskey (p1.getkey ())) {list.add (p1.getkey ());}} Double sumx = 0.0; Double sumy = 0,0; Double sumx_sq = 0.0; double sumy_sq = 0.0; 0; 0.0; (Имя строки: список) {map <string, double> p1map = dataSet.get (person1); map <string, double> p2map = dataSet.get (person2); sumx += p1map.get (name); sumy += p2map.get (name); sumx_sq += math.pow (p1map.get (name); Math.pow (p2map.get (name), 2); sumxy += p1map.get (name) * p2map.get (name);} double numerator = sumxy - sumx * sumy / n; двойной знаменатель = мат. 0if (знаменатель == 0) {return 0;} return numerator / ganinamator;} public static void main (string [] args) {pearsoncorrelationscore pearlsoncorrelationscore = new PearsonCorrelationscore (); System.out.println (PearsonCorrelations.sim_pearson (); Мэтьюз "));}}Отражите данные из каждого теста, установленного в двухмерную плоскость координат следующим образом:
Значение, полученное вышеуказанной программой, на самом деле является наклоном линии. Интервал его наклона находится между [-1,1], а величина его абсолютного значения отражает сходство между ними. Чем больше склон, тем больше сходство. Когда сходство составляет 1, прямая линия диагональ.
Суммировать
Выше приведено подробное объяснение сходства Java, основанное на коэффициенте корреляции Пирсона в этой статье. Я надеюсь, что это будет полезно для всех. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!