{
  "id": 240161,
  "title": "3rd place solution",
  "url": "/competitions/indoor-location-navigation/writeups/zidmie-3rd-place-solution",
  "author_name": "",
  "post_date": "2021-05-18T17:56:01.517205500Z",
  "votes": 39,
  "comment_count": 11,
  "views": 0,
  "content": "<p>Thanks to the hosts for the great competition, and thanks to everyone who shared insights on the forum!<br>\nI'm so pleased to become a GM :-) It was worth spending a huge amount of time on this competition!</p>\n<p>I tried many many things, kept some of them in the process, gave up with others, but it's quite difficult to say which were good or not.</p>\n<p>First I compute the theoretical path (path shape : deltaX/Y from a waypoint to next waypoint) :</p>\n<ul>\n<li>my distance between 2 waypoints was obtained by a glm model, fitted on more than 2000 features, calculated with the accelerometer + gyro data. My rmse on distance prediction between 2 waypoints is around 1.1m. I think it was a competition inside the competition, to get a good distance model!</li>\n<li>the direction is obtained by using only the magnetic field. I tried to use gyro info, but it didn't improve my prediction. I also tried some filters with no success. The direction is often quite bad, like 30 degrees of deviation, but I didn't find a way to improve this.</li>\n</ul>\n<p>Then I have the WIFI model : <br>\nI mainly used a closest neighbor model. I applied some filters and thresholds on both train and test data (approx. 20 hyperparameters). I used the difference between timestamp and last seen timestamp to give a weight for each WIFI source. Also I have weights for each WIFI source as hyperparameters. This gave me a lot of hyperparameters.<br>\nI noticed that when I tune the hyperparameters of my WIFI model, the result could change a lot. One model will work for some paths and not for some others. So I optimized the hyperparameters for each path, until the path estimated by WIFI, had the same shape as the theoretical path. I optimized randomly with simulated annealing. This process was quite time consuming… I let it run during several weeks!<br>\nI also added WIFI information by computing the whole path on the training data and calculating WIFI information at a shorter timestamp, which gave me other models to blend, but was less good than the model with WIFI information located at each waypoint. <br>\nI then used these models, along with all public notebooks WIFI models, in a quick post processing : for each path, I give a weight to each WIFI model, and optimize these weights in order to have the best fit with the shape of the theoretical path.<br>\nAt the end of this step, my score is around 4m.</p>\n<p>Improving the theoretical path :<br>\nI calculated several improved paths : </p>\n<ul>\n<li>Starting from the theoretical path, I change the overall path so it starts and finishes where my WIFI model starts and finishes.</li>\n<li>I try to find similar shapes on a part of the theoretical path, and the training waypoints. When 3 or more consecutive waypoints match exactly (or nearly) with existing waypoints, after an X/Y offset, I consider that they are correct. Then I compute the remaining of the path (forward and backward) using the theoretical path. It's a \"local\" snap to grid, as I just move a few waypoints to the grid.</li>\n<li>then I did forward / backward iterations : starting from the WIFI position, I move according the the deltaXY and angle computed, and if there is a wall, I find the most logical direction to avoid the wall. This works well inside a corridor, but it's difficult to make it enter a narrow corridor. To avoid getting in the wrong corridor, I average the position at each timestep with the WIFI position. After 2 forward / backward iterations, most of the time my model gets in the right corridor.</li>\n</ul>\n<p>Finally there is my snap to grid method :<br>\nI used an automated waypoint generation.<br>\nThe snap to grid is obtained by calculating a probability for all training waypoints, at each time step. For the time step i, I calculate the probability to change from any training waypoint, to any other training waypoints. That's a bit similar to Markov processes, that I discovered in a previous competition (ion competition).<br>\nThe probability is a product of several probabilities : </p>\n<ul>\n<li>probability 0 if the path goes across a wall or a shop, </li>\n<li>probability linked to the distance to the WIFI model, </li>\n<li>probability linked to the distance to the any of the improved paths described above, </li>\n<li>probability linked to the distance from previous timestep (compared to the predicted distance used in the theoretical path)</li>\n<li>probability linked to the angle from the previous timestep (compared to the magnetic field information)</li>\n<li>penalty if the path from previous timestep, was already existing in the training set</li>\n<li>probability linked to the time leakage for first and last step</li>\n</ul>\n<p>Multiplying the probability of all waypoints at timestep i-1, by the matrix of probability described above (size n*n, where n is the number of training waypoint), gives a new probability array at timestep i.<br>\nI do this step forward, backward (giving a new starting point), forward again and backward again.<br>\nMy final position is the weighed average of all waypoints (I take the average of the last 2 steps).</p>\n<p>This final solution is used as input for a next iteration, by feeding the WIFI model with the positions obtained. <br>\nI also completed training data with test data, by assuming my test data XY prediction was exact. </p>\n<p>It was my first solo competition, it removes part of the fun I think… But I needed my solo gold metal and thought it was the good time!</p>",
  "messages": [
    {
      "id": "1313777",
      "postDate": "05/18/2021 17:56:01",
      "content": "<p>Thanks to the hosts for the great competition, and thanks to everyone who shared insights on the forum!<br>\nI'm so pleased to become a GM :-) It was worth spending a huge amount of time on this competition!</p>\n<p>I tried many many things, kept some of them in the process, gave up with others, but it's quite difficult to say which were good or not.</p>\n<p>First I compute the theoretical path (path shape : deltaX/Y from a waypoint to next waypoint) :</p>\n<ul>\n<li>my distance between 2 waypoints was obtained by a glm model, fitted on more than 2000 features, calculated with the accelerometer + gyro data. My rmse on distance prediction between 2 waypoints is around 1.1m. I think it was a competition inside the competition, to get a good distance model!</li>\n<li>the direction is obtained by using only the magnetic field. I tried to use gyro info, but it didn't improve my prediction. I also tried some filters with no success. The direction is often quite bad, like 30 degrees of deviation, but I didn't find a way to improve this.</li>\n</ul>\n<p>Then I have the WIFI model : <br>\nI mainly used a closest neighbor model. I applied some filters and thresholds on both train and test data (approx. 20 hyperparameters). I used the difference between timestamp and last seen timestamp to give a weight for each WIFI source. Also I have weights for each WIFI source as hyperparameters. This gave me a lot of hyperparameters.<br>\nI noticed that when I tune the hyperparameters of my WIFI model, the result could change a lot. One model will work for some paths and not for some others. So I optimized the hyperparameters for each path, until the path estimated by WIFI, had the same shape as the theoretical path. I optimized randomly with simulated annealing. This process was quite time consuming… I let it run during several weeks!<br>\nI also added WIFI information by computing the whole path on the training data and calculating WIFI information at a shorter timestamp, which gave me other models to blend, but was less good than the model with WIFI information located at each waypoint. <br>\nI then used these models, along with all public notebooks WIFI models, in a quick post processing : for each path, I give a weight to each WIFI model, and optimize these weights in order to have the best fit with the shape of the theoretical path.<br>\nAt the end of this step, my score is around 4m.</p>\n<p>Improving the theoretical path :<br>\nI calculated several improved paths : </p>\n<ul>\n<li>Starting from the theoretical path, I change the overall path so it starts and finishes where my WIFI model starts and finishes.</li>\n<li>I try to find similar shapes on a part of the theoretical path, and the training waypoints. When 3 or more consecutive waypoints match exactly (or nearly) with existing waypoints, after an X/Y offset, I consider that they are correct. Then I compute the remaining of the path (forward and backward) using the theoretical path. It's a \"local\" snap to grid, as I just move a few waypoints to the grid.</li>\n<li>then I did forward / backward iterations : starting from the WIFI position, I move according the the deltaXY and angle computed, and if there is a wall, I find the most logical direction to avoid the wall. This works well inside a corridor, but it's difficult to make it enter a narrow corridor. To avoid getting in the wrong corridor, I average the position at each timestep with the WIFI position. After 2 forward / backward iterations, most of the time my model gets in the right corridor.</li>\n</ul>\n<p>Finally there is my snap to grid method :<br>\nI used an automated waypoint generation.<br>\nThe snap to grid is obtained by calculating a probability for all training waypoints, at each time step. For the time step i, I calculate the probability to change from any training waypoint, to any other training waypoints. That's a bit similar to Markov processes, that I discovered in a previous competition (ion competition).<br>\nThe probability is a product of several probabilities : </p>\n<ul>\n<li>probability 0 if the path goes across a wall or a shop, </li>\n<li>probability linked to the distance to the WIFI model, </li>\n<li>probability linked to the distance to the any of the improved paths described above, </li>\n<li>probability linked to the distance from previous timestep (compared to the predicted distance used in the theoretical path)</li>\n<li>probability linked to the angle from the previous timestep (compared to the magnetic field information)</li>\n<li>penalty if the path from previous timestep, was already existing in the training set</li>\n<li>probability linked to the time leakage for first and last step</li>\n</ul>\n<p>Multiplying the probability of all waypoints at timestep i-1, by the matrix of probability described above (size n*n, where n is the number of training waypoint), gives a new probability array at timestep i.<br>\nI do this step forward, backward (giving a new starting point), forward again and backward again.<br>\nMy final position is the weighed average of all waypoints (I take the average of the last 2 steps).</p>\n<p>This final solution is used as input for a next iteration, by feeding the WIFI model with the positions obtained. <br>\nI also completed training data with test data, by assuming my test data XY prediction was exact. </p>\n<p>It was my first solo competition, it removes part of the fun I think… But I needed my solo gold metal and thought it was the good time!</p>",
      "rawMarkdown": "Thanks to the hosts for the great competition, and thanks to everyone who shared insights on the forum!\nI'm so pleased to become a GM :-) It was worth spending a huge amount of time on this competition!\n\nI tried many many things, kept some of them in the process, gave up with others, but it's quite difficult to say which were good or not.\n\nFirst I compute the theoretical path (path shape : deltaX/Y from a waypoint to next waypoint) :\n- my distance between 2 waypoints was obtained by a glm model, fitted on more than 2000 features, calculated with the accelerometer + gyro data. My rmse on distance prediction between 2 waypoints is around 1.1m. I think it was a competition inside the competition, to get a good distance model!\n- the direction is obtained by using only the magnetic field. I tried to use gyro info, but it didn't improve my prediction. I also tried some filters with no success. The direction is often quite bad, like 30 degrees of deviation, but I didn't find a way to improve this.\n\nThen I have the WIFI model : \nI mainly used a closest neighbor model. I applied some filters and thresholds on both train and test data (approx. 20 hyperparameters). I used the difference between timestamp and last seen timestamp to give a weight for each WIFI source. Also I have weights for each WIFI source as hyperparameters. This gave me a lot of hyperparameters.\nI noticed that when I tune the hyperparameters of my WIFI model, the result could change a lot. One model will work for some paths and not for some others. So I optimized the hyperparameters for each path, until the path estimated by WIFI, had the same shape as the theoretical path. I optimized randomly with simulated annealing. This process was quite time consuming... I let it run during several weeks!\nI also added WIFI information by computing the whole path on the training data and calculating WIFI information at a shorter timestamp, which gave me other models to blend, but was less good than the model with WIFI information located at each waypoint. \nI then used these models, along with all public notebooks WIFI models, in a quick post processing : for each path, I give a weight to each WIFI model, and optimize these weights in order to have the best fit with the shape of the theoretical path.\nAt the end of this step, my score is around 4m.\n\nImproving the theoretical path :\nI calculated several improved paths : \n- Starting from the theoretical path, I change the overall path so it starts and finishes where my WIFI model starts and finishes.\n- I try to find similar shapes on a part of the theoretical path, and the training waypoints. When 3 or more consecutive waypoints match exactly (or nearly) with existing waypoints, after an X/Y offset, I consider that they are correct. Then I compute the remaining of the path (forward and backward) using the theoretical path. It's a \"local\" snap to grid, as I just move a few waypoints to the grid.\n- then I did forward / backward iterations : starting from the WIFI position, I move according the the deltaXY and angle computed, and if there is a wall, I find the most logical direction to avoid the wall. This works well inside a corridor, but it's difficult to make it enter a narrow corridor. To avoid getting in the wrong corridor, I average the position at each timestep with the WIFI position. After 2 forward / backward iterations, most of the time my model gets in the right corridor.\n\nFinally there is my snap to grid method :\nI used an automated waypoint generation.\nThe snap to grid is obtained by calculating a probability for all training waypoints, at each time step. For the time step i, I calculate the probability to change from any training waypoint, to any other training waypoints. That's a bit similar to Markov processes, that I discovered in a previous competition (ion competition).\nThe probability is a product of several probabilities : \n- probability 0 if the path goes across a wall or a shop, \n- probability linked to the distance to the WIFI model, \n- probability linked to the distance to the any of the improved paths described above, \n- probability linked to the distance from previous timestep (compared to the predicted distance used in the theoretical path)\n- probability linked to the angle from the previous timestep (compared to the magnetic field information)\n- penalty if the path from previous timestep, was already existing in the training set\n- probability linked to the time leakage for first and last step\n\nMultiplying the probability of all waypoints at timestep i-1, by the matrix of probability described above (size n*n, where n is the number of training waypoint), gives a new probability array at timestep i.\nI do this step forward, backward (giving a new starting point), forward again and backward again.\nMy final position is the weighed average of all waypoints (I take the average of the last 2 steps).\n\nThis final solution is used as input for a next iteration, by feeding the WIFI model with the positions obtained. \nI also completed training data with test data, by assuming my test data XY prediction was exact. \n\nIt was my first solo competition, it removes part of the fun I think... But I needed my solo gold metal and thought it was the good time!",
      "votes": null
    },
    {
      "id": "1313829",
      "postDate": "05/18/2021 18:28:33",
      "content": "<p>Congratulations on winning and becoming GM! I remember years ago I did an AXA track prediction comp and your team was on top. I knew you'll do great this time.</p>\n<blockquote>\n  <p>My rmse on distance prediction between 2 waypoints is around 1.1m</p>\n</blockquote>\n<p>WOW, this is insanely good. My best model is about 1.58m. Please let me know if you plan to share the features/code of this model. I'm interested in running cuml glm models with your features. Thank you so much.</p>",
      "rawMarkdown": "Congratulations on winning and becoming GM! I remember years ago I did an AXA track prediction comp and your team was on top. I knew you'll do great this time.\n\n> My rmse on distance prediction between 2 waypoints is around 1.1m\n\nWOW, this is insanely good. My best model is about 1.58m. Please let me know if you plan to share the features/code of this model. I'm interested in running cuml glm models with your features. Thank you so much.",
      "votes": null
    },
    {
      "id": "1313862",
      "postDate": "05/18/2021 18:47:14",
      "content": "<p>Thanks a lot! Yes, Axa competition was my first Kaggle competition! It was great. It was track prediction but I don't think I used many of Axa competition ideas in this Indoor competition :) <br>\nSure I will share the distance prediction model, I think the features are quite good but the model could be much better!</p>",
      "rawMarkdown": "Thanks a lot! Yes, Axa competition was my first Kaggle competition! It was great. It was track prediction but I don't think I used many of Axa competition ideas in this Indoor competition :) \nSure I will share the distance prediction model, I think the features are quite good but the model could be much better!",
      "votes": null
    },
    {
      "id": "1313865",
      "postDate": "05/18/2021 18:49:14",
      "content": "<p>Félicitations!! Huge work, well deserved GM title :) </p>",
      "rawMarkdown": "Félicitations!! Huge work, well deserved GM title :)",
      "votes": null
    },
    {
      "id": "1313947",
      "postDate": "05/18/2021 20:17:16",
      "content": "<p>Congratz and welcome to the (very exclusive) French GM club ! :) </p>",
      "rawMarkdown": "Congratz and welcome to the (very exclusive) French GM club ! :)",
      "votes": null
    },
    {
      "id": "1313985",
      "postDate": "05/18/2021 21:09:37",
      "content": "<p>Thanks! Yes the amount of time spent here was huge :) </p>",
      "rawMarkdown": "Thanks! Yes the amount of time spent here was huge :)",
      "votes": null
    },
    {
      "id": "1313987",
      "postDate": "05/18/2021 21:10:56",
      "content": "<p>Thanks, I'm glad to join this club :) </p>",
      "rawMarkdown": "Thanks, I'm glad to join this club :)",
      "votes": null
    },
    {
      "id": "1314089",
      "postDate": "05/19/2021 00:28:23",
      "content": "<p>Congrats <a href=\"https://www.kaggle.com/zidmie\" target=\"_blank\">@zidmie</a> on a wonderful solution and becoming GM!</p>",
      "rawMarkdown": "Congrats @zidmie on a wonderful solution and becoming GM!",
      "votes": null
    },
    {
      "id": "1314288",
      "postDate": "05/19/2021 04:58:45",
      "content": "<p>Congratulations <a href=\"https://www.kaggle.com/zidmie\" target=\"_blank\">@zidmie</a> on  becoming GM!<br>\nand sharing your approach-- lots of interesting ideas to learn from!! Thank you for all the sharing during the competition stage!</p>",
      "rawMarkdown": "Congratulations @zidmie on  becoming GM!\nand sharing your approach-- lots of interesting ideas to learn from!! Thank you for all the sharing during the competition stage!",
      "votes": null
    },
    {
      "id": "1314310",
      "postDate": "05/19/2021 05:31:04",
      "content": "<p>Thank you Rob! During the competition, I was thinking to Ion competition and how you were happy to get your GM at the end of that competition. This motivated me to work hard and get this gold!</p>",
      "rawMarkdown": "Thank you Rob! During the competition, I was thinking to Ion competition and how you were happy to get your GM at the end of that competition. This motivated me to work hard and get this gold!",
      "votes": null
    },
    {
      "id": "1314316",
      "postDate": "05/19/2021 05:32:40",
      "content": "<p>Thanks to you too for all the sharing and nice posts during the competition! </p>",
      "rawMarkdown": "Thanks to you too for all the sharing and nice posts during the competition!",
      "votes": null
    },
    {
      "id": "1315439",
      "postDate": "05/19/2021 19:33:00",
      "content": "<p>Congratulations to be Grandmaster (5*)! Well deserved and looking forward to see you in future competitions.</p>",
      "rawMarkdown": "Congratulations to be Grandmaster (5*)! Well deserved and looking forward to see you in future competitions.",
      "votes": null
    }
  ],
  "comments": [
    {
      "id": 1313829,
      "author_name": "jiweiliu",
      "author_url": "",
      "post_date": "05/18/2021 18:28:33",
      "content": "<p>Congratulations on winning and becoming GM! I remember years ago I did an AXA track prediction comp and your team was on top. I knew you'll do great this time.</p>\n<blockquote>\n  <p>My rmse on distance prediction between 2 waypoints is around 1.1m</p>\n</blockquote>\n<p>WOW, this is insanely good. My best model is about 1.58m. Please let me know if you plan to share the features/code of this model. I'm interested in running cuml glm models with your features. Thank you so much.</p>",
      "votes": null,
      "replies": [
        {
          "id": 1313862,
          "author_name": "zidmie",
          "author_url": "",
          "post_date": "05/18/2021 18:47:14",
          "content": "<p>Thanks a lot! Yes, Axa competition was my first Kaggle competition! It was great. It was track prediction but I don't think I used many of Axa competition ideas in this Indoor competition :) <br>\nSure I will share the distance prediction model, I think the features are quite good but the model could be much better!</p>",
          "votes": null,
          "replies": []
        }
      ]
    },
    {
      "id": 1313865,
      "author_name": "romainfabre",
      "author_url": "",
      "post_date": "05/18/2021 18:49:14",
      "content": "<p>Félicitations!! Huge work, well deserved GM title :) </p>",
      "votes": null,
      "replies": [
        {
          "id": 1313985,
          "author_name": "zidmie",
          "author_url": "",
          "post_date": "05/18/2021 21:09:37",
          "content": "<p>Thanks! Yes the amount of time spent here was huge :) </p>",
          "votes": null,
          "replies": []
        }
      ]
    },
    {
      "id": 1313947,
      "author_name": "theoviel",
      "author_url": "",
      "post_date": "05/18/2021 20:17:16",
      "content": "<p>Congratz and welcome to the (very exclusive) French GM club ! :) </p>",
      "votes": null,
      "replies": [
        {
          "id": 1313987,
          "author_name": "zidmie",
          "author_url": "",
          "post_date": "05/18/2021 21:10:56",
          "content": "<p>Thanks, I'm glad to join this club :) </p>",
          "votes": null,
          "replies": []
        }
      ]
    },
    {
      "id": 1314089,
      "author_name": "robikscube",
      "author_url": "",
      "post_date": "05/19/2021 00:28:23",
      "content": "<p>Congrats <a href=\"https://www.kaggle.com/zidmie\" target=\"_blank\">@zidmie</a> on a wonderful solution and becoming GM!</p>",
      "votes": null,
      "replies": [
        {
          "id": 1314310,
          "author_name": "zidmie",
          "author_url": "",
          "post_date": "05/19/2021 05:31:04",
          "content": "<p>Thank you Rob! During the competition, I was thinking to Ion competition and how you were happy to get your GM at the end of that competition. This motivated me to work hard and get this gold!</p>",
          "votes": null,
          "replies": []
        }
      ]
    },
    {
      "id": 1314288,
      "author_name": "kmldas",
      "author_url": "",
      "post_date": "05/19/2021 04:58:45",
      "content": "<p>Congratulations <a href=\"https://www.kaggle.com/zidmie\" target=\"_blank\">@zidmie</a> on  becoming GM!<br>\nand sharing your approach-- lots of interesting ideas to learn from!! Thank you for all the sharing during the competition stage!</p>",
      "votes": null,
      "replies": [
        {
          "id": 1314316,
          "author_name": "zidmie",
          "author_url": "",
          "post_date": "05/19/2021 05:32:40",
          "content": "<p>Thanks to you too for all the sharing and nice posts during the competition! </p>",
          "votes": null,
          "replies": []
        }
      ]
    },
    {
      "id": 1315439,
      "author_name": "khahuras",
      "author_url": "",
      "post_date": "05/19/2021 19:33:00",
      "content": "<p>Congratulations to be Grandmaster (5*)! Well deserved and looking forward to see you in future competitions.</p>",
      "votes": null,
      "replies": []
    }
  ],
  "raw_markdown_by_id": {
    "1313777": "Thanks to the hosts for the great competition, and thanks to everyone who shared insights on the forum!\nI'm so pleased to become a GM :-) It was worth spending a huge amount of time on this competition!\n\nI tried many many things, kept some of them in the process, gave up with others, but it's quite difficult to say which were good or not.\n\nFirst I compute the theoretical path (path shape : deltaX/Y from a waypoint to next waypoint) :\n- my distance between 2 waypoints was obtained by a glm model, fitted on more than 2000 features, calculated with the accelerometer + gyro data. My rmse on distance prediction between 2 waypoints is around 1.1m. I think it was a competition inside the competition, to get a good distance model!\n- the direction is obtained by using only the magnetic field. I tried to use gyro info, but it didn't improve my prediction. I also tried some filters with no success. The direction is often quite bad, like 30 degrees of deviation, but I didn't find a way to improve this.\n\nThen I have the WIFI model : \nI mainly used a closest neighbor model. I applied some filters and thresholds on both train and test data (approx. 20 hyperparameters). I used the difference between timestamp and last seen timestamp to give a weight for each WIFI source. Also I have weights for each WIFI source as hyperparameters. This gave me a lot of hyperparameters.\nI noticed that when I tune the hyperparameters of my WIFI model, the result could change a lot. One model will work for some paths and not for some others. So I optimized the hyperparameters for each path, until the path estimated by WIFI, had the same shape as the theoretical path. I optimized randomly with simulated annealing. This process was quite time consuming... I let it run during several weeks!\nI also added WIFI information by computing the whole path on the training data and calculating WIFI information at a shorter timestamp, which gave me other models to blend, but was less good than the model with WIFI information located at each waypoint. \nI then used these models, along with all public notebooks WIFI models, in a quick post processing : for each path, I give a weight to each WIFI model, and optimize these weights in order to have the best fit with the shape of the theoretical path.\nAt the end of this step, my score is around 4m.\n\nImproving the theoretical path :\nI calculated several improved paths : \n- Starting from the theoretical path, I change the overall path so it starts and finishes where my WIFI model starts and finishes.\n- I try to find similar shapes on a part of the theoretical path, and the training waypoints. When 3 or more consecutive waypoints match exactly (or nearly) with existing waypoints, after an X/Y offset, I consider that they are correct. Then I compute the remaining of the path (forward and backward) using the theoretical path. It's a \"local\" snap to grid, as I just move a few waypoints to the grid.\n- then I did forward / backward iterations : starting from the WIFI position, I move according the the deltaXY and angle computed, and if there is a wall, I find the most logical direction to avoid the wall. This works well inside a corridor, but it's difficult to make it enter a narrow corridor. To avoid getting in the wrong corridor, I average the position at each timestep with the WIFI position. After 2 forward / backward iterations, most of the time my model gets in the right corridor.\n\nFinally there is my snap to grid method :\nI used an automated waypoint generation.\nThe snap to grid is obtained by calculating a probability for all training waypoints, at each time step. For the time step i, I calculate the probability to change from any training waypoint, to any other training waypoints. That's a bit similar to Markov processes, that I discovered in a previous competition (ion competition).\nThe probability is a product of several probabilities : \n- probability 0 if the path goes across a wall or a shop, \n- probability linked to the distance to the WIFI model, \n- probability linked to the distance to the any of the improved paths described above, \n- probability linked to the distance from previous timestep (compared to the predicted distance used in the theoretical path)\n- probability linked to the angle from the previous timestep (compared to the magnetic field information)\n- penalty if the path from previous timestep, was already existing in the training set\n- probability linked to the time leakage for first and last step\n\nMultiplying the probability of all waypoints at timestep i-1, by the matrix of probability described above (size n*n, where n is the number of training waypoint), gives a new probability array at timestep i.\nI do this step forward, backward (giving a new starting point), forward again and backward again.\nMy final position is the weighed average of all waypoints (I take the average of the last 2 steps).\n\nThis final solution is used as input for a next iteration, by feeding the WIFI model with the positions obtained. \nI also completed training data with test data, by assuming my test data XY prediction was exact. \n\nIt was my first solo competition, it removes part of the fun I think... But I needed my solo gold metal and thought it was the good time!",
    "1313829": "Congratulations on winning and becoming GM! I remember years ago I did an AXA track prediction comp and your team was on top. I knew you'll do great this time.\n\n> My rmse on distance prediction between 2 waypoints is around 1.1m\n\nWOW, this is insanely good. My best model is about 1.58m. Please let me know if you plan to share the features/code of this model. I'm interested in running cuml glm models with your features. Thank you so much.",
    "1313862": "Thanks a lot! Yes, Axa competition was my first Kaggle competition! It was great. It was track prediction but I don't think I used many of Axa competition ideas in this Indoor competition :) \nSure I will share the distance prediction model, I think the features are quite good but the model could be much better!",
    "1313865": "Félicitations!! Huge work, well deserved GM title :)",
    "1313947": "Congratz and welcome to the (very exclusive) French GM club ! :)",
    "1313985": "Thanks! Yes the amount of time spent here was huge :)",
    "1313987": "Thanks, I'm glad to join this club :)",
    "1314089": "Congrats @zidmie on a wonderful solution and becoming GM!",
    "1314288": "Congratulations @zidmie on  becoming GM!\nand sharing your approach-- lots of interesting ideas to learn from!! Thank you for all the sharing during the competition stage!",
    "1314310": "Thank you Rob! During the competition, I was thinking to Ion competition and how you were happy to get your GM at the end of that competition. This motivated me to work hard and get this gold!",
    "1314316": "Thanks to you too for all the sharing and nice posts during the competition!",
    "1315439": "Congratulations to be Grandmaster (5*)! Well deserved and looking forward to see you in future competitions."
  },
  "source": "meta"
}