# CIKM 2019 figure and formula notes

English edition prepared on 2026-09-13. The post keeps the original publication date, 2019-11-12. The archived Zhihu page records 06:01 but does not establish its time zone, so the post deliberately uses a date without an invented time or UTC offset.

## Sources

- Original post: https://zhuanlan.zhihu.com/p/91506866 (read from the author's 2026-09-07 archive).
- Code repository snapshot: https://github.com/ChuanyuXue/CIKM-2019-AnalytiCup/tree/df410ab6b9fb9dd1bf50711aa2a01cfd4fdc5e36
- `复赛方案简介.pdf`: original second-round team report; credits Shunyao Wu as its writer.
- `cikm19.pdf` and `答辩ppt.pptx`: the team's presentation. The PPTX contains no embedded chart workbooks or native chart datasets. EDA charts appear as raster images.
- The public training notebooks contain the implementation but not the original EDA data or a notebook regenerating all of those charts. The README points to an external dataset download; that dataset was not retrieved or rerun for this edition.

## Figure mapping

All ten SVGs are new vector drawings. None embeds or traces a raster image. SVGs retain text as text. Matplotlib draws the statistical charts; the other figures use SVG shapes and text directly.

| English asset | Original material | Treatment |
| --- | --- | --- |
| `01-pipeline.svg` | Figure 1, recommendation pipeline | New layout; constraints from the report. |
| `02-behavior.svg` | Figure 2, future category activity by past behavior | Approximate box summaries read visually from the chart. Individual outliers omitted because their counts cannot be recovered. |
| `03-recency.svg` | Figure 3, historical activity for future-interest items | Bar heights estimated visually and rounded. Not recovered raw counts. |
| `04-category-shop.svg` | Figures 4a and 4b | Both panels redrawn using approximate box summaries. Individual outliers omitted. |
| `05-retrieval.svg` | Figure 5 and presentation slide 20 | New diagram using the original illustrative fruit/sports example; these are example scores, not experimental measurements. |
| `06-parallel.svg` | Figure 6 and slide 11 | New pipeline diagram. About 430k dictionary keys and 500 neighbors per item come from the presentation/report. |
| `07-time-split.svg` | Figure 7 and slide 12 | New timeline, with a separate EDA row to distinguish day-15 exploration from day-16 training labels. |
| `08-features.svg` | Figure 8 and slide 13 | Newly drawn four-group feature map. The full 64-feature list is not reconstructed from the schematic. |
| LaTeX in the post | Figure 9, MV Test; all inline equation images | Typeset equations, with symbols defined in the text. No equation screenshots. |
| `09-ensemble.svg` and LaTeX | Figure 10 and slides 15/22 | Newly drawn flow and typeset formulas. The text distinguishes the equal-weight presentation from the released script. |
| `10-results.svg` | Scores explicitly reported in the original blog | Extra summary chart using 0.045, 0.053, 0.0616, 0.0622. These are historical checkpoints, not a controlled ablation. |

`figure-data.json` stores every numeric value used in the charts and labels the EDA values as approximations. Do not reuse them as raw observations. The redraw preserves the qualitative comparisons without claiming exact reconstruction.

## Formula checks

- Recency: the report uses `+1`; `online_recommendation/test.py` uses fractional days and `+2`, applies the weight per event, takes the maximum per user-item pair, then normalizes within each user. Both are explained separately.
- Activity weight: the report has `1 / (1 + log(|I_u|))` and a weighted-user denominator. `3_generate_original_matrix.ipynb` uses `1 / log(1 + c_u)`, where `2_generate_hot_table.ipynb` counts behavior rows as `c_u`. `6_Sta_for_SparseMatrix.ipynb` divides by the source item's behavior-row count. The edition records the difference rather than claiming exact equivalence.
- Candidate aggregation: the released code sorts all history-item-to-candidate paths and deduplicates, retaining the strongest individual path, rather than summing over paths.
- Ensemble: presentation slides use `sqrt(a*b)`. The released online script uses `a**0.48 * b**0.52`. Both use the equal-weight harmonic mean and average the two means.
- Results: the presentation lists QDU second on the second-round leaderboard at 0.06222; the repository and original post identify it as the overall winning solution. The article distinguishes the stages.
- Offline memory: one notebook records a 256 GB machine. The 60 GB limit refers to the online competition container, not all preprocessing.

## Rebuild

Requires Python and Matplotlib. From this directory:

```sh
python draw_figures.py
```

The script does not download data, load the old images, run the competition code, or load trained model files.
