Distance metrics (euclidean, cosine, manhattan) in SciPy - Time & Space Complexity
We want to know how the time to calculate distances grows as we compare more points.
How does the number of points affect the work done by distance calculations?
Analyze the time complexity of the following code snippet.
from scipy.spatial import distance
points = [[1, 2], [3, 4], [5, 6]]
# Calculate Euclidean distance between first two points
euclidean_dist = distance.euclidean(points[0], points[1])
# Calculate Cosine distance between first two points
cosine_dist = distance.cosine(points[0], points[1])
# Calculate Manhattan distance between first two points
manhattan_dist = distance.cityblock(points[0], points[1])
This code calculates three types of distances between two points in 2D space.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Summing differences across each dimension of the points.
- How many times: Once per dimension for each distance calculation.
As the number of dimensions grows, the work to compute distance grows linearly.
| Input Size (dimensions) | Approx. Operations |
|---|---|
| 10 | About 10 sums and calculations |
| 100 | About 100 sums and calculations |
| 1000 | About 1000 sums and calculations |
Pattern observation: Doubling dimensions roughly doubles the work needed.
Time Complexity: O(d)
This means the time to compute distance grows directly with the number of dimensions.
[X] Wrong: "Calculating distance between two points takes the same time no matter how many dimensions they have."
[OK] Correct: Each dimension adds more numbers to process, so more dimensions mean more work.
Understanding how distance calculations scale helps you explain efficiency when working with high-dimensional data.
"What if we calculate distances between many pairs of points instead of just one pair? How would the time complexity change?"
Practice
Solution
Step 1: Understand distance types
Euclidean distance is the direct straight-line distance between two points.Step 2: Compare with other distances
Cosine measures angle difference, Manhattan sums absolute differences, Jaccard measures set similarity.Final Answer:
Euclidean distance -> Option DQuick Check:
Straight-line distance = Euclidean distance [OK]
- Confusing cosine with Euclidean
- Thinking Manhattan is straight-line
- Mixing Jaccard with numeric distances
Solution
Step 1: Recall scipy import syntax
The correct import path for distance functions is scipy.spatial.distance.Step 2: Check each option
from scipy.spatial.distance import euclidean uses correct syntax: from scipy.spatial.distance import euclidean. Others are invalid or incorrect syntax.Final Answer:
from scipy.spatial.distance import euclidean -> Option AQuick Check:
Correct import path = from scipy.spatial.distance import euclidean [OK]
- Using wrong module path
- Incorrect import syntax
- Trying to import from scipy.distance
from scipy.spatial.distance import cosine v1 = [1, 0, 1] v2 = [0, 1, 0] result = cosine(v1, v2) print(round(result, 2))
Solution
Step 1: Calculate cosine similarity basics
Vectors v1 and v2 are orthogonal (no overlap), so cosine similarity is 0.Step 2: Calculate cosine distance
Cosine distance = 1 - cosine similarity = 1 - 0 = 1.0.Final Answer:
1.0 -> Option AQuick Check:
Orthogonal vectors cosine distance = 1.0 [OK]
- Confusing cosine similarity with distance
- Rounding errors
- Assuming zero distance for orthogonal vectors
from scipy.spatial.distance import manhattan a = [1, 2, 3] b = [4, 5] print(manhattan(a, b))
Solution
Step 1: Check input vector lengths
Vectors a and b have different lengths (3 and 2), which is invalid for distance calculation.Step 2: Validate function and import
Import and function name are correct; scipy.spatial.distance.manhattan is valid and accepts lists.Final Answer:
Lists a and b must be the same length -> Option CQuick Check:
Equal length vectors needed for distance [OK]
- Assuming different length lists work
- Confusing function name with cityblock
- Thinking lists are invalid inputs
Options:
A) Euclidean
B) Cosine
C) Manhattan
D) All equal
Solution
Step 1: Calculate Euclidean distance
Euclidean = sqrt((3-1)^2 + (4-1)^2 + (5-1)^2) = sqrt(4 + 9 + 16) = sqrt(29) ≈ 5.39.Step 2: Calculate Manhattan distance
Manhattan = |3-1| + |4-1| + |5-1| = 2 + 3 + 4 = 9.Step 3: Calculate Cosine distance
Cosine similarity = (3*1 + 4*1 + 5*1) / (sqrt(3^2+4^2+5^2)*sqrt(1^2+1^2+1^2)) = 12 / (7.07*1.73) ≈ 0.98; Cosine distance = 1 - 0.98 = 0.02.Final Answer:
Manhattan -> Option BQuick Check:
Manhattan distance > Euclidean > Cosine distance [OK]
- Assuming Euclidean is always largest
- Confusing cosine distance scale
- Ignoring absolute values in Manhattan
Ready to prove it?
Pass the test and this pattern moves unknown
