Hallo Leute,
ich habe ein seltsames Problem (vllcht aber auch nicht). Ich habe folgende Funktion:
Ihr seht ja folgende Schleife: for (int i:col)
Wenn ich statt der foreach Schleife eine for Schleife nehme, bekomme ich andere Werte.
Zur Erklärung. Ich berechne die Kosinusähnlichkeit einer x-y Matrix (Sparse matrix - Wikipedia, the free encyclopedia)
Ich durchsuche das array col nach position1 bzw. position2 (dies kann auch mehrfach besetzt sein). An dieser Stelle wird dann der rowindex gespeichert und der dazugehörige Wert val1 bzw val2.
Anschließend setze ich row1+val1 und row2+val2 zu einem Vektor und berechne daraus die Kosinusähnlichkeit.
Was mich eben wundert: Für die for-Schleife erhalte ich andere Werte als für die foreach-Schleife. Vllcht. ist das auch normal, weil die foreach eben iterativ arbeitet...vllcht aber auch nicht
Hoffe auf antworten
Gruß Fabian
ich habe ein seltsames Problem (vllcht aber auch nicht). Ich habe folgende Funktion:
Java:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package main.java.math.vectorOperations;
import static java.lang.Math.sqrt;
import java.util.ArrayList;
import java.util.Arrays;
/**
*
* @author Fabian
*/
public class CosineSimilarity {
//Variables for createCosineSimilarity
ArrayList<Integer> row1 = new ArrayList<>();
ArrayList<Integer> row2 = new ArrayList<>();
ArrayList<Byte> val1 = new ArrayList<>();
ArrayList<Byte> val2 = new ArrayList<>();
private int poscounter1 = 0;
private int poscounter2 = 0;
private boolean result1 = false;
private boolean result2 = false;
private boolean break1 = false;
private boolean break2 = false;
/**
* Creates the Similarity between two items of the following position
*
* @param col The col positions
* @param row The row positions
* @param val The values
* @param position1 id1
* @param position2 id2
* @return Similarity
*/
public float createCosineSimilarity(int[] col, int[] row, byte[] val, int position1, int position2) {
int maximum = 0;
for (int i:col) {
if (col[i] == position1) {
val1.add(poscounter1, val[i]);
row1.add(poscounter1, row[i]);
poscounter1++;
//result1 = true;
if (row[i] > maximum) {
maximum = row[i];
}
}
if (col[i] == position2) {
val2.add(poscounter2, val[i]);
row2.add(poscounter2, row[i]);
poscounter2++;
//result2 = true;
if (row[i] > maximum) {
maximum = row[i];
}
}
/*if (result1 == true) {
break1 = true;
}
if (result2 == true) {
break2 = true;
}
if (break1 == true && break2 == true && result1 == false && result2 == false) {
break;
}
result1 = false;
result2 = false;*/
}
byte[] vector1 = new byte[maximum + 1];
byte[] vector2 = new byte[maximum + 1];
final int size1 = val1.size();
final int size2 = val2.size();
for (int y = 0; y <= maximum; y++) {
for (int z = 0; z < size1; z++) {
if (row1.get(z) == y) {
vector1[y] = val1.get(z);
break;
} else {
vector1[y] = 0;
}
}
}
for (int x = 0; x <= maximum; x++) {
for (int t = 0; t < size2; t++) {
if (row2.get(t) == x) {
vector2[x] = val2.get(t);
break;
} else {
vector2[x] = 0;
}
}
}
row1.clear();
row2.clear();
val1.clear();
val2.clear();
poscounter1 = 0;
poscounter2 = 0;
break1 = false;
break2 = false;
return Similarity(vector1, vector2);
}
//Variables for Similarity
private float dotProduct = 0;
private float vector1Square = 0;
private float vector2Square = 0;
private double eucledianDist = 0;
private float result = 0;
/**
* Calculates the similarity between two vectors
*
* @param A First vector
* @param B Second vector
* @return Similarity
*/
private float Similarity(byte[] A, byte[] B) {
final int ALenght = A.length;
for (int i = 0; i < ALenght; i++) {
dotProduct += (A[i] * B[i]);
vector1Square += (A[i] * A[i]);
vector2Square += (B[i] * B[i]);
}
eucledianDist = (sqrt(vector1Square) * sqrt(vector2Square));
if (dotProduct != 0 && eucledianDist != 0) {
result = dotProduct / (float) eucledianDist;
} else {
result = 0;
}
dotProduct = 0;
vector1Square = 0;
vector2Square = 0;
eucledianDist = 0;
return result;
}
}
Wenn ich statt der foreach Schleife eine for Schleife nehme, bekomme ich andere Werte.
Zur Erklärung. Ich berechne die Kosinusähnlichkeit einer x-y Matrix (Sparse matrix - Wikipedia, the free encyclopedia)
Ich durchsuche das array col nach position1 bzw. position2 (dies kann auch mehrfach besetzt sein). An dieser Stelle wird dann der rowindex gespeichert und der dazugehörige Wert val1 bzw val2.
Anschließend setze ich row1+val1 und row2+val2 zu einem Vektor und berechne daraus die Kosinusähnlichkeit.
Was mich eben wundert: Für die for-Schleife erhalte ich andere Werte als für die foreach-Schleife. Vllcht. ist das auch normal, weil die foreach eben iterativ arbeitet...vllcht aber auch nicht
Hoffe auf antworten
Gruß Fabian