Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
cours:plim:projet16_17:gr3:gr3 [2017/01/24 09:34] lsauvage [Présentation du projet] |
cours:plim:projet16_17:gr3:gr3 [2017/02/17 17:59] (Version actuelle) lsauvage [Algorithme] |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | ====== AutoTraffic ====== | + | ====== SmartRoad ====== |
==== Présentation du projet ==== | ==== Présentation du projet ==== | ||
Ligne 7: | Ligne 7: | ||
* Nom 2 : Lucas Sauvage | * Nom 2 : Lucas Sauvage | ||
* Créneau : AM | * Créneau : AM | ||
- | * Nom du Projet : AutoTraffic | + | * Nom du Projet : SmartRoad |
=== Un scénario d'illustration du Projet === | === Un scénario d'illustration du Projet === | ||
Ligne 17: | Ligne 17: | ||
Bob répète la même opération plusieurs fois afin que l’application collecte plusieurs fois les données. Au bout de x trajets, l’application commence à informer Bob du temps qu’il va mettre pour rentrer si il part maintenant. Bob peut également consulter des anciens relevés de ces trajets afin d'y retrouver les pires et meilleurs horaires de chaque jour. | Bob répète la même opération plusieurs fois afin que l’application collecte plusieurs fois les données. Au bout de x trajets, l’application commence à informer Bob du temps qu’il va mettre pour rentrer si il part maintenant. Bob peut également consulter des anciens relevés de ces trajets afin d'y retrouver les pires et meilleurs horaires de chaque jour. | ||
- | L'application : | + | __L'application :__ |
Application récupérant des informations sur le trajet quotidien de ses utilisateurs. Celle-ci déterminera le temps moyen du trajet de l'utilisateur. Plus précisément, l'idée est de pouvoir informer l'utilisateur dans combien de temps il sera chez lui s'il part maintenant (à cet horaire précisément). L'utilisateur a également la possibilité de consulter un résumé des anciens relevés de ces trajets. | Application récupérant des informations sur le trajet quotidien de ses utilisateurs. Celle-ci déterminera le temps moyen du trajet de l'utilisateur. Plus précisément, l'idée est de pouvoir informer l'utilisateur dans combien de temps il sera chez lui s'il part maintenant (à cet horaire précisément). L'utilisateur a également la possibilité de consulter un résumé des anciens relevés de ces trajets. | ||
Ligne 90: | Ligne 90: | ||
* SDK et cible : Android (https://developer.android.com/about/versions/android-4.3.html) | * SDK et cible : Android (https://developer.android.com/about/versions/android-4.3.html) | ||
* API : | * API : | ||
- | * Google Maps (https://developers.google.com/maps/documentation/android-api/intro?hl=fr) | ||
* Google RoadMaps (https://developers.google.com/maps/documentation/roads/intro) | * Google RoadMaps (https://developers.google.com/maps/documentation/roads/intro) | ||
* Environnement de logiciel : Android | * Environnement de logiciel : Android | ||
* Version OS : 4.3 | * Version OS : 4.3 | ||
- | Le projet est-il faisable ? Oui, tous nos appareils sont équipés d’un GPS qui nous permettra de géolocaliser l’utilisateur à des intervalles de temps régulier. L’utilisateur n’a pas besoin d’avoir une connexion à internet permanente. En effet, les données collectées seront transmise au serveur à la fin du parcours. Repérer une zone à éviter ne devrait pas être un obstacle, en effet à partir des positions et du temps, nous pourrons calculer la vitesse. | + | Le projet est-il faisable ? Oui, tous nos appareils sont équipés d’un GPS qui nous permettra de géolocaliser l’utilisateur à des intervalles de temps régulier. L’utilisateur n’a pas besoin d’avoir une connexion à internet permanente. En effet, les données collectées seront transmise au serveur à la fin du parcours. |
- | * Le SDK d’Android nous permettra d’avoir accès aux données du GPS et d’envoyer des "Proximity Alert" quand le téléphone s’approche d’une certaine zone [[https://developer.android.com/reference/android/location/LocationManager.html#addProximityAlert(double, double, float, long, android.app.PendingIntent)]] | + | * Le SDK d’Android nous permettra d’avoir accès aux données du GPS et d’envoyer des "Proximity Alert" quand le téléphone s’approche d’une certaine zone (checkpoint) [[https://developer.android.com/reference/android/location/LocationManager.html#addProximityAlert(double, double, float, long, android.app.PendingIntent)]] |
- | * L’API Google Maps nous permettra d’afficher une carte à l’utilisateur | + | |
* L’API Google RoadMaps nous permettra de définir le parcours et d’obtenir des points qui appartiennent à la route prise par notre utilisateur | * L’API Google RoadMaps nous permettra de définir le parcours et d’obtenir des points qui appartiennent à la route prise par notre utilisateur | ||
Ligne 114: | Ligne 112: | ||
Nous allons calculer l’heure d’arrivée en fonction des précédents relevés réalisées. \\ | Nous allons calculer l’heure d’arrivée en fonction des précédents relevés réalisées. \\ | ||
\\ | \\ | ||
- | Pour le moment nous hésitons encore sur quel algorithme utilisée entre machine de vecteurs et système neuronal, les 2 permettent de donner en sortie une estimation du temps restant. Malgré nos hésitations, nous allons dans un premier temps partir sur un algorithme SVM. | + | Suite à notre discussion avec Mme DARTIGUES-PALLEZ, nous avons décidé de partir sur un algorithme SVM, algorithme qui semble être le plus approprié à notre projet. |
Algorithme SVM (machines à vecteurs de support) : | Algorithme SVM (machines à vecteurs de support) : | ||
Ligne 128: | Ligne 125: | ||
+ | __Pourquoi utiliser SVM ?__ | ||
+ | |||
+ | Contrairement à des algorithmes de clustering non supervisé, SVM permet de déterminer quel est le meilleur découpage de l'espace en fonction des données qui sont déjà classifiées/labélisées en amont. | ||
+ | |||
+ | KMEAN par exemple reçoit des données et les découpe en calculant les K meilleurs centroides. Une donnée appartiendra alors à un groupe seulement en fonction de sa réciprocité envers un centroide, ce qui peut amener de nombreuses erreurs selon la répartition des groupes. | ||
+ | |||
+ | Si en revanche nous savons déjà à quel type de groupe apparient une donnée (cf: bon trajet/mauvais trajet), SVM utilisera ces informations pour déterminer quelle est la meilleure fonction qui découpe ces différents groupes. Dans notre programme nous savons identifier de bons et de mauvais trajet en fonction de la durée du trajet et de sa différence à la médiane de tous les trajets. Nous avons définis 7 groupes, comme un bison futé, chaque groupe est représenté par un entier dans l'intervalle [-3;3] | ||
+ | |||
+ | * -3 : durée < 50% | ||
+ | * -2 : 50% < durée < 70% | ||
+ | * -1 : 70% < durée < 90% | ||
+ | * 0 : 90% < durée < 110% | ||
+ | * 1 : 110% < durée < 130% | ||
+ | * 2 : 130% < durée < 150% | ||
+ | * 3 : 150% < durée | ||
+ | |||
+ | Ainsi nous améliorons la précision de l'algorithme d'apprentissage. | ||
+ | KMEAN ne fonctionne pas de cette manière on se contente de lui donner des données qu'il va classifier en k groupes distincts. Si nous ne sommes pas sûrs de la répartition de nos échantillons dans un repère à n dimensions où une dimension peut par exemple correspondre au jour de la semaine KMEAN peut s'avérer désastreux. | ||
+ | |||
+ | Si nous prenons comme exemple la répartition de points en 2 groupes distincts (jaune/mauve). | ||
+ | KMEAN calculera les centroides et rapprochera des points qui dans notre cas n'appartiennent pas à la même classe. | ||
+ | |||
+ | {{:cours:plim:projet16_17:gr3:cluster.png?200|}} | ||
+ | |||
+ | SVM quant à lui découpera l'espace en préservant les groupes du mieux qu'il peut. | ||
+ | |||
+ | {{:cours:plim:projet16_17:gr3:svm.png?200|}} | ||
+ | |||
+ | Dernier avantage de SVM, il permet de classifier des points mêmes en ayant des coordonnées manquantes ce qui correspond à notre problématique car certains checkpoints n'ont pas encore été atteints or nous voulons une prédiction quant à l'heure d'arrivée. | ||
+ | |||
+ | === Code, installation et explications === | ||
+ | \\ | ||
+ | Voir les deux README.md sur nos repesitorys github : | ||
+ | * https://github.com/Paltoquet/SmartRoadv2 | ||
+ | * https://github.com/Drym/SmartServerV2 | ||