public RandomBlockCreator(int count, int maxRow, int maxCol) { var matrix = new RandomMatrix(maxRow, maxCol, count); _info = matrix.Normalize().Select(x => new BlockInfo { X = x.X, Y = x.Y }); }
public ANEWEmotionSensor(string datadirectory) { // Data files contained in [datadrectory]/metrics string metricsdir = datadirectory + Path.DirectorySeparatorChar + "metrics" + Path.DirectorySeparatorChar; source = new MemoizedSource <string, ThreeTuple <ContinuousDistribution, ContinuousDistribution, ContinuousDistribution> >(new ANEWFileSource(metricsdir + "anew.csv")); stemmer = new PorterStemmer(); // These matrices are used in G emotion = vad // positives are mean > 5; negatives are mean < 5 double[,] positives = new double[, ] { { .890, -.020, -.110, .116, -.035 }, { .649, .139, -.287, .441, .051 }, { .601, .153, -.305, .125, .042 } }; double[,] positiveTs = new double[, ] { { 45.40, 0.73, 4.24, 4.95, 1.55 }, { 19.75, 2.984, 6.57, 11.26, 1.36 }, { 16.60, 2.98, 6.34, 2.88, 1.00 } }; double[,] positiveSEs = Matrix.ElementwiseDivide(positives, positiveTs); double[,] negatives = new double[, ] { { .291, -.044, -.515, .020, -.243 }, { .050, .492, -.309, .670, -.042 }, { .136, .369, -.625, -.144, .041 } }; double[,] negativeTs = new double[, ] { { 8.91, 1.27, 13.80, 0.58, 8.27 }, { 1.36, 12.59, 7.33, 17.11, 1.27 }, { 2.93, 7.49, 11.75, 2.91, 0.98 } }; double[,] negativeSEs = Matrix.ElementwiseDivide(negatives, negativeTs); ContinuousDistribution[,] randomPositives = RandomMatrix.MakeGaussians(positives, positiveSEs); ContinuousDistribution[,] randomNegatives = RandomMatrix.MakeGaussians(negatives, negativeSEs); positiveProduct = RandomMatrix.Multiply(RandomMatrix.Transpose(randomPositives), RandomMatrix.Inverse(RandomMatrix.Multiply(randomPositives, RandomMatrix.Transpose(randomPositives)))); negativeProduct = RandomMatrix.Multiply(RandomMatrix.Transpose(randomNegatives), RandomMatrix.Inverse(RandomMatrix.Multiply(randomNegatives, RandomMatrix.Transpose(randomNegatives)))); positiveMatrix = Matrix.Multiply(Matrix.Transpose(positives), Matrix.Inverse(Matrix.Multiply(positives, Matrix.Transpose(positives)))); negativeMatrix = Matrix.Multiply(Matrix.Transpose(negatives), Matrix.Inverse(Matrix.Multiply(negatives, Matrix.Transpose(negatives)))); }
public double[] EstimateEmotions(string text) { List <string> words = StringUtilities.SplitWords(text.ToLower(), true); // 3. Look up each word in ANEWFileSource double[] numer = new double[(int)Emotions.COUNT], denom = new double[(int)Emotions.COUNT]; for (int ii = 0; ii < (int)Emotions.COUNT; ii++) { numer[ii] = denom[ii] = 0; } foreach (string word in words) { if (word.StartsWith(" ") || word.Length <= 2) { continue; } ThreeTuple <ContinuousDistribution, ContinuousDistribution, ContinuousDistribution> vad; if (!TryGetWordOrStem(source, word, out vad)) { continue; } numer[(int)Emotions.Valence] += vad.one.Mean / vad.one.Variance; denom[(int)Emotions.Valence] += 1 / vad.one.Variance; numer[(int)Emotions.Arousal] += vad.two.Mean / vad.two.Variance; denom[(int)Emotions.Arousal] += 1 / vad.two.Variance; numer[(int)Emotions.Dominance] += vad.three.Mean / vad.three.Variance; denom[(int)Emotions.Dominance] += 1 / vad.three.Variance; // 4. Apply regressions from other paper ContinuousDistribution[,] vector = new ContinuousDistribution[, ] { { vad.one }, { vad.two }, { vad.three } }; ContinuousDistribution[,] emotions; if (vad.one.Mean >= .5) { emotions = RandomMatrix.Multiply(positiveProduct, vector); } else { emotions = RandomMatrix.Multiply(negativeProduct, vector); } // 5. Take mean within bounds and sum weighted by variance for (int ii = 3; ii < (int)Emotions.COUNT; ii++) { ContinuousDistribution clipped = emotions[ii - 3, 0].Transform(0, .1).Clip(0, 1); numer[ii] += clipped.Mean / clipped.Variance; denom[ii] += 1 / clipped.Variance; } } for (int ii = 0; ii < (int)Emotions.COUNT; ii++) { numer[ii] /= denom[ii]; } return(numer); }