diff options
author | Camil Staps | 2015-05-19 14:50:50 +0200 |
---|---|---|
committer | Camil Staps | 2015-05-19 14:50:50 +0200 |
commit | c3f9e24a1194d561cd1c4aca68a6892682c087a1 (patch) | |
tree | 3d5641e966826c92a7cf330a08932430d8f2c7b5 /app/src/main/java/org | |
parent | Framework FiltersActivity (diff) | |
parent | basic Filter & Keyword classes (diff) |
Merge branch 'master' into app
Diffstat (limited to 'app/src/main/java/org')
12 files changed, 506 insertions, 0 deletions
diff --git a/app/src/main/java/org/rssin/neurons/FeedSorter.java b/app/src/main/java/org/rssin/neurons/FeedSorter.java new file mode 100755 index 0000000..43e26c0 --- /dev/null +++ b/app/src/main/java/org/rssin/neurons/FeedSorter.java @@ -0,0 +1,97 @@ +package org.rssin.neurons;
+
+import java.io.IOException;
+import java.util.Calendar;
+import java.util.Hashtable;
+import java.util.TimeZone;
+
+/**
+ * Created by Jos on 14-5-2015.
+ */
+public class FeedSorter {
+ private MultiNeuralNetwork nn = new MultiNeuralNetwork(25, 50);
+
+ private int[] isNthMonthInput = new int[12];
+ private int[] isNthWeekDayInput = new int[7];
+ private int isMorning, isAfternoon, isEvening, isNight;
+ private Hashtable<String, Integer> categoryInputs = new Hashtable<String, Integer>();
+ private Hashtable<String, Integer> wordInputs = new Hashtable<String, Integer>();
+ private Hashtable<String, Integer> feedSourceInputs = new Hashtable<String, Integer>();
+
+ public FeedSorter() {
+ //TODO: Load Neural Network
+ createNewNetwork();
+ }
+
+ private void createNewNetwork() {
+ for(int i = 0; i < 12; i++)
+ {
+ isNthMonthInput[i] = nn.addInput();
+ }
+
+ for(int i = 0; i < 7; i++)
+ {
+ isNthWeekDayInput[i] = nn.addInput();
+ }
+
+ isMorning = nn.addInput();
+ isAfternoon = nn.addInput();
+ isEvening = nn.addInput();
+ isNight = nn.addInput();
+ }
+
+// private PredictionInterface getPrediction(FeedItem item) {
+// double[] inputs = new double[nn.getInputCount()];
+//
+// //Initialize all inputs to -1 / false
+// for(int i = 0; i < inputs.length; i++)
+// {
+// inputs[i] = -1;
+// }
+//
+// //Set month
+// Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
+// for(int i = 0; i < isNthMonthInput.length; i++)
+// {
+// if(cal.get(Calendar.MONTH) - cal.getMinimum(Calendar.MONTH) == i)
+// {
+// inputs[isNthMonthInput[i]] = 1;
+// }
+// }
+//
+// //Set weekday
+// for(int i = 0; i < isNthWeekDayInput.length; i++)
+// {
+// if(cal.get(Calendar.DAY_OF_WEEK) - cal.getMinimum(Calendar.DAY_OF_WEEK) == i)
+// {
+// inputs[isNthMonthInput[i]] = 1;
+// }
+// }
+//
+// //Set day
+// int hourOfDay = cal.get(Calendar.HOUR_OF_DAY);
+// if(hourOfDay > 6 && hourOfDay < 12)
+// {
+// inputs[isMorning] = 1;
+// }else if(hourOfDay >= 12 && hourOfDay <= 6)
+// {
+// inputs[isAfternoon] = 1;
+// }else if(hourOfDay >= 6 && hourOfDay < 23)
+// {
+// inputs[isEvening] = 1;
+// }else if(hourOfDay >= 23 || hourOfDay <= 6)
+// {
+// inputs[isNight] = 1;
+// }
+//
+// //TODO: source, category, title, text, etc of FeedItems
+//
+// return nn.computeOutput(inputs);
+// }
+
+// public List<FeedItem> sortItems(List<FeedItem> items) {
+// // Sort list based on something like date + nn.computeOutput() * DAY.
+// throw new NotImplementedException();
+// return items;
+// }
+}
diff --git a/app/src/main/java/org/rssin/neurons/MultiNeuralNetwork.java b/app/src/main/java/org/rssin/neurons/MultiNeuralNetwork.java new file mode 100755 index 0000000..492f67c --- /dev/null +++ b/app/src/main/java/org/rssin/neurons/MultiNeuralNetwork.java @@ -0,0 +1,38 @@ +package org.rssin.neurons;
+
+/**
+ * Created by Jos on 14-5-2015.
+ */
+public class MultiNeuralNetwork {
+ private NeuralNetwork[] networks;
+
+ public MultiNeuralNetwork(int numNetworks, int numHiddenNodes) {
+ networks = new NeuralNetwork[numNetworks];
+ for (int i = 0; i < networks.length; i++) {
+ networks[i] = new NeuralNetwork(numHiddenNodes);
+ }
+ }
+
+ public int addInput() {
+ int id = 0;
+ for (NeuralNetwork network : networks) {
+ id = network.addInput();
+ }
+
+ return id;
+ }
+
+ public PredictionInterface computeOutput(double[] inputs) {
+ PredictionInterface[] predictions = new PredictionInterface[networks.length];
+ for(int i = 0; i < predictions.length; i++)
+ {
+ predictions[i] = networks[i].computeOutput(inputs);
+ }
+
+ return new MultiNeuralNetworkPrediction(predictions);
+ }
+
+ public int getInputCount() {
+ return networks[0].getInputCount();
+ }
+}
diff --git a/app/src/main/java/org/rssin/neurons/MultiNeuralNetworkPrediction.java b/app/src/main/java/org/rssin/neurons/MultiNeuralNetworkPrediction.java new file mode 100755 index 0000000..06164d0 --- /dev/null +++ b/app/src/main/java/org/rssin/neurons/MultiNeuralNetworkPrediction.java @@ -0,0 +1,30 @@ +package org.rssin.neurons;
+
+/**
+ * Created by Jos on 14-5-2015.
+ */
+public class MultiNeuralNetworkPrediction implements PredictionInterface {
+ private PredictionInterface[] predictions;
+ MultiNeuralNetworkPrediction(PredictionInterface[] predictions)
+ {
+ this.predictions = predictions;
+ }
+
+ public double getOutput()
+ {
+ double average = 0;
+ for (PredictionInterface prediction : predictions) {
+ average += prediction.getOutput();
+ }
+
+ return average / (double) predictions.length;
+ }
+
+ public void learn(double expectedOutput)
+ {
+ for(PredictionInterface prediction : predictions)
+ {
+ prediction.learn(expectedOutput);
+ }
+ }
+}
diff --git a/app/src/main/java/org/rssin/neurons/NeuralNetwork.java b/app/src/main/java/org/rssin/neurons/NeuralNetwork.java new file mode 100755 index 0000000..d761e35 --- /dev/null +++ b/app/src/main/java/org/rssin/neurons/NeuralNetwork.java @@ -0,0 +1,105 @@ +package org.rssin.neurons;
+
+/**
+ * Created by Jos on 14-5-2015.
+ */
+public class NeuralNetwork {
+ private Neuron[] hiddenNodes;
+ private Neuron outputNode;
+
+ public NeuralNetwork(int numHiddenNodes) {
+ if(numHiddenNodes < 1)
+ {
+ throw new IllegalArgumentException("numHiddenNodes must be > 0");
+ }
+
+ hiddenNodes = new Neuron[numHiddenNodes];
+
+ for (int i = 0; i < hiddenNodes.length; i++) {
+ hiddenNodes[i] = new Neuron();
+ }
+
+ outputNode = new Neuron(numHiddenNodes + 1);
+ }
+
+ public int addInput() {
+ int result = 0;
+ for (int i = 0; i < hiddenNodes.length; i++) {
+ result = hiddenNodes[i].AddWeight();
+ }
+
+ return result;
+ }
+
+ public PredictionInterface computeOutput(double[] inputs) {
+ double[] intermediateValues = new double[outputNode.getWeightCount()];
+
+ for (int neuronNum = 0; neuronNum < hiddenNodes.length; neuronNum++) {
+ Neuron n = hiddenNodes[neuronNum];
+
+ double neuronOutput = 0;
+ for (int i = 0; i < n.getWeightCount(); i++) {
+ neuronOutput += n.getWeight(i) * inputs[i];
+ }
+
+ intermediateValues[neuronNum] = HyperTan(neuronOutput);
+ }
+
+ double result = 0;
+ for (int neuronNum = 0; neuronNum < intermediateValues.length; neuronNum++) {
+ result += intermediateValues[neuronNum] * outputNode.getWeight(neuronNum);
+ }
+
+ return new NeuralNetworkPrediction(this, inputs, intermediateValues, HyperTan(result));
+ }
+
+ void learn(NeuralNetworkPrediction p, double expectedOutput) {
+ double actualOutput = p.getOutput();
+ double[] intermediateValues = p.getIntermediateValues();
+ double[] inputs = p.getInputs();
+
+ double[] hiddenGradients = new double[hiddenNodes.length];
+
+ //Calculate output gradients
+ double outputDerivative = (1 - actualOutput) * (1 + actualOutput);
+
+ //Derivative of HyperTan function
+ double outputGradient = outputDerivative * (expectedOutput - actualOutput);
+
+ //Calulate hidden gradients
+ for (int i = 0; i < hiddenGradients.length; i++) {
+ //Derivative of HyperTan function
+ double hiddenDerivative = (1 - intermediateValues[i]) * (1 + intermediateValues[i]);
+ hiddenGradients[i] = hiddenDerivative * outputGradient * outputNode.getWeight(i);
+ }
+
+ //Update input => hidden weights.
+ final double learningRate = 0.3;
+ for (int neuronNum = 0; neuronNum < hiddenNodes.length; neuronNum++) {
+ Neuron n = hiddenNodes[neuronNum];
+
+ for (int i = 0; i < n.getWeightCount(); i++) {
+ //Calulate & apply delta
+ double delta = learningRate * hiddenGradients[neuronNum] * inputs[i];
+ n.adjustWeight(i, delta);
+ }
+ }
+
+ //Update hidden => output weights.
+ for (int i = 0; i < outputNode.getWeightCount(); i++) {
+ //Calulate & apply delta
+ double delta = learningRate * outputGradient * intermediateValues[i];
+ outputNode.adjustWeight(i, delta);
+ }
+ }
+
+ private static double HyperTan(double x) {
+ if (x < -10.0) return -1.0;
+ else if (x > 10.0) return 1.0;
+ else return Math.tanh(x);
+ }
+
+ public int getInputCount() {
+ return hiddenNodes[0].getWeightCount();
+ }
+}
diff --git a/app/src/main/java/org/rssin/neurons/NeuralNetworkPrediction.java b/app/src/main/java/org/rssin/neurons/NeuralNetworkPrediction.java new file mode 100755 index 0000000..cd34c8e --- /dev/null +++ b/app/src/main/java/org/rssin/neurons/NeuralNetworkPrediction.java @@ -0,0 +1,34 @@ +package org.rssin.neurons;
+
+/**
+ * Created by Jos on 14-5-2015.
+ */
+public class NeuralNetworkPrediction implements PredictionInterface {
+ private double[] inputs;
+ private double[] intermediateValues;
+ private double output;
+ private NeuralNetwork nn;
+
+ NeuralNetworkPrediction(NeuralNetwork nn, double[] inputs, double[] intermediateValues, double output) {
+ this.inputs = inputs;
+ this.intermediateValues = intermediateValues;
+ this.output = output;
+ this.nn = nn;
+ }
+
+ double[] getInputs() {
+ return inputs;
+ }
+
+ double[] getIntermediateValues() {
+ return intermediateValues;
+ }
+
+ public double getOutput() {
+ return output;
+ }
+
+ public void learn(double expectedOutput) {
+ nn.learn(this, expectedOutput);
+ }
+}
diff --git a/app/src/main/java/org/rssin/neurons/Neuron.java b/app/src/main/java/org/rssin/neurons/Neuron.java new file mode 100755 index 0000000..5df9d47 --- /dev/null +++ b/app/src/main/java/org/rssin/neurons/Neuron.java @@ -0,0 +1,40 @@ +package org.rssin.neurons;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+/**
+ * Created by Jos on 14-5-2015.
+ */
+class Neuron {
+ private static Random r = new Random();
+
+ private List<Double> weights = new ArrayList<Double>();
+
+ public Neuron() {
+ }
+
+ public Neuron(int numWeights) {
+ for (int i = 0; i < numWeights; i++) {
+ addWeight();
+ }
+ }
+
+ public int addWeight() {
+ weights.add(r.nextDouble() * 2 - 1);
+ return weights.size() - 1;
+ }
+
+ public double getWeight(int i) {
+ return weights.get(i);
+ }
+
+ public void adjustWeight(int i, double delta) {
+ weights.set(i, weights.get(i) + delta);
+ }
+
+ public int getWeightCount() {
+ return weights.size();
+ }
+}
diff --git a/app/src/main/java/org/rssin/neurons/PredictionInterface.java b/app/src/main/java/org/rssin/neurons/PredictionInterface.java new file mode 100755 index 0000000..d2c04b9 --- /dev/null +++ b/app/src/main/java/org/rssin/neurons/PredictionInterface.java @@ -0,0 +1,9 @@ +package org.rssin.neurons;
+
+/**
+ * Created by Jos on 14-5-2015.
+ */
+public interface PredictionInterface {
+ public double getOutput();
+ public void learn(double expectedOutput);
+}
diff --git a/app/src/main/java/org/rssin/rss/Feed.java b/app/src/main/java/org/rssin/rss/Feed.java new file mode 100644 index 0000000..5d65991 --- /dev/null +++ b/app/src/main/java/org/rssin/rss/Feed.java @@ -0,0 +1,7 @@ +package org.rssin.rss; + +/** + * Created by Randy on 19-5-2015. + */ +public class Feed { +} diff --git a/app/src/main/java/org/rssin/rss/FeedItem.java b/app/src/main/java/org/rssin/rss/FeedItem.java new file mode 100644 index 0000000..2ddad4f --- /dev/null +++ b/app/src/main/java/org/rssin/rss/FeedItem.java @@ -0,0 +1,76 @@ +package org.rssin.rss; + +import java.net.URL; +import java.util.Date; + +/** + * Created by Randy on 19-5-2015. + */ +public class FeedItem { + + private String guid; + private Date pubDate; + private String title; + private String description; + private URL link; + private String author; + private String[] category; + private URL comments; + private String enclosure; + private String source; + + public FeedItem(String guid, Date pubDate, String title, String description, URL link, + String author, String[] category, URL comments, String enclosure, String source) + { + this.guid = guid; + this.pubDate = pubDate; + this.title = title; + this.description = description; + this.link = link; + this.author = author; + this.category = category; + this.comments = comments; + this.enclosure = enclosure; + this.source = source; + } + + public String getGuid() { + return guid; + } + + public Date getPubDate() { + return pubDate; + } + + public String getTitle() { + return title; + } + + public String getDescription() { + return description; + } + + public URL getLink() { + return link; + } + + public String getAuthor() { + return author; + } + + public String[] getCategory() { + return category; + } + + public URL getComments() { + return comments; + } + + public String getEnclosure() { + return enclosure; + } + + public String getSource() { + return source; + } +} diff --git a/app/src/main/java/org/rssin/rss/FeedLoader.java b/app/src/main/java/org/rssin/rss/FeedLoader.java new file mode 100644 index 0000000..c69cb4c --- /dev/null +++ b/app/src/main/java/org/rssin/rss/FeedLoader.java @@ -0,0 +1,7 @@ +package org.rssin.rss; + +/** + * Created by Randy on 19-5-2015. + */ +public class FeedLoader { +} diff --git a/app/src/main/java/org/rssin/rssin/Filter.java b/app/src/main/java/org/rssin/rssin/Filter.java new file mode 100644 index 0000000..6bb191f --- /dev/null +++ b/app/src/main/java/org/rssin/rssin/Filter.java @@ -0,0 +1,45 @@ +package org.rssin.rssin; + +import org.rssin.rss.Feed; + +import java.io.Serializable; +import java.util.HashSet; +import java.util.Set; + +/** + * Created by camilstaps on 19-5-15. + */ +public class Filter implements Serializable { + + private final Set<Feed> feeds; + private final Set<Keyword> keywords; + + public Filter() { + feeds = new HashSet<>(); + keywords = new HashSet<>(); + } + + public Filter(Set<Keyword> keywords) { + this.feeds = new HashSet<>(); + this.keywords = keywords; + } + + public Filter(HashSet<Feed> feeds) { + this.feeds = feeds; + this.keywords = new HashSet<>(); + } + + public Filter(HashSet<Keyword> keywords, HashSet<Feed> feeds) { + this.feeds = feeds; + this.keywords = keywords; + } + + public Set<Feed> getFeeds() { + return feeds; + } + + public Set<Keyword> getKeywords() { + return keywords; + } + +} diff --git a/app/src/main/java/org/rssin/rssin/Keyword.java b/app/src/main/java/org/rssin/rssin/Keyword.java new file mode 100644 index 0000000..690d627 --- /dev/null +++ b/app/src/main/java/org/rssin/rssin/Keyword.java @@ -0,0 +1,18 @@ +package org.rssin.rssin; + +/** + * Created by camilstaps on 19-5-15. + */ +public class Keyword { + + private final String keyword; + + public Keyword(String keyword) { + this.keyword = keyword; + } + + public String getKeyword() { + return keyword; + } + +} |