ThermometerEncoder and LevelEncoder
These encoders handle ordinal and categorical data respectively.
ThermometerEncoder
Overview
| Property | Value |
|---|---|
| Input | Ordinal value (1, 2, 3, ...) |
| Output | Hypervector |
| Preserves | Order relationships |
| Best For | Rankings, ratings |
How It Works
Thermometer encoding accumulates similarity as values increase:
For levels 1-5 with base vectors [b₁, b₂, b₃, b₄, b₅]: - encode(1) = b₁ - encode(2) = bundle(b₁, b₂) - encode(3) = bundle(b₁, b₂, b₃) - encode(4) = bundle(b₁, b₂, b₃, b₄) - encode(5) = bundle(b₁, b₂, b₃, b₄, b₅)
Similarity Pattern
Adjacent values share most components:
sim(1, 2) = 0.71 (share 1 of 2)
sim(2, 3) = 0.82 (share 2 of 3)
sim(1, 5) = 0.45 (share 1 of 5)
Code Example
from holovec import VSA
from holovec.encoders import ThermometerEncoder
model = VSA.create('FHRR', dim=2048)
# Create thermometer encoder for ratings 1-5
encoder = ThermometerEncoder(model, levels=5)
# Encode ratings
r1 = encoder.encode(1)
r2 = encoder.encode(2)
r3 = encoder.encode(3)
r5 = encoder.encode(5)
# Adjacent ratings more similar
print(model.similarity(r1, r2)) # ~0.71
print(model.similarity(r2, r3)) # ~0.82
print(model.similarity(r1, r5)) # ~0.45
Use Cases
- Star ratings (1-5 stars)
- Priority levels (low, medium, high)
- Education levels
- Size categories (S, M, L, XL)
LevelEncoder
Overview
| Property | Value |
|---|---|
| Input | Categorical label |
| Output | Hypervector |
| Preserves | Category identity |
| Best For | Discrete categories |
How It Works
Each level gets an independent random vector:
- encode("cat") = random₁
- encode("dog") = random₂
- encode("bird") = random₃
All categories are approximately orthogonal.
Similarity Pattern
sim("cat", "cat") = 1.0
sim("cat", "dog") ≈ 0.0
sim("dog", "bird") ≈ 0.0
Code Example
from holovec import VSA
from holovec.encoders import LevelEncoder
model = VSA.create('FHRR', dim=2048)
# Create level encoder with categories
categories = ["red", "green", "blue", "yellow"]
encoder = LevelEncoder(model, levels=categories)
# Encode categories
red = encoder.encode("red")
green = encoder.encode("green")
red2 = encoder.encode("red")
# Same category = identical
print(model.similarity(red, red2)) # 1.0
# Different categories = orthogonal
print(model.similarity(red, green)) # ~0.0
Use Cases
- Color categories
- Species classification
- Country codes
- Product categories
Choosing Between Them
| Scenario | Use |
|---|---|
| Values have natural order | ThermometerEncoder |
| Categories are unrelated | LevelEncoder |
| Rankings (1st, 2nd, 3rd) | ThermometerEncoder |
| Labels (A, B, C, D) | LevelEncoder |
Combined Example
# Product encoding with both types
model = VSA.create('FHRR', dim=2048)
# Ordinal: star rating
rating_enc = ThermometerEncoder(model, levels=5)
# Categorical: product category
category_enc = LevelEncoder(model, levels=["electronics", "clothing", "food"])
# Role vectors
RATING = model.random(seed=1)
CATEGORY = model.random(seed=2)
def encode_product(rating, category):
return model.bundle([
model.bind(RATING, rating_enc.encode(rating)),
model.bind(CATEGORY, category_enc.encode(category))
])
# Similar ratings, same category → similar
phone_5star = encode_product(5, "electronics")
phone_4star = encode_product(4, "electronics")
shirt_5star = encode_product(5, "clothing")
print(model.similarity(phone_5star, phone_4star)) # High (same cat, close rating)
print(model.similarity(phone_5star, shirt_5star)) # Moderate (diff cat, same rating)
Comparison
| Property | Thermometer | Level |
|---|---|---|
| Similarity structure | Gradual | Binary |
| Order preserved | Yes | No |
| Interpolation | Natural | Not applicable |
| Memory per level | Cumulative | Independent |
References
- Kanerva, P. (2009). Hyperdimensional Computing
See Also
- Encoders Overview — All encoders
- Encoder-FractionalPower — For continuous values