Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
150 changes: 150 additions & 0 deletions examples/recommendation-engine/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,150 @@

<!doctype html>
<html lang="en">
<head>
<title>brain.js tutorial</title>
<style>
.articleImage {
width:180px;
}

.ratingItem {
padding-bottom: 30px;
}

.suggestedItems {
display: flex;
flex-wrap: wrap;
width:650px;
}

.suggestionItem {
padding-right:15px;
padding-top: 30px;
}
</style>
</head>
<body onLoad="nextTry();">
<script src="https://unpkg.com/brain.js@1.1.2/browser.min.js"></script>
<script src="itemsInStock.js"></script>
<script>
const color_normalization_factor = 100;
const neckline_normalization_factor = 10;
const price_normalization_factor = 100;

let trainingData = [
{ input: {color: color_black, hasPrinting: false, neckline: neckline_round, price: 0.1999 }, output: { wanted: 0 } }
];
let ratingItem;

function nextTry(rating){
document.getElementById('result').innerHTML = '';

if(undefined !== ratingItem){
trainingData.push({ input: ratingItem.trainingInformation, output: { wanted: rating / 4 } });
}

const network = new brain.NeuralNetwork({
activation: 'sigmoid',
hiddenLayers: [4]
});
network.train(trainingData);

let suggestionItemsText = '';
let suggestionItems = [];
for(i=0;i<itemsInStock.length;i++){
let item = getNormalizedItemFromStock(i);
item.wanted = network.run(item.trainingInformation).wanted;
suggestionItems.push(item);
}

suggestionItems.sort(function(a,b){
return b.wanted - a.wanted;
});

for(i=0;i<suggestionItems.length;i++){
suggestionItem = suggestionItems[i];
suggestionItemsText +=
'<div class="suggestionItem">' +
getFormattedItem(suggestionItem) + ' <br/> ' +
'wanted: ' + Math.round(suggestionItem.wanted * 100) + '%'
+ '</div>';
}

ratingItem = getNormalizedItemFromStock(Math.floor((Math.random() * itemsInStock.length - 1) + 1));
document.getElementById('result').innerHTML +=
'<div class="ratingItem">' +
'Rate this:<br/>' +
getFormattedItem(ratingItem) + '<br/>' +
'</div>' +
'Suggested items:<br/>' +
'<div class="suggestedItems">' +
suggestionItemsText +
'</div>';
}

function getNormalizedItemFromStock(index){
const item = itemsInStock[index];
trainingInformation = item.trainingInformation;
return {
trainingInformation : {
color: trainingInformation.color / color_normalization_factor,
hasPrinting: trainingInformation.hasPrinting,
neckline: trainingInformation.neckline / neckline_normalization_factor,
price: trainingInformation.price / price_normalization_factor
},
displayingInformation : item.displayingInformation
};
}

function getFormattedItem(item){
const trainingInformation = item.trainingInformation;
const formattedItem =
'<img class="articleImage" src="images/articles/' + item.displayingInformation.imageFile + '"/><br/>' +
'color: ' + getColorName(trainingInformation.color) + '<br/>' +
'has printing?: ' + (1 === trainingInformation.hasPrinting ? 'yes' : 'no') + '<br/>' +
'neckline: ' + getNecklineName(trainingInformation.neckline) + '<br/>' +
'price: ' + ((Math.round((trainingInformation.price * price_normalization_factor) * 100)) / 100) + ' &euro;';
return formattedItem;
}

function getColorName(color){
var id = color * color_normalization_factor;
var name =
color_black === id ? 'black' :
color_blue === id ? 'blue' :
color_darkblue === id ? 'dark blue' :
color_gray === id ? 'gray' :
color_green === id ? 'green' :
color_lightblue === id ? 'light blue' :
color_lightgreen === id ? 'light green' :
color_skin === id ? 'skin' :
color_turqoise === id ? 'turqoise' :
color_white === id ? 'white' :
'';
return name;
}

function getNecklineName(color){
var id = color * neckline_normalization_factor;
var name =
neckline_round === id ? 'round' :
neckline_v === id ? 'v' :
'';
return name;
}
</script>

<center>
<br/><br/><br/><br/><br/><br/><br/>
<input type="button" value="1" onClick="nextTry(0);"/>
<input type="button" value="2" onClick="nextTry(1);"/>
<input type="button" value="3" onClick="nextTry(2);"/>
<input type="button" value="4" onClick="nextTry(3);"/>
<input type="button" value="5" onClick="nextTry(4);"/>
<br/><br/>
<div id="result">
</div>
</center>
</body>
</html>
80 changes: 80 additions & 0 deletions examples/recommendation-engine/itemsInStock.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
const color_black = 1;
const color_blue = 2;
const color_darkblue = 3;
const color_gray = 4;
const color_white = 5;
const color_green = 6;
const color_turqoise = 7;
const color_skin = 8;
const color_lightblue = 9;
const color_lightgreen = 10;

const neckline_round = 1;
const neckline_v = 2;

let itemsInStock = [
{
trainingInformation: { color: color_black, hasPrinting: 0, neckline: neckline_round, price: 19.99 },
displayingInformation: { imageFile: 'cl_black_nl_circle_hp_false_prc_1999.jpg' }
},
{
trainingInformation: { color: color_blue, hasPrinting: 0, neckline: neckline_round, price: 19.99 },
displayingInformation: { imageFile: 'cl_blue_nl_circle_hp_false_prc_1999.jpg' }
},
{
trainingInformation: { color: color_darkblue, hasPrinting: 1, neckline: neckline_round, price: 29.99 },
displayingInformation: { imageFile: 'cl_darkblue_nl_circle_hp_true_prc_2999.jpg' }
},
{
trainingInformation: { color: color_gray, hasPrinting: 0, neckline: neckline_v, price: 9.99 },
displayingInformation: { imageFile: 'cl_gray_nl_v_hp_false_prc_999.jpg' }
},
{
trainingInformation: { color: color_white, hasPrinting: 0, neckline: neckline_v, price: 9.99 },
displayingInformation: { imageFile: 'cl_white_nl_v_hp_false_prc_999.jpg' }
},
{
trainingInformation: { color: color_green, hasPrinting: 0, neckline: neckline_round, price: 17.99 },
displayingInformation: { imageFile: 'cl_green_nl_circle_hp_false_prc_1799.jpg' }
},
{
trainingInformation: { color: color_blue, hasPrinting: 0, neckline: neckline_round, price: 17.99 },
displayingInformation: { imageFile: 'cl_blue_nl_circle_hp_false_prc_1799.jpg' }
},
{
trainingInformation: { color: color_turqoise, hasPrinting: 1, neckline: neckline_round, price: 15.99 },
displayingInformation: { imageFile: 'cl_turqoise_nl_circle_hp_true_prc_1599.jpg' }
},
{
trainingInformation: { color: color_skin, hasPrinting: 1, neckline: neckline_round, price: 15.99 },
displayingInformation: { imageFile: 'cl_skin_nl_circle_hp_true_prc_1599.jpg' }
},
{
trainingInformation: { color: color_darkblue, hasPrinting: 1, neckline: neckline_round, price: 15.99 },
displayingInformation: { imageFile: 'cl_darkblue_nl_circle_hp_true_prc_1599.jpg' }
},
{
trainingInformation: { color: color_turqoise, hasPrinting: 1, neckline: neckline_round, price: 15.99 },
displayingInformation: { imageFile: 'cl_turqoise_nl_circle_hp_true_prc_1599_1.jpg' }
},
{
trainingInformation: { color: color_darkblue, hasPrinting: 1, neckline: neckline_round, price: 15.99 },
displayingInformation: { imageFile: 'cl_darkblue_nl_circle_hp_true_prc_1599_1.jpg' }
},
{
trainingInformation: { color: color_lightblue, hasPrinting: 0, neckline: neckline_round, price: 19.99 },
displayingInformation: { imageFile: 'cl_lightblue_nl_circle_hp_false_prc_1999.jpg' }
},
{
trainingInformation: { color: color_lightgreen, hasPrinting: 0, neckline: neckline_round, price: 19.99 },
displayingInformation: { imageFile: 'cl_lightgreen_nl_circle_hp_false_prc_1999.jpg' }
},
{
trainingInformation: { color: color_skin, hasPrinting: 0, neckline: neckline_round, price: 19.99 },
displayingInformation: { imageFile: 'cl_skin_nl_circle_hp_false_prc_1999.jpg' }
},
{
trainingInformation: { color: color_gray, hasPrinting: 0, neckline: neckline_round, price: 19.99 },
displayingInformation: { imageFile: 'cl_gray_nl_circle_hp_false_prc_1999.jpg' }
},
];