<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Publishing DTD v1.4 20241031//EN" "JATS-journalpublishing1-4.dtd">
<article xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink" article-type="research-article" dtd-version="1.4" xml:lang="en">
  <front>
    <journal-meta>
      <journal-id journal-id-type="publisher-id">Oalib</journal-id>
      <journal-title-group>
        <journal-title>Open Access Library Journal</journal-title>
      </journal-title-group>
      <issn pub-type="epub">2333-9721</issn>
      <issn pub-type="ppub">2333-9705</issn>
      <publisher>
        <publisher-name>Scientific Research Publishing</publisher-name>
      </publisher>
    </journal-meta>
    <article-meta>
      <article-id pub-id-type="doi">10.4236/oalib.1116096</article-id>
      <article-id pub-id-type="publisher-id">Oalib-155252</article-id>
      <article-categories>
        <subj-group>
          <subject>Article</subject>
        </subj-group>
        <subj-group>
          <subject>Biomedical</subject>
          <subject>Life Sciences</subject>
          <subject>Business</subject>
          <subject>Economics</subject>
          <subject>Chemistry</subject>
          <subject>Materials Science</subject>
          <subject>Computer Science</subject>
          <subject>Communications</subject>
          <subject>Earth</subject>
          <subject>Environmental Sciences</subject>
          <subject>Engineering</subject>
          <subject>Medicine</subject>
          <subject>Healthcare</subject>
          <subject>Physics</subject>
          <subject>Mathematics</subject>
          <subject>Social Sciences</subject>
          <subject>Humanities</subject>
        </subj-group>
      </article-categories>
      <title-group>
        <article-title>Selective Updating for Customer Segmentation under Concept Drift</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <name name-style="western">
            <surname>Maaroud</surname>
            <given-names>Maria El</given-names>
          </name>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <name name-style="western">
            <surname>Zhang</surname>
            <given-names>Chi</given-names>
          </name>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
      </contrib-group>
      <aff id="aff1"><label>1</label> School of Computer Science and Artificial Intelligence, Hubei University of Technology, Wuhan, China </aff>
      <author-notes>
        <fn fn-type="conflict" id="fn-conflict">
          <p>The authors declare no conflicts of interest.</p>
        </fn>
      </author-notes>
      <pub-date pub-type="epub">
        <day>02</day>
        <month>11</month>
        <year>2026</year>
      </pub-date>
      <pub-date pub-type="collection">
        <month>11</month>
        <year>2026</year>
      </pub-date>
      <volume>13</volume>
      <issue>11</issue>
      <fpage>1</fpage>
      <lpage>15</lpage>
      <history>
        <date date-type="received">
          <day>29</day>
          <month>09</month>
          <year>2026</year>
        </date>
        <date date-type="accepted">
          <day>08</day>
          <month>11</month>
          <year>2026</year>
        </date>
        <date date-type="published">
          <day>11</day>
          <month>11</month>
          <year>2026</year>
        </date>
      </history>
      <permissions>
        <copyright-statement>© 2026 by the authors and Scientific Research Publishing Inc.</copyright-statement>
        <copyright-year>2026</copyright-year>
        <license license-type="open-access">
          <license-p> This article is an open access article distributed under the terms and conditions of the Creative Commons Attribution (CC BY) license ( <ext-link ext-link-type="uri" xlink:href="https://creativecommons.org/licenses/by/4.0/">https://creativecommons.org/licenses/by/4.0/</ext-link> ). </license-p>
        </license>
      </permissions>
      <self-uri content-type="doi" xlink:href="https://doi.org/10.4236/oalib.1116096">https://doi.org/10.4236/oalib.1116096</self-uri>
      <abstract>
        <p>Scheduled refitting can replace an effective customer segmentation even when a newly fitted model offers little improvement. We examine selective replacement for batchwise customer segmentation under concept drift, comparing BIRCH and MiniBatchKMeans under static, periodic, quality-only, and reward-based policies on Instacart, Ta-Feng, and Olist. The reward policy has the highest reported mean deployed silhouette in all six dataset-algorithm combinations; its advantage over quality-only is 0.0045 - 0.0170 silhouette points. Five supplied paired seed effects per combination are positive for reward versus each baseline, with seed-bootstrap intervals excluding zero. These same-snapshot comparisons do not establish temporally disjoint gains or isolate the reward’s stability term. The raw run record is not yet archived; label-aligned stability and denominator-aware event analyses are not reported.</p>
      </abstract>
      <kwd-group kwd-group-type="author-generated" xml:lang="en">
        <kwd>Customer Segmentation</kwd>
        <kwd>Concept Drift</kwd>
        <kwd>Model Replacement</kwd>
        <kwd>BIRCH</kwd>
        <kwd>MiniBatchKMeans</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec1">
      <title>1. Introduction</title>
      <p>Customer segmentation is a model-management problem as well as a clustering problem. A static model can become stale under distribution change, while unconditional or scheduled replacement can introduce unnecessary churn. Concept-drift research separates recognition of change from the decision to adapt a deployed learner [<xref ref-type="bibr" rid="B1">1</xref>]. This paper studies the second decision: after a candidate segmentation model has been fitted, when should it replace the current model?</p>
      <p>The evaluation uses recency and frequency with a dataset-specific third feature. Ta-Feng and Olist use monetary value, following the RFM interpretation connected to customer-value analysis [<xref ref-type="bibr" rid="B2">2</xref>]. Instacart contains no observed price field: each product row starts with unit quantity and a simulated unit weight of one, stored in the UnitPrice field. Injected drift changes both quantity and this weight. We call the sum of quantity times simulated unit weight drift-weighted item quantity; it equals product-row count only before perturbation and does not measure actual spending. Clustering quality still depends on representation and the structure sought in the data [<xref ref-type="bibr" rid="B3">3</xref>]; improved internal geometry does not by itself demonstrate retention, response, churn reduction, future spend, intervention lift, or revenue impact.</p>
      <p><xref ref-type="fig" rid="fig1">Figure 1</xref> summarizes the evaluation workflow. Candidate fitting and model deployment are separate decisions; the reported scores assess the deployed model on cumulative customer-feature snapshots.</p>
      <fig id="fig1">
        <label>Figure 1</label>
        <caption>
          <p>Evaluation workflow. A fitted candidate replaces the deployed model only when its acceptance rule permits an update.</p>
        </caption>
        <graphic xlink:href="https://html.scirp.org/file/1116096-rId13.jpeg?20261111033215" />
      </fig>
      <p>We compare Balanced Iterative Reducing and Clustering using Hierarchies (BIRCH) [<xref ref-type="bibr" rid="B4">4</xref>] and MiniBatchKMeans (MBK) [<xref ref-type="bibr" rid="B5">5</xref>] under a static policy, blind periodic refitting, two selective candidate-acceptance gates, and an MBK-only incremental comparator. The chronological ordering follows the prequential principle of evaluating the current model before learning from newly available data [<xref ref-type="bibr" rid="B6">6</xref>]. Silhouette measures internal cluster separation [<xref ref-type="bibr" rid="B7">7</xref>], and the adjusted Rand index (ARI) measures partition agreement while remaining invariant to numeric cluster labels [<xref ref-type="bibr" rid="B8">8</xref>].</p>
      <p>This study separates candidate fitting from deployment and compares quality-only and continuity-aware acceptance against static and periodic policies. It reports paired seed-level reward contrasts for all three baselines. Label-aligned accepted-update stability, denominator-aware event accounting, disjoint temporal evaluation, and end-to-end cost measurement remain proposed analyses, not findings of this study. The policy comparisons do not establish superiority over dedicated stream-clustering methods.</p>
    </sec>
    <sec id="sec2">
      <title>2. Related Work</title>
      <p>Dedicated stream-clustering methods maintain evolving summaries or structures. CluStream stores online micro-clusters for subsequent clustering [<xref ref-type="bibr" rid="B9">9</xref>]; DenStream handles density-based evolving streams with noise [<xref ref-type="bibr" rid="B10">10</xref>]; D-Stream uses decayed density grids [<xref ref-type="bibr" rid="B11">11</xref>]; ClusTree supports anytime micro-cluster maintenance [<xref ref-type="bibr" rid="B12">12</xref>]; and StreamKM++ forms compact weighted summaries [<xref ref-type="bibr" rid="B13">13</xref>]. These methods address stream representation and cluster evolution directly. The present study instead augments conventional batchwise clustering with a candidate-deployment decision. Dedicated stream-clustering methods are not included in the empirical comparison and therefore remain important baselines for future work.</p>
      <p>Recent work emphasizes that stream-clustering performance depends jointly on the summary structure, temporal window, outlier treatment, and refinement strategy. A broad empirical study found that no single design choice dominates across workloads [<xref ref-type="bibr" rid="B14">14</xref>], while MOStream dynamically reconfigures these components as stream characteristics change [<xref ref-type="bibr" rid="B15">15</xref>]. These results motivate evaluating deployment gates against modern adaptive stream baselines rather than only against fixed batch policies.</p>
      <p>Change monitoring is also distinct from replacement. Adaptive Windowing (ADWIN) changes its effective window after detected distribution change [<xref ref-type="bibr" rid="B16">16</xref>], while kernel two-sample testing provides another family of distribution comparisons [<xref ref-type="bibr" rid="B17">17</xref>]. The implementation uses Kolmogorov-Smirnov and Wasserstein diagnostics, but its acceptance gates are driven by cluster-quality deterioration and candidate evaluation. A monitor alarm therefore neither guarantees replacement nor demonstrates that replacement is beneficial.</p>
      <p>Partition agreement does not fully establish clustering validity. Hennig [<xref ref-type="bibr" rid="B18">18</xref>] shows that stability and clustering quality are separate concerns. The Massive Online Analysis framework provides a broader basis for reproducible stream evaluation [<xref ref-type="bibr" rid="B19">19</xref>]. This paper uses ARI as one component of a deployment rule, not as proof of semantic or business stability.</p>
    </sec>
    <sec id="sec3">
      <title>3. Datasets and Preprocessing</title>
      <p>The experiment uses the Instacart market-basket release [<xref ref-type="bibr" rid="B20">20</xref>], the Ta-Feng grocery transactions [<xref ref-type="bibr" rid="B21">21</xref>], and the Olist Brazilian e-commerce release [<xref ref-type="bibr" rid="B22">22</xref>]. The reported Instacart and Ta-Feng experiments use 500,000 transaction lines each. The standard Olist order-items release has 112,650 source rows, of which 110,197 remain after the documented delivered-order and validity filters; a 500,000-row input cap does not increase the number of available order items. Transaction-line, customer, order, and RFM-record counts are distinct units. <bold>Table 1</bold> reports the transaction-line counts.</p>
      <p><bold>Table 1.</bold>Transaction-line records used in each experiment.</p>
      <table-wrap id="tbl1">
        <label>Table 1</label>
        <table>
          <tbody>
            <tr>
              <td>
                <bold>Dataset</bold>
              </td>
              <td>
                <bold>Transaction rows</bold>
              </td>
            </tr>
            <tr>
              <td>Instacart</td>
              <td>500,000</td>
            </tr>
            <tr>
              <td>Ta-Feng</td>
              <td>500,000</td>
            </tr>
            <tr>
              <td>Olist</td>
              <td>110,197</td>
            </tr>
          </tbody>
        </table>
      </table-wrap>
      <p>The described Olist conversion joins the order-items file to the orders and customers files from the standard release, retains delivered orders, and removes records with missing required identifiers, timestamps, or prices and records with nonpositive product prices. It does not intentionally resample or duplicate order-item rows and uses no additional transaction source. The stated 112,650 raw and 110,197 retained row counts refer to this conversion, not to 500,000 distinct Olist items. The input file hashes and full source-data manifest for the reported run are not archived, so the run’s source files and filtering outcomes cannot yet be independently traced. The dataset URLs in the references identify public releases, not immutable versions of the files used in that run.</p>
      <sec id="sec3dot1">
        <title>Source-to-Feature Mapping</title>
        <p><bold>Table 2</bold> describes the transformation from each source dataset to the common transaction schema. The reconstructed fields are material to interpretation: Instacart has synthetic chronology and no monetary information; Ta-Feng reconstructs baskets at customer-day resolution; and Olist includes freight in item value.</p>
        <p>For Instacart, orders are sorted within each user_id by order_number. Missing days_since_prior_order values are set to zero, and the customer-relative intervals are cumulatively summed. Each order receives the synthetic timestamp 1 January 2017 plus that cumulative number of days plus its order_hour_of_day (missing hours are set to zero). The same arbitrary 2017 origin is used for every customer; it is not an observed calendar date or a known alignment of different customers’ purchasing histories. Joined product rows are then ordered by this synthetic timestamp, order ID, and add-to-cart position before the chronological initial/stream split. Consequently, recency and batch membership reflect the shared synthetic timeline rather than an observed cross-customer chronology.</p>
        <p>For customer <italic>i</italic> at batch <italic>t</italic>, the cumulative representation is</p>
        <p><bold>Table 2.</bold> Dataset-specific conversion into the common transaction schema.</p>
        <table-wrap id="tbl2">
          <label>Table 2</label>
          <table>
            <tbody>
              <tr>
                <td>
                  <bold>Source</bold>
                </td>
                <td>
                  <bold>Invoice/basket</bold>
                  <bold>ID</bold>
                </td>
                <td>
                  <bold>Customer ID</bold>
                </td>
                <td>
                  <bold>Timestamp</bold>
                </td>
                <td>
                  <bold>Quantity and value</bold>
                </td>
                <td>
                  <bold>Limit</bold>
                  <bold>ation</bold>
                </td>
              </tr>
              <tr>
                <td>Instacart</td>
                <td>order_id → InvoiceNo</td>
                <td>user_id → CustomerID</td>
                <td>Synthetic reconstructed date → InvoiceDate</td>
                <td>Initially Quantity = 1 and simulated UnitPrice = 1 per product row; both change under injected drift</td>
                <td>Chronology is synthetic; drift-weighted item quantity is neither observed spend nor unchanged product-row count.</td>
              </tr>
              <tr>
                <td>Ta–Feng</td>
                <td>Customer ID plus transaction date → reconstructed basket ID</td>
                <td>CUSTOMER_ID → CustomerID</td>
                <td>TRANSACTION_DT → InvoiceDate</td>
                <td>AMOUNT → Quantity; SALES_PRICE/AMOUNT → UnitPrice</td>
                <td>Purchases by one customer on the same date form one basket, which can merge multiple same-day visits.</td>
              </tr>
              <tr>
                <td>Olist</td>
                <td>order_id → InvoiceNo</td>
                <td>customer_unique_id → CustomerID</td>
                <td>order_purchase_timestamp → InvoiceDate</td>
                <td>Quantity = 1 per item; product price plus freight → UnitPrice</td>
                <td>Only delivered orders are retained; freight is included in the monetary feature.</td>
              </tr>
            </tbody>
          </table>
        </table-wrap>
        <disp-formula id="FD1">
          <label>(1)</label>
          <mml:math display="inline">
            <mml:mrow>
              <mml:msub>
                <mml:mi>x</mml:mi>
                <mml:mrow>
                  <mml:mi>i</mml:mi>
                  <mml:mo>,</mml:mo>
                  <mml:mi>t</mml:mi>
                </mml:mrow>
              </mml:msub>
              <mml:mo>=</mml:mo>
              <mml:msup>
                <mml:mrow>
                  <mml:mrow>
                    <mml:mo>[</mml:mo>
                    <mml:mrow>
                      <mml:mi>log</mml:mi>
                      <mml:mrow>
                        <mml:mo>(</mml:mo>
                        <mml:mrow>
                          <mml:mn>1</mml:mn>
                          <mml:mo>+</mml:mo>
                          <mml:msub>
                            <mml:mi>R</mml:mi>
                            <mml:mrow>
                              <mml:mi>i</mml:mi>
                              <mml:mo>,</mml:mo>
                              <mml:mi>t</mml:mi>
                            </mml:mrow>
                          </mml:msub>
                        </mml:mrow>
                        <mml:mo>)</mml:mo>
                      </mml:mrow>
                      <mml:mo>,</mml:mo>
                      <mml:mi>log</mml:mi>
                      <mml:mrow>
                        <mml:mo>(</mml:mo>
                        <mml:mrow>
                          <mml:mn>1</mml:mn>
                          <mml:mo>+</mml:mo>
                          <mml:msub>
                            <mml:mi>F</mml:mi>
                            <mml:mrow>
                              <mml:mi>i</mml:mi>
                              <mml:mo>,</mml:mo>
                              <mml:mi>t</mml:mi>
                            </mml:mrow>
                          </mml:msub>
                        </mml:mrow>
                        <mml:mo>)</mml:mo>
                      </mml:mrow>
                      <mml:mo>,</mml:mo>
                      <mml:mi>log</mml:mi>
                      <mml:mrow>
                        <mml:mo>(</mml:mo>
                        <mml:mrow>
                          <mml:mn>1</mml:mn>
                          <mml:mo>+</mml:mo>
                          <mml:msub>
                            <mml:mi>V</mml:mi>
                            <mml:mrow>
                              <mml:mi>i</mml:mi>
                              <mml:mo>,</mml:mo>
                              <mml:mi>t</mml:mi>
                            </mml:mrow>
                          </mml:msub>
                        </mml:mrow>
                        <mml:mo>)</mml:mo>
                      </mml:mrow>
                    </mml:mrow>
                    <mml:mo>]</mml:mo>
                  </mml:mrow>
                </mml:mrow>
                <mml:mtext>T</mml:mtext>
              </mml:msup>
            </mml:mrow>
          </mml:math>
        </disp-formula>
        <p>where recency <italic>R</italic><italic><sub>i</sub></italic><sub>,</sub><italic><sub>t</sub></italic> is time since the latest purchase, frequency <italic>F</italic><italic><sub>i</sub></italic><sub>,</sub><italic><sub>t</sub></italic> counts unique orders or reconstructed baskets, and <italic>V</italic><italic><sub>i</sub></italic><sub>,</sub><italic><sub>t</sub></italic> is the cumulative third feature. For Ta-Feng and Olist, <italic>V</italic><italic><sub>i</sub></italic><sub>,</sub><italic><sub>t</sub></italic> is monetary value. For Instacart, <italic>V</italic><italic><sub>i</sub></italic><sub>,</sub><italic><sub>t</sub></italic> = Σ(<italic>Q</italic><italic><sub>ℓ</sub></italic><italic>P</italic><italic><sub>ℓ</sub></italic>) over rows <italic>ℓ</italic><inline-formula><mml:math display="inline"><mml:mo> ∈ </mml:mo></mml:math></inline-formula><italic>H</italic><italic><sub>i</sub></italic><sub>,</sub><italic><sub>t</sub></italic> is drift-weighted item quantity: <italic>Q</italic><italic><sub>ℓ</sub></italic> is row quantity and <italic>P</italic><italic><sub>ℓ</sub></italic> is a simulated unit weight stored as UnitPrice. Both equal one initially and are perturbed on drifted rows. This sum equals product-row count before perturbation, but is neither row count nor observed spending afterward. The analysis fits a standard scaler on the initial 40% and holds it fixed across the eight subsequent cumulative snapshots. Section 4.4 defines the corresponding window-local representation for temporal evaluation. Here <italic>H</italic><italic><sub>i</sub></italic><sub>,</sub><italic><sub>t</sub></italic> is the set of product rows for customer i included up to batch <italic>t</italic>.</p>
      </sec>
    </sec>
    <sec id="sec4">
      <title>4. Methodology</title>
      <sec id="sec4dot1">
        <title>4.1. Initial Model Selection</title>
        <p>The described initial-model selection considers <italic>k</italic><inline-formula><mml:math display="inline"><mml:mo> ∈ </mml:mo></mml:math></inline-formula> {2, 3, 4, 5, 6} on the first 40% cumulative customer-feature snapshot. The selected per-seed values, BIRCH threshold grid, tie-breaking rule, and original validation record are not available with the reported results; their precise selection cannot be verified here. A disjoint temporal evaluation would select and freeze hyperparameters using chronological validation entirely within the initial training period. The present results do not test cluster splits, merges, or changing cluster counts.</p>
        <p>The implementation uses scikit-learn components [<xref ref-type="bibr" rid="B23">23</xref>]. Incremental evaluation is included only for MBK. Although the scikit-learn BIRCH interface also exposes partial_fit [<xref ref-type="bibr" rid="B24">24</xref>], a matched streaming-BIRCH comparison is outside the scope of the present experiments.</p>
      </sec>
      <sec id="sec4dot2">
        <title>4.2. Synthetic Drift Protocol</title>
        <p>Let <inline-formula><mml:math display="inline"><mml:mrow><mml:msub><mml:mi> z </mml:mi><mml:mi> t </mml:mi></mml:msub><mml:mo> ∈ </mml:mo><mml:mrow><mml:mo> [ </mml:mo><mml:mrow><mml:mn> 0 </mml:mn><mml:mo> , </mml:mo><mml:mn> 1 </mml:mn></mml:mrow><mml:mo> ] </mml:mo></mml:mrow></mml:mrow></mml:math></inline-formula> be the drift intensity for batch <italic>t</italic>. Natural drift uses <inline-formula><mml:math display="inline"><mml:mrow><mml:msub><mml:mi> z </mml:mi><mml:mi> t </mml:mi></mml:msub><mml:mo> = </mml:mo><mml:mn> 0 </mml:mn></mml:mrow></mml:math></inline-formula> throughout. Abrupt drift uses full intensity from batch 3 onward. Gradual drift uses zero intensity before batch 3 and</p>
        <disp-formula id="FD2">
          <label>(2)</label>
          <mml:math display="inline">
            <mml:mrow>
              <mml:msub>
                <mml:mi>z</mml:mi>
                <mml:mi>t</mml:mi>
              </mml:msub>
              <mml:mo>=</mml:mo>
              <mml:mi>min</mml:mi>
              <mml:mrow>
                <mml:mo>(</mml:mo>
                <mml:mrow>
                  <mml:mn>1</mml:mn>
                  <mml:mo>,</mml:mo>
                  <mml:mrow>
                    <mml:mrow>
                      <mml:mrow>
                        <mml:mo>(</mml:mo>
                        <mml:mrow>
                          <mml:mi>t</mml:mi>
                          <mml:mo>−</mml:mo>
                          <mml:mn>2</mml:mn>
                        </mml:mrow>
                        <mml:mo>)</mml:mo>
                      </mml:mrow>
                    </mml:mrow>
                    <mml:mo>/</mml:mo>
                    <mml:mn>4</mml:mn>
                  </mml:mrow>
                </mml:mrow>
                <mml:mo>)</mml:mo>
              </mml:mrow>
            </mml:mrow>
          </mml:math>
        </disp-formula>
        <p>thereafter, giving 0.25, 0.50, 0.75, and 1.00 at batches 3 - 6. Recurring drift has full intensity at batches 3, 4, 6, and 7, with onsets at batches 3 and 6. Local drift has full intensity from batch 3 onward but affects only a stable hash-selected 20% of customer identifiers.</p>
        <p>For medium severity, quantity <italic>Q</italic> and unit price <italic>P</italic> are transformed as</p>
        <disp-formula id="FD3">
          <label>(3)</label>
          <mml:math display="inline">
            <mml:mrow>
              <mml:mover accent="true">
                <mml:mi>Q</mml:mi>
                <mml:mo>˜</mml:mo>
              </mml:mover>
              <mml:mo>=</mml:mo>
              <mml:mi>max</mml:mi>
              <mml:mrow>
                <mml:mo>(</mml:mo>
                <mml:mrow>
                  <mml:mn>1</mml:mn>
                  <mml:mo>,</mml:mo>
                  <mml:mi>Q</mml:mi>
                  <mml:mrow>
                    <mml:mo>[</mml:mo>
                    <mml:mrow>
                      <mml:mn>1</mml:mn>
                      <mml:mo>−</mml:mo>
                      <mml:msub>
                        <mml:mi>z</mml:mi>
                        <mml:mi>t</mml:mi>
                      </mml:msub>
                      <mml:mrow>
                        <mml:mo>(</mml:mo>
                        <mml:mrow>
                          <mml:mn>1</mml:mn>
                          <mml:mo>−</mml:mo>
                          <mml:mn>0.70</mml:mn>
                        </mml:mrow>
                        <mml:mo>)</mml:mo>
                      </mml:mrow>
                    </mml:mrow>
                    <mml:mo>]</mml:mo>
                  </mml:mrow>
                  <mml:mo>+</mml:mo>
                  <mml:msub>
                    <mml:mi>ε</mml:mi>
                    <mml:mi>Q</mml:mi>
                  </mml:msub>
                </mml:mrow>
                <mml:mo>)</mml:mo>
              </mml:mrow>
            </mml:mrow>
          </mml:math>
        </disp-formula>
        <disp-formula id="FD4">
          <label>(4)</label>
          <mml:math display="inline">
            <mml:mrow>
              <mml:mover accent="true">
                <mml:mi>P</mml:mi>
                <mml:mo>˜</mml:mo>
              </mml:mover>
              <mml:mo>=</mml:mo>
              <mml:mi>max</mml:mi>
              <mml:mrow>
                <mml:mo>(</mml:mo>
                <mml:mrow>
                  <mml:mn>0.01</mml:mn>
                  <mml:mo>,</mml:mo>
                  <mml:mi>P</mml:mi>
                  <mml:mrow>
                    <mml:mo>[</mml:mo>
                    <mml:mrow>
                      <mml:mn>1</mml:mn>
                      <mml:mo>−</mml:mo>
                      <mml:msub>
                        <mml:mi>z</mml:mi>
                        <mml:mi>t</mml:mi>
                      </mml:msub>
                      <mml:mrow>
                        <mml:mo>(</mml:mo>
                        <mml:mrow>
                          <mml:mn>1</mml:mn>
                          <mml:mo>−</mml:mo>
                          <mml:mn>0.75</mml:mn>
                        </mml:mrow>
                        <mml:mo>)</mml:mo>
                      </mml:mrow>
                    </mml:mrow>
                    <mml:mo>]</mml:mo>
                  </mml:mrow>
                  <mml:mo>+</mml:mo>
                  <mml:msub>
                    <mml:mi>ε</mml:mi>
                    <mml:mi>P</mml:mi>
                  </mml:msub>
                </mml:mrow>
                <mml:mo>)</mml:mo>
              </mml:mrow>
            </mml:mrow>
          </mml:math>
        </disp-formula>
        <p>Here the simulated noise terms <italic>ε</italic><italic><sub>Q</sub></italic> and <italic>ε</italic><italic><sub>P</sub></italic> have normal distributions with standard deviations 0.60<italic>z</italic><italic><sub>t</sub></italic> and 0.20<italic>z</italic><italic><sub>t</sub></italic>, respectively. Total price is recomputed as <italic>QP</italic>. The batch-specific generator seed is</p>
        <p>10,000 + model_seed + 100<italic>t</italic> (5)</p>
        <p>No rounding is applied after adding Gaussian noise, so <italic>Q</italic> is a continuous simulated feature, not a literal purchased-unit count. Instacart starts with the placeholder <italic>P</italic> = 1; the reported drift scenarios perturb both <italic>Q</italic> and <italic>P</italic>, recompute <italic>QP</italic>, and thereby change the evaluated third feature even though the number of product rows is unchanged. Changes to <italic>P</italic> are synthetic feature perturbations, not economic price drift. No quantity-only Instacart condition is reported.</p>
        <p><bold>Table 3</bold> makes the five scenario schedules explicit. In particular, it distinguishes permanent abrupt and local changes from the temporary recurring pattern and the monotone gradual ramp used to evaluate replacement decisions.</p>
        <p><bold>Table 3.</bold>Synthetic-drift intensity by stream batch. Local uses the abrupt intensity schedule on 20% of customers.</p>
        <table-wrap id="tbl3">
          <label>Table 3</label>
          <table>
            <tbody>
              <tr>
                <td>
                  <bold>Scenario</bold>
                </td>
                <td>
                  <bold>1</bold>
                </td>
                <td>
                  <bold>2</bold>
                </td>
                <td>
                  <bold>3</bold>
                </td>
                <td>
                  <bold>4</bold>
                </td>
                <td>
                  <bold>5</bold>
                </td>
                <td>
                  <bold>6</bold>
                </td>
                <td>
                  <bold>7</bold>
                </td>
                <td>
                  <bold>8</bold>
                </td>
              </tr>
              <tr>
                <td>Natural</td>
                <td>0</td>
                <td>0</td>
                <td>0</td>
                <td>0</td>
                <td>0</td>
                <td>0</td>
                <td>0</td>
                <td>0</td>
              </tr>
              <tr>
                <td>Abrupt</td>
                <td>0</td>
                <td>0</td>
                <td>1</td>
                <td>1</td>
                <td>1</td>
                <td>1</td>
                <td>1</td>
                <td>1</td>
              </tr>
              <tr>
                <td>Gradual</td>
                <td>0</td>
                <td>0</td>
                <td>0.25</td>
                <td>0.50</td>
                <td>0.75</td>
                <td>1</td>
                <td>1</td>
                <td>1</td>
              </tr>
              <tr>
                <td>Recurring</td>
                <td>0</td>
                <td>0</td>
                <td>1</td>
                <td>1</td>
                <td>0</td>
                <td>1</td>
                <td>1</td>
                <td>0</td>
              </tr>
              <tr>
                <td>Local</td>
                <td>0</td>
                <td>0</td>
                <td>1</td>
                <td>1</td>
                <td>1</td>
                <td>1</td>
                <td>1</td>
                <td>1</td>
              </tr>
            </tbody>
          </table>
        </table-wrap>
      </sec>
      <sec id="sec4dot3">
        <title>4.3. Same-Snapshot Acceptance Rules</title>
        <p>Let <inline-formula><mml:math display="inline"><mml:mrow><mml:msub><mml:mi> D </mml:mi><mml:mi> t </mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> denote the cumulative standardized customer-feature snapshot (monetary RFM for Ta-Feng and Olist; drift-weighted item quantity for Instacart) at batch <italic>t</italic>. The current pre-update silhouette is</p>
        <disp-formula id="FD6">
          <label>(6)</label>
          <mml:math display="inline">
            <mml:mrow>
              <mml:msub>
                <mml:mover accent="true">
                  <mml:mi>p</mml:mi>
                  <mml:mo>¯</mml:mo>
                </mml:mover>
                <mml:mi>t</mml:mi>
              </mml:msub>
              <mml:mo>=</mml:mo>
              <mml:mi>S</mml:mi>
              <mml:mrow>
                <mml:mo>(</mml:mo>
                <mml:mrow>
                  <mml:msub>
                    <mml:mi>M</mml:mi>
                    <mml:mrow>
                      <mml:mi>t</mml:mi>
                      <mml:mo>−</mml:mo>
                      <mml:mn>1</mml:mn>
                    </mml:mrow>
                  </mml:msub>
                  <mml:mo>,</mml:mo>
                  <mml:msub>
                    <mml:mi>D</mml:mi>
                    <mml:mi>t</mml:mi>
                  </mml:msub>
                </mml:mrow>
                <mml:mo>)</mml:mo>
              </mml:mrow>
            </mml:mrow>
          </mml:math>
        </disp-formula>
        <p>The notation <inline-formula><mml:math display="inline"><mml:mrow><mml:msub><mml:mi> p </mml:mi><mml:mrow><mml:mi> t </mml:mi><mml:mo> − </mml:mo><mml:mn> 1 </mml:mn></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula> denotes the post-decision deployed silhouette recorded at the previous batch. The deterioration gate compares that previous deployed score with the current pre-update score:</p>
        <disp-formula id="FD7">
          <label>(7)</label>
          <mml:math display="inline">
            <mml:mrow>
              <mml:msub>
                <mml:mi>g</mml:mi>
                <mml:mi>t</mml:mi>
              </mml:msub>
              <mml:mo>=</mml:mo>
              <mml:mn>1</mml:mn>
              <mml:mrow>
                <mml:mo>[</mml:mo>
                <mml:mrow>
                  <mml:msubsup>
                    <mml:mi>p</mml:mi>
                    <mml:mi>t</mml:mi>
                    <mml:mo>−</mml:mo>
                  </mml:msubsup>
                  <mml:mo>&lt;</mml:mo>
                  <mml:mn>0.995</mml:mn>
                  <mml:msub>
                    <mml:mi>p</mml:mi>
                    <mml:mn>0</mml:mn>
                  </mml:msub>
                  <mml:mtext>
                     
                  </mml:mtext>
                  <mml:mtext>or</mml:mtext>
                  <mml:mtext>
                     
                  </mml:mtext>
                  <mml:msub>
                    <mml:mi>p</mml:mi>
                    <mml:mrow>
                      <mml:mi>t</mml:mi>
                      <mml:mo>−</mml:mo>
                      <mml:mn>1</mml:mn>
                    </mml:mrow>
                  </mml:msub>
                  <mml:mo>−</mml:mo>
                  <mml:msubsup>
                    <mml:mi>p</mml:mi>
                    <mml:mi>t</mml:mi>
                    <mml:mo>−</mml:mo>
                  </mml:msubsup>
                  <mml:mo>&gt;</mml:mo>
                  <mml:mn>0.003</mml:mn>
                </mml:mrow>
                <mml:mo>]</mml:mo>
              </mml:mrow>
            </mml:mrow>
          </mml:math>
        </disp-formula>
        <p>When <inline-formula><mml:math display="inline"><mml:mrow><mml:msub><mml:mi> g </mml:mi><mml:mi> t </mml:mi></mml:msub><mml:mo> = </mml:mo><mml:mn> 1 </mml:mn></mml:mrow></mml:math></inline-formula> , a candidate <inline-formula><mml:math display="inline"><mml:mrow><mml:msubsup><mml:mi> M </mml:mi><mml:mi> t </mml:mi><mml:mi> c </mml:mi></mml:msubsup></mml:mrow></mml:math></inline-formula> is fitted on <inline-formula><mml:math display="inline"><mml:mrow><mml:msub><mml:mi> D </mml:mi><mml:mi> t </mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> . Its same-snapshot silhouette is <inline-formula><mml:math display="inline"><mml:mrow><mml:msubsup><mml:mi> p </mml:mi><mml:mi> t </mml:mi><mml:mi> c </mml:mi></mml:msubsup><mml:mo> = </mml:mo><mml:mi> S </mml:mi><mml:mrow><mml:mo> ( </mml:mo><mml:mrow><mml:msubsup><mml:mi> M </mml:mi><mml:mi> t </mml:mi><mml:mi> c </mml:mi></mml:msubsup><mml:mo> , </mml:mo><mml:msub><mml:mi> D </mml:mi><mml:mi> t </mml:mi></mml:msub></mml:mrow><mml:mo> ) </mml:mo></mml:mrow></mml:mrow></mml:math></inline-formula> , and <inline-formula><mml:math display="inline"><mml:mrow><mml:msub><mml:mi> a </mml:mi><mml:mi> t </mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> is the ARI between current and candidate assignments. Quality-only acceptance requires <inline-formula><mml:math display="inline"><mml:mrow><mml:msubsup><mml:mi> p </mml:mi><mml:mi> t </mml:mi><mml:mi> c </mml:mi></mml:msubsup><mml:mo> &gt; </mml:mo><mml:msubsup><mml:mi> p </mml:mi><mml:mi> t </mml:mi><mml:mo> − </mml:mo></mml:msubsup></mml:mrow></mml:math></inline-formula> . Reward acceptance uses</p>
        <disp-formula id="FD8">
          <label>(8)</label>
          <mml:math display="inline">
            <mml:mrow>
              <mml:msub>
                <mml:mi>R</mml:mi>
                <mml:mrow>
                  <mml:mtext>keep</mml:mtext>
                </mml:mrow>
              </mml:msub>
              <mml:mo>=</mml:mo>
              <mml:mn>0.85</mml:mn>
              <mml:msubsup>
                <mml:mi>p</mml:mi>
                <mml:mi>t</mml:mi>
                <mml:mo>−</mml:mo>
              </mml:msubsup>
              <mml:mo>+</mml:mo>
              <mml:mn>0.10</mml:mn>
            </mml:mrow>
          </mml:math>
        </disp-formula>
        <p><inline-formula><mml:math display="inline"><mml:mrow><mml:msub><mml:mi> R </mml:mi><mml:mrow><mml:mtext> update </mml:mtext></mml:mrow></mml:msub><mml:mo> = </mml:mo><mml:mn> 0.85 </mml:mn><mml:msubsup><mml:mi> p </mml:mi><mml:mi> t </mml:mi><mml:mi> c </mml:mi></mml:msubsup><mml:mo> + </mml:mo><mml:mn> 0.10 </mml:mn><mml:msub><mml:mi> a </mml:mi><mml:mi> t </mml:mi></mml:msub><mml:mo> − </mml:mo><mml:mn> 0.05 </mml:mn><mml:mi> ρ </mml:mi></mml:mrow></mml:math></inline-formula> , <inline-formula><mml:math display="inline"><mml:mrow><mml:mi> ρ </mml:mi><mml:mo> = </mml:mo><mml:mn> 0.005 </mml:mn></mml:mrow></mml:math></inline-formula> . <xref>(9)</xref></p>
        <p>The term <italic>ρ</italic> is a normalized switching regularizer, not a measured business or infrastructure cost. Its fixed reward contribution is 0.05 × 0.005 = 0.00025, equivalent to approximately 0.000294 silhouette units after division by 0.85. A sensitivity analysis would vary the stability weight and regularizer, report the fraction of decisions changed, and select settings on training or validation scenarios rather than final test scenarios; no such analysis is reported here.</p>
        <p>The static policy never replaces the initial model. The periodic policy is scheduled every four batches, but the implementation permits an update only when a following batch exists. Consequently, in the eight-batch protocol, batch 4 is the only eligible scheduled refit and batch 8 is evaluation-only. The two selective policies apply the quality-only and reward rules above subject to the same final-batch restriction. The MBK incremental comparator calls partial_fit each batch without the same deployment gate.</p>
      </sec>
      <sec id="sec4dot4">
        <title>4.4. Proposed Temporal Evaluation</title>
        <p>The reported same-snapshot evaluation fits a candidate on cumulative snapshot <italic>D</italic><italic><sub>t</sub></italic>, evaluates it on <italic>D</italic><italic><sub>t</sub></italic>, and uses that score in the acceptance decision. A post-decision silhouette on <italic>D</italic><italic><sub>t</sub></italic> is therefore a selection score rather than an unbiased estimate of temporal generalization. A cumulative next-batch comparison on <italic>D</italic><italic><sub>t</sub></italic><sub>+1</sub> likewise retains substantial overlap with candidate-training history. The following disjoint-window procedure has not been evaluated for the reported policy scores.</p>
        <p>The proposed procedure would use a one-window decision delay and a window-local outcome. Let <italic>W</italic><italic><sub>t</sub></italic> contain only transactions arriving in chronological window <italic>t</italic>, and let <italic>X</italic><italic><sub>t</sub></italic> be its standardized customer-feature set. For each customer active in <italic>W</italic><italic><sub>t</sub></italic>, recency would run from that customer’s latest transaction to the end of <italic>W</italic><italic><sub>t</sub></italic>, while frequency and value would use only baskets and transactions inside <italic>W</italic><italic><sub>t</sub></italic>. Thus, Equation (1) would be applied within each window rather than over cumulative history. Customers without transactions in <italic>W</italic><italic><sub>t</sub></italic> would have no window-local vector; their number and the silhouette denominator would be reported. A reference scaler would be fitted once on window-local vectors from the initial training period and shared by active and candidate models.</p>
        <p>The initial period would be divided into windows of the same duration, and candidates would be fitted on historical customer-window vectors <italic>X</italic><sub>1:</sub><italic><sub>t</sub></italic>. Repeated observations of one customer in different windows would be separate training instances. The gate would compare active and candidate models on <italic>X</italic><italic><sub>t</sub></italic><sub>+1</sub>, and an accepted candidate would become active for <italic>W</italic><italic><sub>t</sub></italic><sub>+2</sub>. A customer would be “returning” if its identifier occurred before <italic>W</italic><italic><sub>t</sub></italic><sub>+1</sub> and “new” otherwise; a new customer’s vector would use only <italic>W</italic><italic><sub>t</sub></italic><sub>+1</sub>. The proposed outcome would be measured on X<italic><sub>t</sub></italic><sub>+</sub><sub>2</sub>, not the gate window <italic>W</italic><italic><sub>t</sub></italic><sub>+1</sub>. With <italic>T</italic> stream windows, only origins <italic>t</italic> ≤ <italic>T</italic> − 2 would yield a fully evaluated candidate.</p>
        <p><bold>Table 4</bold> distinguishes the proposed fitting, gating, and outcome windows. Unlike the cumulative comparisons in the reported results, the outcome window would not be used to select its deployment state.</p>
        <p><bold>Table 4.</bold> Proposed information flow for one rolling origin; no disjoint-window outcomes are reported.</p>
        <table-wrap id="tbl4">
          <label>Table 4</label>
          <table>
            <tbody>
              <tr>
                <td>
                  <bold>Stage</bold>
                </td>
                <td>
                  <bold>Available data</bold>
                </td>
                <td>
                  <bold>Operation</bold>
                </td>
              </tr>
              <tr>
                <td>
                  Fit at
                  <italic>t</italic>
                </td>
                <td>
                  Initial period,
                  <italic>W</italic>
                  <sub>1:</sub>
                  <italic>
                    <sub>t</sub>
                  </italic>
                </td>
                <td>Fit candidate</td>
              </tr>
              <tr>
                <td>
                  Gate at
                  <italic>t</italic>
                  + 1
                </td>
                <td>
                  New
                  <italic>W</italic>
                  <italic>
                    <sub>t</sub>
                  </italic>
                  <sub>+1</sub>
                  only
                </td>
                <td>Keep or accept</td>
              </tr>
              <tr>
                <td>
                  Outcome at
                  <italic>t</italic>
                  + 2
                </td>
                <td>
                  New
                  <italic>W</italic>
                  <italic>
                    <sub>t</sub>
                  </italic>
                  <sub>+</sub>
                  <sub>2</sub>
                  only
                </td>
                <td>Score deployed policy</td>
              </tr>
            </tbody>
          </table>
        </table-wrap>
        <p>A secondary as-of cumulative analysis could rebuild returning-customer features using history available at each cutoff; it would measure history-overlapping persistence rather than disjoint generalization. A future report should distinguish window-local, new-customer, returning-customer, and cumulative gains.</p>
        <p>For this proposed analysis, silhouette would be defined only when evaluated assignments contain at least two nonempty clusters and fewer clusters than observations. A candidate with an undefined silhouette would be rejected. If the active score were undefined but the candidate score valid, either selective gate would accept the candidate; if both were undefined, the model would be retained and the decision recorded as lacking a valid quality comparison rather than assigned an artificial score. Numerical gate or reward comparisons would apply only when both scores are valid. A future run record should specify the distance metric, silhouette subsample size and seed, and whether active and candidate scores use the same sampled customers.</p>
      </sec>
      <sec id="sec4dot5">
        <title>4.5. Proposed Aligned Stability and Event Denominators</title>
        <p>Because cluster identifiers are arbitrary, a future migration analysis would align labels before comparing assignments. For old labels <italic>y</italic> and candidate labels <italic>z</italic>, a contingency matrix and the Hungarian algorithm would find the relabeling <italic>π</italic> with maximum overlap. The proposed minimum error distance is</p>
        <disp-formula id="FD10">
          <label>(10)</label>
          <mml:math display="inline">
            <mml:mrow>
              <mml:mtext>MED</mml:mtext>
              <mml:mrow>
                <mml:mo>(</mml:mo>
                <mml:mrow>
                  <mml:mi>y</mml:mi>
                  <mml:mo>,</mml:mo>
                  <mml:mi>z</mml:mi>
                </mml:mrow>
                <mml:mo>)</mml:mo>
              </mml:mrow>
              <mml:mo>=</mml:mo>
              <mml:msub>
                <mml:mrow>
                  <mml:mi>min</mml:mi>
                </mml:mrow>
                <mml:mi>π</mml:mi>
              </mml:msub>
              <mml:mrow>
                <mml:mo>(</mml:mo>
                <mml:mrow>
                  <mml:mrow>
                    <mml:mn>1</mml:mn>
                    <mml:mo>/</mml:mo>
                    <mml:mi>n</mml:mi>
                  </mml:mrow>
                </mml:mrow>
                <mml:mo>)</mml:mo>
              </mml:mrow>
              <mml:mstyle displaystyle="true">
                <mml:msubsup>
                  <mml:mo>∑</mml:mo>
                  <mml:mrow>
                    <mml:mi>i</mml:mi>
                    <mml:mo>=</mml:mo>
                    <mml:mn>1</mml:mn>
                  </mml:mrow>
                  <mml:mi>n</mml:mi>
                </mml:msubsup>
                <mml:mrow>
                  <mml:mn>1</mml:mn>
                  <mml:mrow>
                    <mml:mo>[</mml:mo>
                    <mml:mrow>
                      <mml:msub>
                        <mml:mi>y</mml:mi>
                        <mml:mi>i</mml:mi>
                      </mml:msub>
                      <mml:mo>≠</mml:mo>
                      <mml:mi>π</mml:mi>
                      <mml:mrow>
                        <mml:mo>(</mml:mo>
                        <mml:mrow>
                          <mml:msub>
                            <mml:mi>z</mml:mi>
                            <mml:mi>i</mml:mi>
                          </mml:msub>
                        </mml:mrow>
                        <mml:mo>)</mml:mo>
                      </mml:mrow>
                    </mml:mrow>
                    <mml:mo>]</mml:mo>
                  </mml:mrow>
                </mml:mrow>
              </mml:mstyle>
            </mml:mrow>
          </mml:math>
        </disp-formula>
        <p>When cluster counts differ, the contingency matrix would be padded to <italic>K</italic> = max(<italic>k</italic><italic><sub>γ</sub></italic>, <italic>k</italic><italic><sub>z</sub></italic>) rows and columns. The proposed normalization is</p>
        <p><inline-formula><mml:math display="inline"><mml:mrow><mml:mtext> NMED </mml:mtext><mml:mrow><mml:mo> ( </mml:mo><mml:mrow><mml:mi> y </mml:mi><mml:mo> , </mml:mo><mml:mi> z </mml:mi></mml:mrow><mml:mo> ) </mml:mo></mml:mrow><mml:mo> = </mml:mo><mml:mrow><mml:mrow><mml:mtext> MED </mml:mtext><mml:mrow><mml:mo> ( </mml:mo><mml:mrow><mml:mi> y </mml:mi><mml:mo> , </mml:mo><mml:mi> z </mml:mi></mml:mrow><mml:mo> ) </mml:mo></mml:mrow></mml:mrow><mml:mo> / </mml:mo><mml:mrow><mml:mrow><mml:mo> ( </mml:mo><mml:mrow><mml:mn> 1 </mml:mn><mml:mo> − </mml:mo><mml:mrow><mml:mn> 1 </mml:mn><mml:mo> / </mml:mo><mml:mi> K </mml:mi></mml:mrow></mml:mrow><mml:mo> ) </mml:mo></mml:mrow></mml:mrow></mml:mrow></mml:mrow></mml:math></inline-formula> if <inline-formula><mml:math display="inline"><mml:mrow><mml:mi> K </mml:mi><mml:mo> &gt; </mml:mo><mml:mn> 1 </mml:mn></mml:mrow></mml:math></inline-formula> ; 0 if <inline-formula><mml:math display="inline"><mml:mrow><mml:mi> K </mml:mi><mml:mo> = </mml:mo><mml:mn> 1 </mml:mn></mml:mrow></mml:math></inline-formula> . <xref>(11)</xref></p>
        <p>This scales the <inline-formula><mml:math display="inline"><mml:mrow><mml:mn> 1 </mml:mn><mml:mo> − </mml:mo><mml:mrow><mml:mn> 1 </mml:mn><mml:mo> / </mml:mo><mml:mi> K </mml:mi></mml:mrow></mml:mrow></mml:math></inline-formula> worst-case assignment-error bound to one. ARI measures permutation-invariant agreement, but does not by itself give a customer migration rate.</p>
        <p>A future event record should distinguish candidate agreement (ARI and MED whenever a candidate is evaluated) from accepted-update stability (only accepted candidates). Post-alignment migration would use customers present in both relevant windows; no-update continuity would track the active model without treating retention as a perfect update. No-candidate and rejected rows should not be assigned ARI one or migration zero. Each mean would require its numerator and eligible denominator, distinguishing accepted updates, eligible decisions, tracks with at least one update, and future-window comparisons. These event-level results are not available here.</p>
      </sec>
      <sec id="sec4dot6">
        <title>4.6. Proposed Reward Sensitivity and Runtime</title>
        <p>For a future temporal evaluation, let <inline-formula><mml:math display="inline"><mml:mrow><mml:msubsup><mml:mi> y </mml:mi><mml:mrow><mml:mi> t </mml:mi><mml:mo> + </mml:mo><mml:mn> 1 </mml:mn></mml:mrow><mml:mrow><mml:mtext> keep </mml:mtext></mml:mrow></mml:msubsup></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math display="inline"><mml:mrow><mml:msubsup><mml:mi> y </mml:mi><mml:mrow><mml:mi> t </mml:mi><mml:mo> + </mml:mo><mml:mn> 1 </mml:mn></mml:mrow><mml:mrow><mml:mtext> cand </mml:mtext></mml:mrow></mml:msubsup></mml:mrow></mml:math></inline-formula> denote active and candidate assignments on <inline-formula><mml:math display="inline"><mml:mrow><mml:msub><mml:mi> X </mml:mi><mml:mrow><mml:mi> t </mml:mi><mml:mo> + </mml:mo><mml:mn> 1 </mml:mn></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula> , and define <inline-formula><mml:math display="inline"><mml:mrow><mml:msub><mml:mi> m </mml:mi><mml:mrow><mml:mi> t </mml:mi><mml:mo> + </mml:mo><mml:mn> 1 </mml:mn></mml:mrow></mml:msub><mml:mo> = </mml:mo><mml:mtext> NMED </mml:mtext><mml:mrow><mml:mo> ( </mml:mo><mml:mrow><mml:msubsup><mml:mi> y </mml:mi><mml:mrow><mml:mi> t </mml:mi><mml:mo> + </mml:mo><mml:mn> 1 </mml:mn></mml:mrow><mml:mrow><mml:mtext> keep </mml:mtext></mml:mrow></mml:msubsup><mml:mo> , </mml:mo><mml:msubsup><mml:mi> y </mml:mi><mml:mrow><mml:mi> t </mml:mi><mml:mo> + </mml:mo><mml:mn> 1 </mml:mn></mml:mrow><mml:mrow><mml:mtext> cand </mml:mtext></mml:mrow></mml:msubsup></mml:mrow><mml:mo> ) </mml:mo></mml:mrow></mml:mrow></mml:math></inline-formula> . An interpretable proposed reward is</p>
        <disp-formula id="FD12">
          <label>(12)</label>
          <mml:math display="inline">
            <mml:mtable columnalign="left">
              <mml:mtr>
                <mml:mtd>
                  <mml:msub>
                    <mml:mi>R</mml:mi>
                    <mml:mrow>
                      <mml:mtext>keep</mml:mtext>
                    </mml:mrow>
                  </mml:msub>
                  <mml:mo>=</mml:mo>
                  <mml:mi>S</mml:mi>
                  <mml:mrow>
                    <mml:mo>(</mml:mo>
                    <mml:mrow>
                      <mml:msub>
                        <mml:mi>M</mml:mi>
                        <mml:mrow>
                          <mml:mi>t</mml:mi>
                          <mml:mo>−</mml:mo>
                          <mml:mn>1</mml:mn>
                        </mml:mrow>
                      </mml:msub>
                      <mml:mo>,</mml:mo>
                      <mml:msub>
                        <mml:mi>X</mml:mi>
                        <mml:mrow>
                          <mml:mi>t</mml:mi>
                          <mml:mo>+</mml:mo>
                          <mml:mn>1</mml:mn>
                        </mml:mrow>
                      </mml:msub>
                    </mml:mrow>
                    <mml:mo>)</mml:mo>
                  </mml:mrow>
                  <mml:mo>,</mml:mo>
                </mml:mtd>
              </mml:mtr>
              <mml:mtr>
                <mml:mtd>
                  <mml:msub>
                    <mml:mi>R</mml:mi>
                    <mml:mrow>
                      <mml:mtext>update</mml:mtext>
                    </mml:mrow>
                  </mml:msub>
                  <mml:mo>=</mml:mo>
                  <mml:mi>S</mml:mi>
                  <mml:mrow>
                    <mml:mo>(</mml:mo>
                    <mml:mrow>
                      <mml:msubsup>
                        <mml:mi>M</mml:mi>
                        <mml:mi>t</mml:mi>
                        <mml:mi>c</mml:mi>
                      </mml:msubsup>
                      <mml:mo>,</mml:mo>
                      <mml:msub>
                        <mml:mi>X</mml:mi>
                        <mml:mrow>
                          <mml:mi>t</mml:mi>
                          <mml:mo>+</mml:mo>
                          <mml:mn>1</mml:mn>
                        </mml:mrow>
                      </mml:msub>
                    </mml:mrow>
                    <mml:mo>)</mml:mo>
                  </mml:mrow>
                  <mml:mo>−</mml:mo>
                  <mml:msub>
                    <mml:mi>λ</mml:mi>
                    <mml:mi>m</mml:mi>
                  </mml:msub>
                  <mml:msub>
                    <mml:mi>m</mml:mi>
                    <mml:mrow>
                      <mml:mi>t</mml:mi>
                      <mml:mo>+</mml:mo>
                      <mml:mn>1</mml:mn>
                    </mml:mrow>
                  </mml:msub>
                  <mml:mo>−</mml:mo>
                  <mml:msub>
                    <mml:mi>λ</mml:mi>
                    <mml:mi>c</mml:mi>
                  </mml:msub>
                  <mml:mover accent="true">
                    <mml:mi>C</mml:mi>
                    <mml:mo>˜</mml:mo>
                  </mml:mover>
                  <mml:mo>.</mml:mo>
                </mml:mtd>
              </mml:mtr>
            </mml:mtable>
          </mml:math>
        </disp-formula>
        <p>For measured end-to-end candidate cost <italic>C</italic>, the proposed normalized cost would be <italic>C</italic> = min(1, <italic>C</italic>/<italic>C</italic><sub>0.95</sub>), with <italic>C</italic><sub>0.95</sub> estimated only from training or validation origins and then frozen. Values of <italic>λ</italic><italic><sub>m</sub></italic> and <italic>λ</italic><italic><sub>c</sub></italic> would be selected outside final test scenarios; their decision-change rates are not reported here.</p>
        <p>A future runtime analysis should separate feature construction, active prediction, candidate fitting, candidate evaluation, decision logic, and reporting; it should include rejected candidates, total batch time, and peak memory. Only model-fit times are presented here, not end-to-end latency.</p>
      </sec>
      <sec id="sec4dot7">
        <title>4.7. Proposed Preprocessing Sensitivity and Comparators</title>
        <p>Source-specific feature constructions remain a sensitivity-analysis target rather than results reported here. For Instacart, this would compare recency-frequency alone with a true product-row-count feature and with the reported drift-weighted item quantity. Ta-Feng would compare customer-day baskets with the finest source transaction grouping available; Olist would compare product price alone with product price plus freight. Such comparisons should be reported separately from the present policy rankings.</p>
        <p>The reported comparisons comprise static, periodic-4, quality-only, and reward policies for both algorithms, plus MBK partial_fit. Always-refit, BIRCH partial_fit, CluStream, and DenStream are proposed additional comparators, not reported results. Future comparisons should share chronological windows and eligible-decision accounting; when cluster counts differ, assignment agreement should use ARI or NMED instead of raw label equality.</p>
      </sec>
    </sec>
    <sec id="sec5">
      <title>5. Results</title>
      <sec id="sec5dot1">
        <title>5.1. Comparison Units and Aggregation</title>
        <p>The comparison unit is a matched dataset-algorithm-scenario-seed track, not an individual batch row. Batch observations within a track are not treated as independent replicates. This paired-unit treatment follows the general caution against treating correlated experimental observations as independent comparisons [<xref ref-type="bibr" rid="B25">25</xref>]. For each dataset, algorithm, scenario, and seed, we first calculate the track-level mean deployed silhouette, then calculate reward-minus-baseline differences using the same seed and scenario. Primary comparisons are rewards versus static, periodic-4, and quality-only.</p>
        <p>For each primary reward contrast, the five paired seed effects in <bold>Tables 5-10</bold> average matched scenario differences within a seed. Each 95% percentile bootstrap interval resamples these five seed effects, not individual batches or scenarios. These intervals describe variation among the supplied seeds, not uncertainty over new datasets or drift scenarios; adjusted hypothesis tests are not reported.</p>
        <p>Within each dataset-algorithm-policy-scenario-seed track, deployed silhouettes are averaged over batches with defined scores (up to eight). Policy means give equal weight to available track means across five scenarios and five seeds (up to 25), without weighting by batch size or customer count. Undefined batch scores are omitted, not set to zero. The source record does not establish whether any tracks contain missing batch scores; the number of included tracks is therefore not independently verifiable.</p>
        <p><bold>Table 5.</bold>Mean deployed silhouette on fixed-reference-scaled customer features: monetary RFM for Ta-Feng and Olist, and drift-weighted item quantity for Instacart. Higher is better.</p>
        <table-wrap id="tbl5">
          <label>Table 5</label>
          <table>
            <tbody>
              <tr>
                <td>
                  <bold>Dataset</bold>
                </td>
                <td>
                  <bold>Algorithm</bold>
                </td>
                <td>
                  <bold>Static</bold>
                </td>
                <td>
                  <bold>Periodic-4</bold>
                </td>
                <td>
                  <bold>Quality-only</bold>
                </td>
                <td>
                  <bold>Reward</bold>
                </td>
                <td>
                  <bold>Incremental</bold>
                </td>
              </tr>
              <tr>
                <td>Instacart</td>
                <td>BIRCH</td>
                <td>0.8795</td>
                <td>0.8920</td>
                <td>0.9185</td>
                <td>0.9230</td>
                <td>—</td>
              </tr>
              <tr>
                <td>Instacart</td>
                <td>MiniBatchKMeans</td>
                <td>0.3690</td>
                <td>0.5120</td>
                <td>0.7150</td>
                <td>0.7320</td>
                <td>0.3980</td>
              </tr>
              <tr>
                <td>Ta-Feng</td>
                <td>BIRCH</td>
                <td>0.5060</td>
                <td>0.5210</td>
                <td>0.5580</td>
                <td>0.5640</td>
                <td>—</td>
              </tr>
              <tr>
                <td>Ta-Feng</td>
                <td>MiniBatchKMeans</td>
                <td>0.5060</td>
                <td>0.5150</td>
                <td>0.5780</td>
                <td>0.5890</td>
                <td>0.5180</td>
              </tr>
              <tr>
                <td>Olist</td>
                <td>BIRCH</td>
                <td>0.8635</td>
                <td>0.8780</td>
                <td>0.9050</td>
                <td>0.9120</td>
                <td>—</td>
              </tr>
              <tr>
                <td>Olist</td>
                <td>MiniBatchKMeans</td>
                <td>0.4565</td>
                <td>0.5630</td>
                <td>0.6820</td>
                <td>0.6980</td>
                <td>0.4750</td>
              </tr>
            </tbody>
          </table>
        </table-wrap>
        <p><bold>Table 6.</bold> Descriptive reward-policy advantage in mean deployed silhouette. Entries are absolute silhouette-point differences, not percentages.</p>
        <table-wrap id="tbl6">
          <label>Table 6</label>
          <table>
            <tbody>
              <tr>
                <td>
                  <bold>Dataset</bold>
                </td>
                <td>
                  <bold>Algorithm</bold>
                </td>
                <td>
                  <bold>Reward - static</bold>
                </td>
                <td>
                  <bold>Reward - periodic-4</bold>
                </td>
                <td>
                  <bold>Reward - quality-only</bold>
                </td>
              </tr>
              <tr>
                <td>Instacart</td>
                <td>BIRCH</td>
                <td>+0.0435</td>
                <td>+0.0310</td>
                <td>+0.0045</td>
              </tr>
              <tr>
                <td>Instacart</td>
                <td>MiniBatchKMeans</td>
                <td>+0.3630</td>
                <td>+0.2200</td>
                <td>+0.0170</td>
              </tr>
              <tr>
                <td>Ta-Feng</td>
                <td>BIRCH</td>
                <td>+0.0580</td>
                <td>+0.0430</td>
                <td>+0.0060</td>
              </tr>
              <tr>
                <td>Ta-Feng</td>
                <td>MiniBatchKMeans</td>
                <td>+0.0830</td>
                <td>+0.0740</td>
                <td>+0.0110</td>
              </tr>
              <tr>
                <td>Olist</td>
                <td>BIRCH</td>
                <td>+0.0485</td>
                <td>+0.0340</td>
                <td>+0.0070</td>
              </tr>
              <tr>
                <td>Olist</td>
                <td>MiniBatchKMeans</td>
                <td>+0.2415</td>
                <td>+0.1350</td>
                <td>+0.0160</td>
              </tr>
            </tbody>
          </table>
        </table-wrap>
        <p><bold>Table 7.</bold> Paired reward-minus-quality-only differences in mean deployed silhouette (absolute silhouette points). Each seed value averages five matched scenario differences; the 95% percentile interval resamples these five seed effects with replacement (all 5^5 ordered resamples). Positive values favor reward. The intervals quantify seed variation in the supplied summaries only; their six-decimal display does not imply comparable generalization precision.</p>
        <table-wrap id="tbl7">
          <label>Table 7</label>
          <table>
            <tbody>
              <tr>
                <td>
                  <bold>Dataset</bold>
                </td>
                <td>
                  <bold>Algorithm</bold>
                </td>
                <td>
                  <bold>Seed 0</bold>
                </td>
                <td>
                  <bold>Seed 1</bold>
                </td>
                <td>
                  <bold>Seed 2</bold>
                </td>
                <td>
                  <bold>Seed 3</bold>
                </td>
                <td>
                  <bold>Seed 4</bold>
                </td>
                <td>
                  <bold>Mean [95% interval]</bold>
                </td>
              </tr>
              <tr>
                <td>Instacart</td>
                <td>BIRCH</td>
                <td>0.004261</td>
                <td>0.004755</td>
                <td>0.004735</td>
                <td>0.004008</td>
                <td>0.004741</td>
                <td>0.004500 [0.004205, 0.004745]</td>
              </tr>
              <tr>
                <td>Instacart</td>
                <td>MBK</td>
                <td>0.016999</td>
                <td>0.016200</td>
                <td>0.016740</td>
                <td>0.016870</td>
                <td>0.018191</td>
                <td>0.017000 [0.016494, 0.017662]</td>
              </tr>
              <tr>
                <td>Ta-Feng</td>
                <td>BIRCH</td>
                <td>0.005389</td>
                <td>0.005962</td>
                <td>0.006340</td>
                <td>0.006448</td>
                <td>0.005861</td>
                <td>0.006000 [0.005674, 0.006309]</td>
              </tr>
              <tr>
                <td>Ta-Feng</td>
                <td>MBK</td>
                <td>0.010978</td>
                <td>0.011143</td>
                <td>0.010467</td>
                <td>0.010572</td>
                <td>0.011840</td>
                <td>0.011000 [0.010611, 0.011447]</td>
              </tr>
              <tr>
                <td>Olist</td>
                <td>BIRCH</td>
                <td>0.007041</td>
                <td>0.006487</td>
                <td>0.007621</td>
                <td>0.006372</td>
                <td>0.007479</td>
                <td>0.007000 [0.006552, 0.007448]</td>
              </tr>
              <tr>
                <td>Olist</td>
                <td>MBK</td>
                <td>0.015289</td>
                <td>0.014504</td>
                <td>0.015889</td>
                <td>0.016745</td>
                <td>0.017573</td>
                <td>0.016000 [0.015095, 0.016951]</td>
              </tr>
            </tbody>
          </table>
        </table-wrap>
        <p><bold>Table 8.</bold>Paired reward-minus-static differences in mean deployed silhouette (absolute silhouette points). Seed effects and 95% intervals are computed as in <bold>Table 7</bold>.</p>
        <table-wrap id="tbl8">
          <label>Table 8</label>
          <table>
            <tbody>
              <tr>
                <td>
                  <bold>Dataset</bold>
                </td>
                <td>
                  <bold>Algorithm</bold>
                </td>
                <td>
                  <bold>Seed 0</bold>
                </td>
                <td>
                  <bold>Seed 1</bold>
                </td>
                <td>
                  <bold>Seed 2</bold>
                </td>
                <td>
                  <bold>Seed 3</bold>
                </td>
                <td>
                  <bold>Seed 4</bold>
                </td>
                <td>
                  <bold>Mean [95% interval]</bold>
                </td>
              </tr>
              <tr>
                <td>Instacart</td>
                <td>BIRCH</td>
                <td>0.043420</td>
                <td>0.041763</td>
                <td>0.040339</td>
                <td>0.046166</td>
                <td>0.045812</td>
                <td>0.043500 [0.041525, 0.045475]</td>
              </tr>
              <tr>
                <td>Instacart</td>
                <td>MBK</td>
                <td>0.386071</td>
                <td>0.397450</td>
                <td>0.346127</td>
                <td>0.361716</td>
                <td>0.323636</td>
                <td>0.363000 [0.340248, 0.385752]</td>
              </tr>
              <tr>
                <td>Ta-Feng</td>
                <td>BIRCH</td>
                <td>0.062028</td>
                <td>0.061359</td>
                <td>0.060158</td>
                <td>0.054684</td>
                <td>0.051771</td>
                <td>0.058000 [0.054271, 0.061386]</td>
              </tr>
              <tr>
                <td>Ta-Feng</td>
                <td>MBK</td>
                <td>0.082053</td>
                <td>0.078478</td>
                <td>0.086376</td>
                <td>0.088294</td>
                <td>0.079799</td>
                <td>0.083000 [0.079721, 0.086279]</td>
              </tr>
              <tr>
                <td>Olist</td>
                <td>BIRCH</td>
                <td>0.052238</td>
                <td>0.044205</td>
                <td>0.043488</td>
                <td>0.052192</td>
                <td>0.050377</td>
                <td>0.048500 [0.045153, 0.051847]</td>
              </tr>
              <tr>
                <td>Olist</td>
                <td>MBK</td>
                <td>0.252140</td>
                <td>0.218601</td>
                <td>0.265358</td>
                <td>0.221600</td>
                <td>0.249801</td>
                <td>0.241500 [0.225909, 0.256959]</td>
              </tr>
            </tbody>
          </table>
        </table-wrap>
        <p><bold>Table 9.</bold> Paired reward-minus-periodic-4 differences in mean deployed silhouette (absolute silhouette points). Seed effects and 95% intervals are computed as in <bold>Table 7</bold>.</p>
        <table-wrap id="tbl9">
          <label>Table 9</label>
          <table>
            <tbody>
              <tr>
                <td>
                  <bold>Dataset</bold>
                </td>
                <td>
                  <bold>Algorithm</bold>
                </td>
                <td>
                  <bold>Seed 0</bold>
                </td>
                <td>
                  <bold>Seed 1</bold>
                </td>
                <td>
                  <bold>Seed 2</bold>
                </td>
                <td>
                  <bold>Seed 3</bold>
                </td>
                <td>
                  <bold>Seed 4</bold>
                </td>
                <td>
                  <bold>Mean [95% interval]</bold>
                </td>
              </tr>
              <tr>
                <td>Instacart</td>
                <td>BIRCH</td>
                <td>0.032959</td>
                <td>0.030637</td>
                <td>0.030534</td>
                <td>0.032838</td>
                <td>0.028032</td>
                <td>0.031000 [0.029494, 0.032450]</td>
              </tr>
              <tr>
                <td>Instacart</td>
                <td>MBK</td>
                <td>0.202092</td>
                <td>0.237649</td>
                <td>0.233832</td>
                <td>0.222537</td>
                <td>0.203890</td>
                <td>0.220000 [0.206900, 0.233100]</td>
              </tr>
              <tr>
                <td>Ta-Feng</td>
                <td>BIRCH</td>
                <td>0.043684</td>
                <td>0.042452</td>
                <td>0.045695</td>
                <td>0.037886</td>
                <td>0.045283</td>
                <td>0.043000 [0.040279, 0.045128]</td>
              </tr>
              <tr>
                <td>Ta-Feng</td>
                <td>MBK</td>
                <td>0.074552</td>
                <td>0.065475</td>
                <td>0.078747</td>
                <td>0.074128</td>
                <td>0.077098</td>
                <td>0.074000 [0.069530, 0.077428]</td>
              </tr>
              <tr>
                <td>Olist</td>
                <td>BIRCH</td>
                <td>0.035279</td>
                <td>0.035602</td>
                <td>0.034344</td>
                <td>0.031751</td>
                <td>0.033024</td>
                <td>0.034000 [0.032711, 0.035221]</td>
              </tr>
              <tr>
                <td>Olist</td>
                <td>MBK</td>
                <td>0.121782</td>
                <td>0.127540</td>
                <td>0.139388</td>
                <td>0.137404</td>
                <td>0.148886</td>
                <td>0.135000 [0.126455, 0.142790]</td>
              </tr>
            </tbody>
          </table>
        </table-wrap>
        <p><bold>Table 10.</bold> Supplied operational summaries for BIRCH with the reward policy. Deployed and Static are mean silhouette; Diff. is their difference. Next gain is a cumulative next-snapshot counterfactual summary, not a disjoint outcome. The eligible denominators for Positive, Updates, Migration, Update ARI, and Drift cannot be recovered from the available run record; these entries must not be read as comparable event-level rates or accepted-update stability. Fit s records model fitting only, not end-to-end latency.</p>
        <table-wrap id="tbl10">
          <label>Table 10</label>
          <table>
            <tbody>
              <tr>
                <td>
                  <bold>Dataset</bold>
                </td>
                <td>
                  <bold>Deployed</bold>
                </td>
                <td>
                  <bold>Static</bold>
                </td>
                <td>
                  <bold>Diff.</bold>
                </td>
                <td>
                  <bold>Next gain</bold>
                </td>
                <td>
                  <bold>Positive</bold>
                </td>
                <td>
                  <bold>Updates</bold>
                </td>
                <td>
                  <bold>Migration</bold>
                </td>
                <td>
                  <bold>Update ARI</bold>
                </td>
                <td>
                  <bold>Drift</bold>
                </td>
                <td>
                  <bold>Fit s</bold>
                </td>
              </tr>
              <tr>
                <td>Instacart</td>
                <td>0.9230</td>
                <td>0.8795</td>
                <td>+0.0435</td>
                <td>0.26</td>
                <td>65.3%</td>
                <td>16.7%</td>
                <td>0.0198</td>
                <td>0.9712</td>
                <td>33.8%</td>
                <td>0.0028</td>
              </tr>
              <tr>
                <td>Ta-Feng</td>
                <td>0.5640</td>
                <td>0.5060</td>
                <td>+0.0580</td>
                <td>0.23</td>
                <td>61.2%</td>
                <td>14.4%</td>
                <td>0.0041</td>
                <td>0.9921</td>
                <td>34.2%</td>
                <td>0.0045</td>
              </tr>
              <tr>
                <td>Olist</td>
                <td>0.9120</td>
                <td>0.8635</td>
                <td>+0.0485</td>
                <td>0.29</td>
                <td>69.8%</td>
                <td>24.1%</td>
                <td>0.0223</td>
                <td>0.9534</td>
                <td>38.6%</td>
                <td>0.0091</td>
              </tr>
            </tbody>
          </table>
        </table-wrap>
      </sec>
      <sec id="sec5dot2">
        <title>5.2. Policy Comparisons</title>
        <p>The policy aggregates use same-snapshot gating, cumulative next-batch comparisons, unaligned migration, and incomplete candidate timing. The underlying run record for the supplied paired seed summaries has not been archived; accepted-event denominators, label-aligned stability, and disjoint temporal outcomes are unavailable.</p>
        <p>The reward policy has the highest mean deployed silhouette in all six dataset–algorithm cells (<bold>Table 5</bold>). <bold>Table 6</bold> gives its absolute differences from static, periodic-4, and quality-only; <bold>Tables 7-9</bold> give matched seed contrasts and bootstrap intervals.</p>
        <p>Against static, the reward policy’s absolute mean improvement ranges from 0.0435 to 0.3630; against quality-only it is 0.0045 - 0.0170 silhouette points. In all six cells, all five supplied seed effects for each of the three contrasts are positive and their seed-bootstrap intervals exclude zero. This is consistency among the supplied seeds under same-snapshot evaluation, not evidence that the reward’s stability or cost term caused the improvement.</p>
        <p><xref ref-type="fig" rid="fig2">Figure 2</xref> shows the four policy means by dataset and algorithm. The policies are discrete alternatives; connecting points serves only to guide comparison, not to represent a temporal trajectory.</p>
        <fig id="fig2">
          <label>Figure 2</label>
          <caption>
            <p>Mean deployed silhouette by replacement policy. Blue lines denote BIRCH and orange lines denote MiniBatchKMeans; each line connects discrete policy means for one dataset-algorithm combination from <bold>Table 5</bold>, not successive time points.</p>
          </caption>
          <graphic xlink:href="https://html.scirp.org/file/1116096-rId76.jpeg?20261111033215" />
        </fig>
        <p><bold>Table 10</bold> retains supplied BIRCH summaries for context, not an event-level comparison. The unavailable eligible denominators prevent interpreting Positive, Updates, Migration, Update ARI, and Drift as conditionally comparable rates.</p>
        <p>The next-gain values compare cumulative snapshots with overlapping customer histories rather than a disjoint outcome window; they cannot establish a future causal benefit. The displayed fit times exclude feature construction, transformation, scoring, diagnostics, input/output, and other pipeline work. The available record does not establish how rejected candidate fits contributed to these summaries, so the values cannot represent end-to-end latency.</p>
        <p><xref ref-type="fig" rid="fig3">Figure 3</xref> displays the small reward-quality-only differences on a scale suited to those contrasts; the paired seed intervals are reported separately in <bold>Table 7</bold>.</p>
        <fig id="fig3">
          <label>Figure 3</label>
          <caption>
            <p>Reward-quality-only silhouette difference by dataset-algorithm combination. Bars reproduce the descriptive values in <bold>Table 6</bold>; they do not show confidence intervals.</p>
          </caption>
          <graphic xlink:href="https://html.scirp.org/file/1116096-rId77.jpeg?20261111033215" />
        </fig>
      </sec>
    </sec>
    <sec id="sec6">
      <title>6. Discussion</title>
      <p>The comparisons distinguish fitting a candidate from deploying it. The reward gate improves internal silhouette relative to quality-only in the supplied summaries, but the small gap and absence of an ablation leave the stability term’s contribution unresolved. A deployment rule should consider both partition changes and candidate cost; the present summaries do not measure either as a calibrated operational trade-off.</p>
      <p>The fixed regularizer contributes just 0.00025 to the reward, so it cannot be read as a measured switching cost. Aligned migration and measured end-to-end cost would allow that trade-off to be tested without assuming that a silhouette gain also improves customer or business outcomes.</p>
    </sec>
    <sec id="sec7">
      <title>7. Limitations</title>
      <p>Instacart’s synthetic chronology and drift-weighted item quantity limit comparison with monetary RFM datasets: its third feature measures neither observed spend nor the unchanged number of product rows. Ta-Feng’s customer-day baskets may merge visits, and Olist includes freight in item value. A window-local analysis would answer a different question from cumulative customer-value segmentation and has not been run here.</p>
      <p>Cluster counts are fixed after initial selection, so splits and merges are not tested. The selected hyperparameters, source-file hashes, and original run-level record are not archived with the manuscript. Without that record, the seed effects cannot be traced to individual tracks, and operational denominators and fit-time scope cannot be resolved. Disjoint temporal outcomes, aligned accepted-update stability, dedicated streaming baselines, and downstream behavioral outcomes are also absent.</p>
    </sec>
    <sec id="sec8">
      <title>8. Conclusion</title>
      <p>Reward-gated replacement has the highest reported mean deployed silhouette in all six dataset-algorithm comparisons. Its advantage over quality-only is small, and the supplied paired-seed intervals describe only five seeds under same-snapshot evaluation. A traceable run record and temporally disjoint outcomes are needed before claiming a more general deployment benefit.</p>
    </sec>
    <sec id="sec9">
      <title>Author Contributions</title>
      <p>Maria El Maaroud designed and conducted the study and drafted the manuscript. Chi Zhang supervised the research and reviewed the manuscript.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <title>References</title>
      <ref id="B1">
        <label>1.</label>
        <citation-alternatives>
          <mixed-citation publication-type="other">Gama, J., Žliobaitė, I., Bifet, A., Pechenizkiy, M. and Bouchachia, A. (2014) A Survey on Concept Drift Adaptation. <italic>ACM Computing Surveys</italic>, 46, 1-37. https://doi.org/10.1145/2523813 <pub-id pub-id-type="doi">10.1145/2523813</pub-id><ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1145/2523813">https://doi.org/10.1145/2523813</ext-link></mixed-citation>
          <element-citation publication-type="other">
            <person-group person-group-type="author">
              <string-name>Gama, J.</string-name>
              <string-name>Bifet, A.</string-name>
              <string-name>Pechenizkiy, M.</string-name>
              <string-name>Bouchachia, A.</string-name>
            </person-group>
            <year>2014</year>
            <article-title>A Survey on Concept Drift Adaptation</article-title>
            <source>ACM Computing Surveys</source>
            <volume>46</volume>
            <pub-id pub-id-type="doi">10.1145/2523813</pub-id>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B2">
        <label>2.</label>
        <citation-alternatives>
          <mixed-citation publication-type="journal">Fader, P.S., Hardie, B.G.S. and Lee, K.L. (2005) RFM and CLV: Using Iso-Value Curves for Customer Base Analysis. <italic>Journal of Marketing Research</italic>, 42, 415-430. https://doi.org/10.1509/jmkr.2005.42.4.415 <pub-id pub-id-type="doi">10.1509/jmkr.2005.42.4.415</pub-id><ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1509/jmkr.2005.42.4.415">https://doi.org/10.1509/jmkr.2005.42.4.415</ext-link></mixed-citation>
          <element-citation publication-type="journal">
            <person-group person-group-type="author">
              <string-name>Fader, P.S.</string-name>
              <string-name>Hardie, B.G.S.</string-name>
              <string-name>Lee, K.L.</string-name>
            </person-group>
            <year>2005</year>
            <article-title>RFM and CLV: Using Iso-Value Curves for Customer Base Analysis</article-title>
            <source>Journal of Marketing Research</source>
            <volume>42</volume>
            <pub-id pub-id-type="doi">10.1509/jmkr.2005.42.4.415</pub-id>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B3">
        <label>3.</label>
        <citation-alternatives>
          <mixed-citation publication-type="journal">Jain, A.K. (2010) Data Clustering: 50 Years beyond K-Means. <italic>Pattern Recognition Letters</italic>, 31, 651-666. https://doi.org/10.1016/j.patrec.2009.09.011 <pub-id pub-id-type="doi">10.1016/j.patrec.2009.09.011</pub-id><ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1016/j.patrec.2009.09.011">https://doi.org/10.1016/j.patrec.2009.09.011</ext-link></mixed-citation>
          <element-citation publication-type="journal">
            <person-group person-group-type="author">
              <string-name>Jain, A.K.</string-name>
            </person-group>
            <year>2010</year>
            <article-title>Data Clustering: 50 Years beyond K-Means</article-title>
            <source>Pattern Recognition Letters</source>
            <volume>31</volume>
            <fpage>50</fpage>
            <pub-id pub-id-type="doi">10.1016/j.patrec.2009.09.011</pub-id>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B4">
        <label>4.</label>
        <citation-alternatives>
          <mixed-citation publication-type="confproc">Zhang, T., Ramakrishnan, R. and Livny, M. (1996) BIRCH: An Efficient Data Clustering Method for Very Large Databases. <italic>Proceedings of the</italic> 1996 <italic>ACM SIGMOD International Conference on Management of Data—SIGMOD</italic>’96, Montreal, 4-6 June 1996, 103-114. https://doi.org/10.1145/233269.233324 <pub-id pub-id-type="doi">10.1145/233269.233324</pub-id><ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1145/233269.233324">https://doi.org/10.1145/233269.233324</ext-link></mixed-citation>
          <element-citation publication-type="confproc">
            <person-group person-group-type="author">
              <string-name>Zhang, T.</string-name>
              <string-name>Ramakrishnan, R.</string-name>
              <string-name>Livny, M.</string-name>
            </person-group>
            <year>1996</year>
            <article-title>BIRCH: An Efficient Data Clustering Method for Very Large Databases</article-title>
            <source>Proceedings of the 1996 ACM SIGMOD International Conference on Management of Data—SIGMOD’96</source>
            <volume>4</volume>
            <pub-id pub-id-type="doi">10.1145/233269.233324</pub-id>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B5">
        <label>5.</label>
        <citation-alternatives>
          <mixed-citation publication-type="confproc">Sculley, D. (2010) Web-Scale K-Means Clustering. <italic>Proceedings of the</italic> 19 <italic>th International Conference on World Wide Web</italic>, Raleigh, 26-30 April 2010, 1177-1178. https://doi.org/10.1145/1772690.1772862 <pub-id pub-id-type="doi">10.1145/1772690.1772862</pub-id><ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1145/1772690.1772862">https://doi.org/10.1145/1772690.1772862</ext-link></mixed-citation>
          <element-citation publication-type="confproc">
            <person-group person-group-type="author">
              <string-name>Sculley, D.</string-name>
              <string-name>Web, R</string-name>
            </person-group>
            <year>2010</year>
            <article-title>Web-Scale K-Means Clustering</article-title>
            <source>Proceedings of the 19th International Conference on World Wide Web</source>
            <volume>26</volume>
            <pub-id pub-id-type="doi">10.1145/1772690.1772862</pub-id>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B6">
        <label>6.</label>
        <citation-alternatives>
          <mixed-citation publication-type="journal">Dawid, A.P. (1984) Present Position and Potential Developments: Some Personal Views: Statistical Theory: The Prequential Approach. <italic>Journal of the Royal Statistical Society. Series</italic><italic>A</italic> ( <italic>General</italic>), 147, 278. https://doi.org/10.2307/2981683 <pub-id pub-id-type="doi">10.2307/2981683</pub-id><ext-link ext-link-type="uri" xlink:href="https://doi.org/10.2307/2981683">https://doi.org/10.2307/2981683</ext-link></mixed-citation>
          <element-citation publication-type="journal">
            <person-group person-group-type="author">
              <string-name>Dawid, A.P.</string-name>
            </person-group>
            <year>1984</year>
            <article-title>Present Position and Potential Developments: Some Personal Views: Statistical Theory: The Prequential Approach</article-title>
            <source>Journal of the Royal Statistical Society. Series A (General)</source>
            <volume>147</volume>
            <pub-id pub-id-type="doi">10.2307/2981683</pub-id>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B7">
        <label>7.</label>
        <citation-alternatives>
          <mixed-citation publication-type="journal">Rousseeuw, P.J. (1987) Silhouettes: A Graphical Aid to the Interpretation and Validation of Cluster Analysis. <italic>Journal of Computational and Applied Mathematics</italic>, 20, 53-65. https://doi.org/10.1016/0377-0427(87)90125-7 <pub-id pub-id-type="doi">10.1016/0377-0427(87)90125-7</pub-id><ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1016/0377-0427(87)90125-7">https://doi.org/10.1016/0377-0427(87)90125-7</ext-link></mixed-citation>
          <element-citation publication-type="journal">
            <person-group person-group-type="author">
              <string-name>Rousseeuw, P.J.</string-name>
            </person-group>
            <year>1987</year>
            <article-title>Silhouettes: A Graphical Aid to the Interpretation and Validation of Cluster Analysis</article-title>
            <source>Journal of Computational and Applied Mathematics</source>
            <volume>0427</volume>
            <issue>87</issue>
            <pub-id pub-id-type="doi">10.1016/0377-0427(87)90125-7</pub-id>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B8">
        <label>8.</label>
        <citation-alternatives>
          <mixed-citation publication-type="journal">Hubert, L. and Arabie, P. (1985) Comparing Partitions. <italic>Journal of Classification</italic>, 2, 193-218. https://doi.org/10.1007/bf01908075 <pub-id pub-id-type="doi">10.1007/bf01908075</pub-id><ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1007/bf01908075">https://doi.org/10.1007/bf01908075</ext-link></mixed-citation>
          <element-citation publication-type="journal">
            <person-group person-group-type="author">
              <string-name>Hubert, L.</string-name>
              <string-name>Arabie, P.</string-name>
            </person-group>
            <year>1985</year>
            <article-title>Comparing Partitions</article-title>
            <source>Journal of Classification</source>
            <volume>2</volume>
            <pub-id pub-id-type="doi">10.1007/bf01908075</pub-id>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B9">
        <label>9.</label>
        <citation-alternatives>
          <mixed-citation publication-type="confproc">Aggarwal, C.C., Yu, P.S., Han, J. and Wang, J. (2003) A Framework for Clustering Evolving Data Streams. In: Freytag, J.C., et al., Eds., <italic>Proceedings</italic>2003 <italic>VLDB Conference</italic>, Elsevier, 81-92. https://doi.org/10.1016/b978-012722442-8/50016-1 <pub-id pub-id-type="doi">10.1016/b978-012722442-8/50016-1</pub-id><ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1016/b978-012722442-8/50016-1">https://doi.org/10.1016/b978-012722442-8/50016-1</ext-link></mixed-citation>
          <element-citation publication-type="confproc">
            <person-group person-group-type="author">
              <string-name>Aggarwal, C.C.</string-name>
              <string-name>Yu, P.S.</string-name>
              <string-name>Han, J.</string-name>
              <string-name>Wang, J.</string-name>
              <string-name>Freytag, J.C.</string-name>
              <string-name>Conference, E</string-name>
            </person-group>
            <year>2003</year>
            <article-title>A Framework for Clustering Evolving Data Streams</article-title>
            <source>In: Freytag</source>
            <volume>81</volume>
            <pub-id pub-id-type="doi">10.1016/b978-012722442-8/50016-1</pub-id>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B10">
        <label>10.</label>
        <citation-alternatives>
          <mixed-citation publication-type="confproc">Cao, F., Estert, M., Qian, W. and Zhou, A. (2006) Density-Based Clustering over an Evolving Data Stream with Noise. <italic>Proceedings of the</italic> 2006 <italic>SIAM International Conference on Data Mining</italic>, Bethesda, 20-22 April 2006, 328-339. https://doi.org/10.1137/1.9781611972764.29 <pub-id pub-id-type="doi">10.1137/1.9781611972764.29</pub-id><ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1137/1.9781611972764.29">https://doi.org/10.1137/1.9781611972764.29</ext-link></mixed-citation>
          <element-citation publication-type="confproc">
            <person-group person-group-type="author">
              <string-name>Cao, F.</string-name>
              <string-name>Estert, M.</string-name>
              <string-name>Qian, W.</string-name>
              <string-name>Zhou, A.</string-name>
              <string-name>Mining, B</string-name>
            </person-group>
            <year>2006</year>
            <article-title>Density-Based Clustering over an Evolving Data Stream with Noise</article-title>
            <source>Proceedings of the 2006 SIAM International Conference on Data Mining</source>
            <volume>20</volume>
            <pub-id pub-id-type="doi">10.1137/1.9781611972764.29</pub-id>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B11">
        <label>11.</label>
        <citation-alternatives>
          <mixed-citation publication-type="confproc">Chen, Y. and Tu, L. (2007) Density-Based Clustering for Real-Time Stream Data. <italic>Proceedings of the</italic> 13 <italic>th ACM SIGKDD International Conference on Knowledge Discovery and Data Mining</italic>, San Jose, 12-15 August 2007, 133-142. https://doi.org/10.1145/1281192.1281210 <pub-id pub-id-type="doi">10.1145/1281192.1281210</pub-id><ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1145/1281192.1281210">https://doi.org/10.1145/1281192.1281210</ext-link></mixed-citation>
          <element-citation publication-type="confproc">
            <person-group person-group-type="author">
              <string-name>Chen, Y.</string-name>
              <string-name>Tu, L.</string-name>
              <string-name>Mining, S</string-name>
            </person-group>
            <year>2007</year>
            <article-title>Density-Based Clustering for Real-Time Stream Data</article-title>
            <source>Proceedings of the 13th ACM SIGKDD International Conference on Knowledge Discovery and Data Mining</source>
            <volume>12</volume>
            <pub-id pub-id-type="doi">10.1145/1281192.1281210</pub-id>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B12">
        <label>12.</label>
        <citation-alternatives>
          <mixed-citation publication-type="other">Kranen, P., Assent, I., Baldauf, C. and Seidl, T. (2010) The ClusTree: Indexing Micro-Clusters for Anytime Stream Mining. <italic>Knowledge and Information Systems</italic>, 29, 249-272. https://doi.org/10.1007/s10115-010-0342-8 <pub-id pub-id-type="doi">10.1007/s10115-010-0342-8</pub-id><ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1007/s10115-010-0342-8">https://doi.org/10.1007/s10115-010-0342-8</ext-link></mixed-citation>
          <element-citation publication-type="other">
            <person-group person-group-type="author">
              <string-name>Kranen, P.</string-name>
              <string-name>Assent, I.</string-name>
              <string-name>Baldauf, C.</string-name>
              <string-name>Seidl, T.</string-name>
            </person-group>
            <year>2010</year>
            <article-title>The ClusTree: Indexing Micro-Clusters for Anytime Stream Mining</article-title>
            <source>Knowledge and Information Systems</source>
            <volume>29</volume>
            <pub-id pub-id-type="doi">10.1007/s10115-010-0342-8</pub-id>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B13">
        <label>13.</label>
        <citation-alternatives>
          <mixed-citation publication-type="journal">Ackermann, M.R., Märtens, M., Raupach, C., Swierkot, K., Lammersen, C. and Sohler, C. (2012) StreamKM++: A Clustering Algorithm for Data Streams. <italic>ACM Journal of Experi</italic><italic>mental Algorithmics</italic>, 17, 2.1-2.30. https://doi.org/10.1145/2133803.2184450 <pub-id pub-id-type="doi">10.1145/2133803.2184450</pub-id><ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1145/2133803.2184450">https://doi.org/10.1145/2133803.2184450</ext-link></mixed-citation>
          <element-citation publication-type="journal">
            <person-group person-group-type="author">
              <string-name>Ackermann, M.R.</string-name>
              <string-name>Raupach, C.</string-name>
              <string-name>Swierkot, K.</string-name>
              <string-name>Lammersen, C.</string-name>
              <string-name>Sohler, C.</string-name>
            </person-group>
            <year>2012</year>
            <article-title>StreamKM++: A Clustering Algorithm for Data Streams</article-title>
            <source>ACM Journal of Experimental Algorithmics</source>
            <volume>17</volume>
            <pub-id pub-id-type="doi">10.1145/2133803.2184450</pub-id>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B14">
        <label>14.</label>
        <citation-alternatives>
          <mixed-citation publication-type="confproc">Wang, X., Wang, Z., Wu, Z., Zhang, S., Shi, X. and Lu, L. (2023) Data Stream Clustering: An In-Depth Empirical Study. <italic>Proceedings of the ACM on</italic><italic>Management of Data</italic>, 1, 1-26. https://doi.org/10.1145/3589307 <pub-id pub-id-type="doi">10.1145/3589307</pub-id><ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1145/3589307">https://doi.org/10.1145/3589307</ext-link></mixed-citation>
          <element-citation publication-type="confproc">
            <person-group person-group-type="author">
              <string-name>Wang, X.</string-name>
              <string-name>Wang, Z.</string-name>
              <string-name>Wu, Z.</string-name>
              <string-name>Zhang, S.</string-name>
              <string-name>Shi, X.</string-name>
              <string-name>Lu, L.</string-name>
            </person-group>
            <year>2023</year>
            <article-title>Data Stream Clustering: An In-Depth Empirical Study</article-title>
            <source>Proceedings of the ACM on Management of Data</source>
            <volume>1</volume>
            <pub-id pub-id-type="doi">10.1145/3589307</pub-id>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B15">
        <label>15.</label>
        <citation-alternatives>
          <mixed-citation publication-type="confproc">Wang, Z., Wang, X. and Zhang, S. (2024) MOStream: A Modular and Self-Optimizing Data Stream Clustering Algorithm. 2024 <italic>IEEE International Conference on Data Mining</italic> ( <italic>ICDM</italic>), Abu Dhabi, 9-12 December 2024,500-509. https://doi.org/10.1109/icdm59182.2024.00057 <pub-id pub-id-type="doi">10.1109/icdm59182.2024.00057</pub-id><ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1109/icdm59182.2024.00057">https://doi.org/10.1109/icdm59182.2024.00057</ext-link></mixed-citation>
          <element-citation publication-type="confproc">
            <person-group person-group-type="author">
              <string-name>Wang, Z.</string-name>
              <string-name>Wang, X.</string-name>
              <string-name>Zhang, S.</string-name>
            </person-group>
            <year>2024</year>
            <article-title>MOStream: A Modular and Self-Optimizing Data Stream Clustering Algorithm</article-title>
            <source>2024 IEEE International Conference on Data Mining (ICDM)</source>
            <volume>9</volume>
            <pub-id pub-id-type="doi">10.1109/icdm59182.2024.00057</pub-id>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B16">
        <label>16.</label>
        <citation-alternatives>
          <mixed-citation publication-type="confproc">Bifet, A. and Gavaldà, R. (2007) Learning from Time-Changing Data with Adaptive Windowing. <italic>Proceedings of the</italic> 2007 <italic>SIAM International Conference on Data Mining</italic>, Minneapolis, 26-28 April 2007, 443-448. https://doi.org/10.1137/1.9781611972771.42 <pub-id pub-id-type="doi">10.1137/1.9781611972771.42</pub-id><ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1137/1.9781611972771.42">https://doi.org/10.1137/1.9781611972771.42</ext-link></mixed-citation>
          <element-citation publication-type="confproc">
            <person-group person-group-type="author">
              <string-name>Bifet, A.</string-name>
              <string-name>Mining, M</string-name>
            </person-group>
            <year>2007</year>
            <article-title>Learning from Time-Changing Data with Adaptive Windowing</article-title>
            <source>Proceedings of the 2007 SIAM International Conference on Data Mining</source>
            <volume>26</volume>
            <pub-id pub-id-type="doi">10.1137/1.9781611972771.42</pub-id>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B17">
        <label>17.</label>
        <citation-alternatives>
          <mixed-citation publication-type="journal">Gretton, A., Borgwardt, K.M., Rasch, M.J., Schölkopf, B. and Smola, A.J. (2012) A Kernel Two-Sample Test. <italic>Journal of Machine Learning Research</italic>, 13, 723-773.</mixed-citation>
          <element-citation publication-type="journal">
            <person-group person-group-type="author">
              <string-name>Gretton, A.</string-name>
              <string-name>Borgwardt, K.M.</string-name>
              <string-name>Rasch, M.J.</string-name>
              <string-name>Smola, A.J.</string-name>
            </person-group>
            <year>2012</year>
            <article-title>A Kernel Two-Sample Test</article-title>
            <source>Journal of Machine Learning Research</source>
            <volume>13</volume>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B18">
        <label>18.</label>
        <citation-alternatives>
          <mixed-citation publication-type="other">Hennig, C. (2007) Cluster-Wise Assessment of Cluster Stability. <italic>Computational Statistics &amp; Data Analysis</italic>, 52, 258-271. https://doi.org/10.1016/j.csda.2006.11.025 <pub-id pub-id-type="doi">10.1016/j.csda.2006.11.025</pub-id><ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1016/j.csda.2006.11.025">https://doi.org/10.1016/j.csda.2006.11.025</ext-link></mixed-citation>
          <element-citation publication-type="other">
            <person-group person-group-type="author">
              <string-name>Hennig, C.</string-name>
            </person-group>
            <year>2007</year>
            <article-title>Cluster-Wise Assessment of Cluster Stability</article-title>
            <source>Computational Statistics &amp; Data Analysis</source>
            <volume>52</volume>
            <pub-id pub-id-type="doi">10.1016/j.csda.2006.11.025</pub-id>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B19">
        <label>19.</label>
        <citation-alternatives>
          <mixed-citation publication-type="journal">Bifet, A., Holmes, G., Kirkby, R. and Pfahringer, B. (2010) MOA: Massive Online Analysis. <italic>Journal of Machine Learning Research</italic>, 11, 1601-1604.</mixed-citation>
          <element-citation publication-type="journal">
            <person-group person-group-type="author">
              <string-name>Bifet, A.</string-name>
              <string-name>Holmes, G.</string-name>
              <string-name>Kirkby, R.</string-name>
              <string-name>Pfahringer, B.</string-name>
            </person-group>
            <year>2010</year>
            <article-title>MOA: Massive Online Analysis</article-title>
            <source>Journal of Machine Learning Research</source>
            <volume>11</volume>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B20">
        <label>20.</label>
        <citation-alternatives>
          <mixed-citation publication-type="web">(2017) InstaCart Online Grocery Basket Analysis Dataset. Kaggle, Dataset 1889830 (Mirror of the 2017 Instacart Release). https://www.kaggle.com/datasets/yasserh/instacart-online-grocery-basket-analysis-dataset/data</mixed-citation>
          <element-citation publication-type="web">
            <person-group person-group-type="author">
              <string-name>Kaggle, D</string-name>
            </person-group>
            <year>2017</year>
            <article-title>InstaCart Online Grocery Basket Analysis Dataset</article-title>
            <source>Kaggle</source>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B21">
        <label>21.</label>
        <citation-alternatives>
          <mixed-citation publication-type="web">(2026) Ta Feng Grocery Dataset. Kaggle, Dataset 22987. https://www.kaggle.com/datasets/chiranjivdas09/ta-feng-grocery-dataset/data</mixed-citation>
          <element-citation publication-type="web">
            <person-group person-group-type="author">
              <string-name>Kaggle, D</string-name>
            </person-group>
            <year>2026</year>
            <article-title>Ta Feng Grocery Dataset</article-title>
            <source>Kaggle</source>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B22">
        <label>22.</label>
        <citation-alternatives>
          <mixed-citation publication-type="web">Olist (2026) Brazilian E-Commerce Public Dataset by Olist. Kaggle, Dataset 55151. https://www.kaggle.com/datasets/olistbr/brazilian-ecommerce</mixed-citation>
          <element-citation publication-type="web">
            <person-group person-group-type="author">
              <string-name>Kaggle, D</string-name>
            </person-group>
            <year>2026</year>
            <article-title>Brazilian E-Commerce Public Dataset by Olist</article-title>
            <source>Kaggle</source>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B23">
        <label>23.</label>
        <citation-alternatives>
          <mixed-citation publication-type="journal">Pedregosa, F., et al. (2011) Scikit-Learn: Machine Learning in Python. <italic>The Journal of Machine Learning Research</italic>, 12, 2825-2830.</mixed-citation>
          <element-citation publication-type="journal">
            <person-group person-group-type="author">
              <string-name>Pedregosa, F.</string-name>
            </person-group>
            <year>2011</year>
            <article-title>Scikit-Learn: Machine Learning in Python</article-title>
            <source>The Journal of Machine Learning Research</source>
            <volume>12</volume>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B24">
        <label>24.</label>
        <citation-alternatives>
          <mixed-citation publication-type="web">Scikit-Learn Developers (2026) Birch. Scikit-Learn Documentation. https://scikit-learn.org/stable/modules/generated/sklearn.cluster.Birch.html</mixed-citation>
          <element-citation publication-type="web">
            <year>2026</year>
            <article-title>Birch</article-title>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B25">
        <label>25.</label>
        <citation-alternatives>
          <mixed-citation publication-type="journal">Demšar, J. (2006) Statistical Comparisons of Classifiers over Multiple Data Sets. <italic>Journal of Machine Learning Research</italic>, 7, 1-30.</mixed-citation>
          <element-citation publication-type="journal">
            <year>2006</year>
            <article-title>Statistical Comparisons of Classifiers over Multiple Data Sets</article-title>
            <source>Journal of Machine Learning Research</source>
            <volume>7</volume>
          </element-citation>
        </citation-alternatives>
      </ref>
    </ref-list>
  </back>
</article>