The KOM Informatics Project


I rolled my own cycling analytics application. I got interested in the interval detection problem. It seems like a pretty obvious feature: After defining power zones provide some minimum duration interval per zone where the physiological benefits start to accrue. When you upload your ride, the system notices those intervals that at least meet the minimum standards for watts and duration that you've provided. Yet, to my knowledge, no company in the industry has come up with a solution.


It turns out that it's relatively easy to detect intervals, the problem is is that there are too damn many of them. Even a relatively small ride like the demo I link to below can yield over 1.5 million intervals, most of which are very similar to each other. But displaying and storing that many intervals per ride is not feasible for a commercial application.


To make a long story short I found a heuristic solution to the problem. The algorithm distills potentially millions of candidates down to the most important and relevant ones for your ride. I've been working on it for almost a three years now and it's gone through 4 major revisions.


Ride Page

Power Curve Comparison

Race Readiness Graph

Here's a sample ride page from the new KOM Informatics application. None of the outbound links work because it's an html copy of a dynamic page displayed out of context. But all of the javascript functions are working, and should give you an experience very close to the same page within the context of the system. (click on any of the adjacent thumbnails for a full size image).





Once interval detection was working I had to figure out how to aggregate and report on results. The main question is "How is workload affecting performance?". This article, first published in December 2017, discusses the 6 Week Training Summary report, the first tool created to focus on this question, and how I used it to explain a small improvement, year over year in a TT effort.


In the first quarter of 2018 I worked on making the reporting on workload/performance better.


As discussed above, KOM Informatics tracks time and kilojoules for all interval work, as well as non-interval work.


At the same time the Personal Records subsystem records best wattage effort for 18 "time boxes" for each ride. These time boxes were selected to correspond to pretty standard interval lengths which are prescribed by cycling coaches. The Personal Records report allows filtering this data by date range, and number returned.


The system brings the 2 concepts together by providing statistical correlations between workload and performance. Here is an article which discusses how the system accomplishes this.


June 2018 marked the first month where I had a chance to digest and use the findings of a whole year's worth of data. The system's reports gave some pretty clear indications of what the most beneficial mix of training (out of what I've tried so far) was for me. So what happened when I tried to apply the lessons learned from the system? Here's an article which discusses that topic


In the Fall of 2018 I integrated muscle oxygen data (SmO2) into the system. I had long suspected that cycling analytics applications using traditional power based methods for calculating weighted average power were under-reporting training load for rides involving high intensity efforts. So, I did a study comparing the output of 2 popular smoothing algorithms, simple moving average (SMA) and exponential moving average (EMA) with muscle oxygen data. I ended up creating a new formula called SmO2 Weighted Average Power, which uses muscle oxygen data to account for the physiological stress of a ride. Under the new formula the rides that gained the most weighted average power were characterized by much higher workloads in the anaerobic and neuromuscular zones then those that only gained a few watts or less. Here's a link to the study.