![a Jamaican teaching Python in the Blue Mountains. Image 2 of 4](https://th.bing.com/th/id/OIG3.cmm4l4YfiKKoynBLhv2r?w=173&h=173&c=6&r=0&o=5&dpr=1.3&pid=ImgGn)
Someone at work posted a link to this Quanta Magazine article. It describes a novel, and seemingly straight-forward way to estimate the number of distinct elements in a datastream.
Quanta describes the algorithm, and as an example gives "counting the number of distinct words in Hamlet".
Following Quanta
I looked at the description and decided to follow their text. They carefully described each round of the algorithm which I coded up and then looked for the generalizations and implemented a loop over alll items in the stream ....
It did not work! I got silly numbers. I could download Hamlet split it into words, (around 32,000), do len(set(words) to get the exact number of distinct words, (around 7,000), then run it through the algorithm and get a stupid result with tens of digits for the estimated number of distinct words.
I re-checked my implementation of the Quanta-described algorithm and couldn't see any mistake, but I had originally noticed a link to the original paper. I did not follow it at first as original papers can be heavily into maths notation and I prefer reading algorithms described in code/pseudocode.
I decided to take a look at the original.
I scanned the paper.
I read the paper.
I looked at Algorithm 1 as a probable candidate to decypher into Python, but the description was cryptic. Heres that description taken from the paper:
![](data:image/png;base64,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)
AI To the rescue!?
I had a brainwaveđź’ˇlets chuck it at two AI's and see what they do. I had Gemini and I had Copilot to hand and asked them each to express Algorithm 1 as Python. Gemini did something, and Copilot finally did something but I first had to open the page in Microsoft Edge.
There followed hours of me reading and cross-comparing between the algorithm and the AI's. If I did not understand where something came from I would ask the generating AI; If I found an error I would first, (and second and...), try to get the AI to make a fix I suggested.
At this stage I was also trying to get a feel for how the AI's could help me, (now way past what I thought the algorithm should be, just to see what it would take to get those AI's to cross T's and dot I's on a good solution).
Not a good use of time! I now know that asking questions to update one of the 20 to 30 lines of the Python function might fix that line, but unfix another line you had fixed before. Code from the AI does not have line numbers making it difficult to state what needs changing, and where.They can suggest type hints and create the beginnings of docstrings, but, for example, it pulled out the wrong authors for the name of the algorithm.
In line 1 of the algorithm, the initialisation of thresh is clearly shown, I thought, but both AI's had difficulty getting the Python right. eventually I cut-n-pasted the text into each AI, where they confidentially said "OF course...", made a change, and then I had to re-check for any other changes.
My Code
I first created this function:
def F0_Estimator(stream: Collection[Any], epsilon: float, delta: float) -> float:
"""
...
"""
p = 1
X = set()
m = len(stream)
thresh = math.ceil(12 / (epsilon ** 2) * math.log(8 * m / delta))
for item in stream:
X.discard(item)
if random.random() < p:
X.add(item)
if len(X) == thresh:
X = {x_item for x_item in X
if random.random() < 0.5}
p /= 2
return len(X) / p
I tested it with Hamlet data and it made OK estimates.
Elated, I took a break.
Hacker News
The next evening I decided to do a search to see If anyone else was talking about the algorithm and found a thread on Hacker News that was right up my street. People were discussing those same problems found in the Quanta Article - and getting similar ginormous answers. They had one of the original Authors of the paper making comments! And others had created code from the actual paper and said it was also easier than the Quanta description.
The author mentioned that no less than Donald Knuth had taken an interest in their algorithm and had noted that the expression starting `X = ...` four lines from the end could, thoretically, make no change to X, and the solution was to encase the assignment in a while loop that only exited if len(X) < thresh.
Code update
I decided to add that change:
def F0_Estimator(stream: Collection[Any], epsilon: float, delta: float) -> float:
"""
Estimates the number of distinct elements in the input stream.
This function implements the CVM algorithm for the problem of
estimating the number of distinct elements in a stream of data.
The stream object must support an initial call to __len__
Parameters:
stream (Collection[Any]): The input stream as a collection of hashable
items.
epsilon (float): The desired relative error in the estimate. It must be in
the range (0, 1).
delta (float): The desired probability of the estimate being within the
relative error. It must be in the range (0, 1).
Returns:
float: An estimate of the number of distinct elements in the input stream.
"""
p = 1
X = set()
m = len(stream)
thresh = math.ceil(12 / (epsilon ** 2) * math.log(8 * m / delta))
for item in stream:
X.discard(item)
if random.random() < p:
X.add(item)
if len(X) == thresh:
while len(X) == thresh: # Force a change
X = {x_item for x_item in X
if random.random() < 0.5} # Random, so could do nothing
p /= 2
return len(X) / p
thresh
In the code above, the variable thresh, (threshhold), named from Algorithm 1, is used in the Quanta article to describe the maximum storage available to keep items from the stream that have been seen before. You must know the length of the stream - m, epsilon, and delta to calculate thresh.
If you were to have just the stream and thresh as the arguments you could return both the estimate of the number of distinct items in the stream as well as counting the number of total elements in the stream.
Epsilon could be calculated from the numbers we now know.
def F0_Estimator2(stream: Iterable[Any],
thresh: int,
) -> tuple[float, int]:
"""
Estimates the number of distinct elements in the input stream.
This function implements the CVM algorithm for the problem of
estimating the number of distinct elements in a stream of data.
The stream object does NOT have to support a call to __len__
Parameters:
stream (Iterable[Any]): The input stream as an iterable of hashable
items.
thresh (int): The max threshhold of stream items used in the estimation.py
Returns:
tuple[float, int]: An estimate of the number of distinct elements in the
input stream, and the count of the number of items in stream.
"""
p = 1
X = set()
m = 0 # Count of items in stream
for item in stream:
m += 1
X.discard(item)
if random.random() < p:
X.add(item)
if len(X) == thresh:
while len(X) == thresh: # Force a change
X = {x_item for x_item in X
if random.random() < 0.5} # Random, so could do nothing
p /= 2
return len(X) / p, m
def F0_epsilon(
thresh: int,
m: int,
delta: float=0.05, # 0.05 is 95%
) -> float:
"""
Calculate the relative error in the estimate from F0_Estimator2(...)
Parameters:
thresh (int): The thresh value used in the call TO F0_Estimator2.
m (int): The count of items in the stream FROM F0_Estimator2.
delta (float): The desired probability of the estimate being within the
relative error. It must be in the range (0, 1) and is usually 0.05
to 0.01, (95% to 99% certainty).
Returns:
float: The calculated relative error in the estimate
"""
return math.sqrt(12 / thresh * math.log(8 * m / delta))
Testing
def stream_gen(k: int=30_000, r: int=7_000) -> list[int]:
"Create a randomised list of k ints of up to r different values."
return random.choices(range(r), k=k)
def stream_stats(s: list[Any]) -> tuple[int, int]:
length, distinct = len(s), len(set(s))
return length, distinct
# %%
print("CVM ALGORITHM ESTIMATION OF NUMBER OF UNIQUE VALUES IN A STREAM")
stream_size = 2**18
reps = 5
target_uniques = 1
while target_uniques < stream_size:
the_stream = stream_gen(stream_size+1, target_uniques)
target_uniques *= 4
size, unique = stream_stats(the_stream)
print(f"\n Actual:\n {size = :_}, {unique = :_}\n Estimations:")
delta = 0.05
threshhold = 2
print(f" All runs using {delta = :.2f} and with estimate averaged from {reps} runs:")
while threshhold < size:
estimate, esize = F0_Estimator2(the_stream.copy(), threshhold)
estimate = sum([estimate] +
[F0_Estimator2(the_stream.copy(), threshhold)[0]
for _ in range(reps - 1)]) / reps
estimate = int(estimate + 0.5)
epsilon = F0_epsilon(threshhold, esize, delta)
print(f" With {threshhold = :7_} -> "
f"{estimate = :_}, +/-{epsilon*100:.0f}%"
+ (f" {esize = :_}" if esize != size else ""))
threshhold *= 8
The algorithm generates an estimate based on random sampling, so I run it multiple times for the same input and report the mean estimate from those runs.
Sample output
CVM ALGORITHM ESTIMATION OF NUMBER OF UNIQUE VALUES IN A STREAM
Actual:
size = 262_145, unique = 1
Estimations:
All runs using delta = 0.05 and with estimate averaged from 5 runs:
With threshhold = 2 -> estimate = 1, +/-1026%
With threshhold = 16 -> estimate = 1, +/-363%
With threshhold = 128 -> estimate = 1, +/-128%
With threshhold = 1_024 -> estimate = 1, +/-45%
With threshhold = 8_192 -> estimate = 1, +/-16%
With threshhold = 65_536 -> estimate = 1, +/-6%
Actual:
...
Actual:
size = 262_145, unique = 1_024
Estimations:
All runs using delta = 0.05 and with estimate averaged from 5 runs:
With threshhold = 2 -> estimate = 16_384, +/-1026%
With threshhold = 16 -> estimate = 768, +/-363%
With threshhold = 128 -> estimate = 1_101, +/-128%
With threshhold = 1_024 -> estimate = 1_018, +/-45%
With threshhold = 8_192 -> estimate = 1_024, +/-16%
With threshhold = 65_536 -> estimate = 1_024, +/-6%
Actual:
size = 262_145, unique = 4_096
Estimations:
All runs using delta = 0.05 and with estimate averaged from 5 runs:
With threshhold = 2 -> estimate = 13_107, +/-1026%
With threshhold = 16 -> estimate = 3_686, +/-363%
With threshhold = 128 -> estimate = 3_814, +/-128%
With threshhold = 1_024 -> estimate = 4_083, +/-45%
With threshhold = 8_192 -> estimate = 4_096, +/-16%
With threshhold = 65_536 -> estimate = 4_096, +/-6%
Actual:
size = 262_145, unique = 16_384
Estimations:
All runs using delta = 0.05 and with estimate averaged from 5 runs:
With threshhold = 2 -> estimate = 0, +/-1026%
With threshhold = 16 -> estimate = 15_155, +/-363%
With threshhold = 128 -> estimate = 16_179, +/-128%
With threshhold = 1_024 -> estimate = 16_986, +/-45%
With threshhold = 8_192 -> estimate = 16_211, +/-16%
With threshhold = 65_536 -> estimate = 16_384, +/-6%
Actual:
size = 262_145, unique = 64_347
Estimations:
All runs using delta = 0.05 and with estimate averaged from 5 runs:
With threshhold = 2 -> estimate = 26_214, +/-1026%
With threshhold = 16 -> estimate = 73_728, +/-363%
With threshhold = 128 -> estimate = 61_030, +/-128%
With threshhold = 1_024 -> estimate = 64_422, +/-45%
With threshhold = 8_192 -> estimate = 64_760, +/-16%
With threshhold = 65_536 -> estimate = 64_347, +/-6%
Looks good!
Wikipedia
Another day, and I decide to start writing this blog post. I searched again and found the Wikipedia article on what it called the Count-distinct problem.
Looking through it, It had this wrong description of the CVM algorithm:
![](data:image/png;base64,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)
The, (or a?), problem with the wikipedia entry is that it shows
![{\displaystyle p\leftarrow {\frac {p}{2}}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/43f7db7d6e21c7c59af32708d9e9483d00bc9dbc)
...within the while loop. You need an enclosing if |B| >= s for the while loop and the assignment to p outside the while loop, but inside this new if statement.
STOp PRESS! 02 May 2024: The Wikipedia entry was actually correct.
It's tough!
Both Quanta Magazine, and whoever added the algorithm to Wikipedia got the algorithm wrong.
I've written around two hundred tasks on site Rosettacode.org for over a decade. Others had to read my description and create code in their chosen language to implement those tasks. I have learnt from the feedback I got on talk pages to hone that craft, but details matter. Examples matter. Constructive feedback matters.
END.