Recientemente estoy leyendo "Programación inteligente colectiva" . En comparación con otros libros de aprendizaje automático, este libro tiene muchos casos, que están más cerca de la realidad, y también es muy adecuado para nosotros, novatos que están listos para aprender maquinelearning.
Creo que la desventaja de este libro es que no explica la fórmula del algoritmo, sino que lo implementa directamente con el código, por lo que causa inconvenientes comprender el algoritmo en detalle, por lo que quiero escribir algunos artículos para explicarlo en detalle. El siguiente es el primer artículo, que explica los coeficientes de correlación de Pearson y utiliza el lenguaje Java con el que estoy más familiarizado.
La fórmula matemática de Pearson es la siguiente, de Wikipedia.
Donde E es la expectativa matemática, CoV representa covarianza, y /Sigma_X y /Sigma_y son desviaciones estándar.
Después de la simplificación, obtendrá:
El algoritmo para el cálculo de similitud de Pearson sigue siendo muy simple y no es difícil de implementar. Solo se requiere la suma de las variables x, y, producto xy, el cuadrado de x y el cuadrado de y. El conjunto de pruebas de datos utilizado por mi código proviene de la programación de inteligencia colectiva del libro . El código es el siguiente:
paquete PearlsonCorrelationsCore; import java.util.arrayList; import java.util.hashmap; import java.util.list; import java.util.map; import java.util.map; testimator de importación de la evaluación de los usuarios; DataSet en el libro "Programación inteligente colectiva"*/public class PearsonCorrelationsCore {private map <string, map <string, double >> dataSet = null; public PearsonCorrelationsCore () {initDataSet ();}/*** Inicializar el DataSet*/private Void Void VoidDataSet () {Dataset = New Hashmap <String, Double; Inicialice el mapa del conjunto de datos Lisa Rose <String, Double> (); RosEmap.put ("Lady in the Water", 2.5); rosaMap.put ("serpiente en un avión", 3.5); rosemap.put ("solo mi suerte", 3.0); rosemap.put ("Superman regresa", 3.5); Rosemap.put ("usted, yo, yo y dupree", 2.5); Rosemap.puts. ("The Night (" The Night ("The Night (" The Night ("You, yo, yo y duperee", 2.5); Rosemap.puts. Oyente ", 3.0); DataSet.put (" Lisa Rose ", RosEmap); // Inicializar Jack Matthews DataSet Map <String, Double> Jackmap = New Hashmap <String, Double> (); JackMap.put (" Lady in the Water ", 3.0); Jackmap.put (" Snakes en un plano ", 4.0); Jackmap. 5.0); Jackmap.put ("You, Me y Dupree", 3.5); Jackmap.put ("The Night Listener", 3.0); DataSet.put ("Jack Matthews", JackMap); // Inicializar Jack Matthews DataSet Map <String, Double> GenEmap = New Hashmap <String, Double> (); GenEmap.put ("Lady in the Water", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", "," ",", "", "", "," ",", "", "", "," ",", "", "," ",", "," ",", ",", ",", "," ",", ",", "", ",", "", "", 3.0); genemap.put ("serpientes en un plano", 3.5); genemap.put ("solo mi suerte", 1.5); genemap.put ("Superman Devuelve", 5.0); genemap.put ("you, me y duPree", 3.5); genemap.put ("The Night Learer", 3.0); DataSet.put ("Gene Symour", GeneMap);} Map <string, double >> getDataSet () {return dataSet;}/*** @param Person1* name* @param Person2* name* @return Pearson Valor de correlación*/public Sim_Pearson (String Person1, String Person2) {// Encuentra las películas de las que ambas partes han comentado en, (Pearson's Algorrithm) List <String> List = New StrayList (String> ((); (Entrada <String, Double> P1: DataSet.get (Person1) .EntrySet ()) {if (DataSet.get (Person2) .ContainsKey (P1.getKey ())) {list.add (p1.getkey ());}} doble sumx = 0.0; double Sumy = 0.0; doble sumx_sq = 0.0; doble sumy_sq = 0.0; = list.size (); for (name de cadena: list) {map <string, double> p1map = dataSet.get (persona1); map <string, double> p2map = dataSet.get (persona2); sumx += p1map.get (name); sumy += p2map.get (nombre); sumx_sq += math.pow (p1map.get (name), 2), 2), name); += Math.pow (p2map.get (nombre), 2); sumxy += p1map.get (name) * p2map.get (name);} doble numerator = sumxy - sumx * sumy / n; doble denominator = math.sqrt ((sumx - sumx * sumx / n) * (sumy_sq - sumy * sumy / n) / / / / / / / / n) be 0if (denominator == 0) {return 0;}return numerator / denominator;}public static void main(String[] args) {PearsonCorrelationScore pearlsonCorrelationScore = new PearsonCorrelationScore();System.out.println(pearsonCorrelationScore.sim_pearson("Lisa Rose","Jack Matthews "));}}Reflejar los datos de cada conjunto de pruebas en un plano de coordenadas bidimensional de la siguiente manera:
El valor obtenido por el programa anterior es en realidad la pendiente de la línea. El intervalo de su pendiente es entre [-1,1], y la magnitud de su valor absoluto refleja la similitud entre los dos. Cuanto mayor es la pendiente, mayor es la similitud. Cuando la similitud es 1, la línea recta es diagonal.
Resumir
Lo anterior es toda la explicación detallada de la similitud de Java basada en el coeficiente de correlación de Pearson en este artículo. Espero que sea útil para todos. Si hay alguna deficiencia, deje un mensaje para señalarlo. ¡Gracias amigos por su apoyo para este sitio!