Local Outlier Factor: Density Deviation
The Local Outlier Factor (LOF) is a density-based method for detecting outliers by comparing the local density of a data point to the densities of its neighbors. Unlike global approaches, LOF focuses on how isolated a point is with respect to its local neighborhood.
LOF builds on two key concepts:
- Reachability distance;
- Local density deviation.
To understand LOF, start with a set of data points in a feature space. For each point, you identify its k nearest neighbors.
The reachability distance between a point A and its neighbor B is defined as the maximum of:
- The distance between
AandB; - The distance from
Bto itskth nearest neighbor.
This definition ensures that points inside dense clusters have similar reachability distances, while points in sparse regions stand out.
After computing reachability distances, calculate the local reachability density for each point. This is the inverse of the average reachability distance from the point to its neighbors.
The LOF score for a point is the ratio of the average local reachability density of its neighbors to its own local reachability density:
- A score close to
1means the point has similar density to its neighbors; - A score much greater than
1means the point is in a sparser region, making it a potential outlier.
The intuition behind LOF is that outliers are not just points that are far from others, but points that have substantially lower local density compared to their neighbors. By comparing each point's local density to those around it, LOF can flag subtle anomalies that global methods might miss—such as points on the edge of a cluster or in a sparse pocket of the data space.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546import numpy as np import matplotlib.pyplot as plt from sklearn.neighbors import NearestNeighbors # Generate a small set of 2D points X = np.array([ [1, 1], [1.2, 1.1], [0.8, 1.0], [1.1, 0.9], [5, 5] ]) k = 2 # Number of neighbors # Fit NearestNeighbors model nbrs = NearestNeighbors(n_neighbors=k+1).fit(X) distances, indices = nbrs.kneighbors(X) # Compute reachability distances reachability_distances = [] for i, neighbors in enumerate(indices): point_reach_dists = [] for neighbor_idx in neighbors[1:]: # Exclude itself d = np.linalg.norm(X[i] - X[neighbor_idx]) k_dist_neighbor = distances[neighbor_idx][k] reach_dist = max(d, k_dist_neighbor) point_reach_dists.append(reach_dist) reachability_distances.append(point_reach_dists) # Visualize points and reachability distances plt.figure(figsize=(6, 6)) plt.scatter(X[:, 0], X[:, 1], c='blue', label='Points') for i, (x, y) in enumerate(X): plt.text(x + 0.05, y + 0.05, f"P{i}", fontsize=9) for j, neighbor_idx in enumerate(indices[i][1:]): nx, ny = X[neighbor_idx] plt.plot([x, nx], [y, ny], 'k--', linewidth=0.8) mid_x, mid_y = (x + nx) / 2, (y + ny) / 2 plt.text(mid_x, mid_y, f"{reachability_distances[i][j]:.2f}", color='red', fontsize=8) plt.legend() plt.title("Reachability Distances (k=2)") plt.xlabel("X1") plt.ylabel("X2") plt.grid(True) plt.show()
Tak for dine kommentarer!
Spørg AI
Spørg AI
Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat
Awesome!
Completion rate improved to 4.55
Local Outlier Factor: Density Deviation
Stryg for at vise menuen
The Local Outlier Factor (LOF) is a density-based method for detecting outliers by comparing the local density of a data point to the densities of its neighbors. Unlike global approaches, LOF focuses on how isolated a point is with respect to its local neighborhood.
LOF builds on two key concepts:
- Reachability distance;
- Local density deviation.
To understand LOF, start with a set of data points in a feature space. For each point, you identify its k nearest neighbors.
The reachability distance between a point A and its neighbor B is defined as the maximum of:
- The distance between
AandB; - The distance from
Bto itskth nearest neighbor.
This definition ensures that points inside dense clusters have similar reachability distances, while points in sparse regions stand out.
After computing reachability distances, calculate the local reachability density for each point. This is the inverse of the average reachability distance from the point to its neighbors.
The LOF score for a point is the ratio of the average local reachability density of its neighbors to its own local reachability density:
- A score close to
1means the point has similar density to its neighbors; - A score much greater than
1means the point is in a sparser region, making it a potential outlier.
The intuition behind LOF is that outliers are not just points that are far from others, but points that have substantially lower local density compared to their neighbors. By comparing each point's local density to those around it, LOF can flag subtle anomalies that global methods might miss—such as points on the edge of a cluster or in a sparse pocket of the data space.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546import numpy as np import matplotlib.pyplot as plt from sklearn.neighbors import NearestNeighbors # Generate a small set of 2D points X = np.array([ [1, 1], [1.2, 1.1], [0.8, 1.0], [1.1, 0.9], [5, 5] ]) k = 2 # Number of neighbors # Fit NearestNeighbors model nbrs = NearestNeighbors(n_neighbors=k+1).fit(X) distances, indices = nbrs.kneighbors(X) # Compute reachability distances reachability_distances = [] for i, neighbors in enumerate(indices): point_reach_dists = [] for neighbor_idx in neighbors[1:]: # Exclude itself d = np.linalg.norm(X[i] - X[neighbor_idx]) k_dist_neighbor = distances[neighbor_idx][k] reach_dist = max(d, k_dist_neighbor) point_reach_dists.append(reach_dist) reachability_distances.append(point_reach_dists) # Visualize points and reachability distances plt.figure(figsize=(6, 6)) plt.scatter(X[:, 0], X[:, 1], c='blue', label='Points') for i, (x, y) in enumerate(X): plt.text(x + 0.05, y + 0.05, f"P{i}", fontsize=9) for j, neighbor_idx in enumerate(indices[i][1:]): nx, ny = X[neighbor_idx] plt.plot([x, nx], [y, ny], 'k--', linewidth=0.8) mid_x, mid_y = (x + nx) / 2, (y + ny) / 2 plt.text(mid_x, mid_y, f"{reachability_distances[i][j]:.2f}", color='red', fontsize=8) plt.legend() plt.title("Reachability Distances (k=2)") plt.xlabel("X1") plt.ylabel("X2") plt.grid(True) plt.show()
Tak for dine kommentarer!