U-Statistics-python u-stats
U-statistics are fundamental tools in statistics, probability theory, theoretical computer science, economics, statistical physics, and machine learning. Named after Wassily Hoeffding, U-statistics provide unbiased estimators for population parameters and form the foundation for many statistical tests and methods. However, computing U-statistics can be computationally demanding, especially for high-order cases where the number of combinations grows exponentially.
This package provides a high-performance, tensor-based implementation for computing U-statistics and V-statistics with significant computational advantages:
- Leverages the underlying combinatorial structure of kernel functions to significantly reduce computational complexity in many cases
- Utilizes optimized einsum engines—
numpy.einsumandtorch.einsum—to enable efficient computation on both CPU and GPU
Table of Contents
1. Installation
Install the package from PyPI:
pip install u-stats
For development installation:
git clone https://github.com/Amedar-Asterisk/U-Statistics-python.git
cd U-Statistics-python
pip install -e .
2. Requirements
Required Dependencies
- Python 3.11+
- NumPy >= 1.20.0
- opt_einsum >= 3.3.0
Optional Dependencies
- torch >= 1.9.0: GPU acceleration and parallel CPU computation
3. Example Usage
3.1 Selection of Backend
The package supports two computation backends for different performance needs:
from u_stats import set_backend, get_backend
# Set backend to NumPy (default)
set_backend("numpy") # CPU computation, deterministic results
# Set backend to PyTorch (optional)
set_backend("torch") # GPU acceleration and parallel CPU computation
# Check current backend
current_backend = get_backend()
print(f"Current backend: {current_backend}")
3.2 Computing U-statistics
ustat is the main function for computing U-statistics.
Here we take a 7th-order U-statistic with kernel function
$$ h(x_1,x_2,\dots,x_7) = h_1(x_1, x_2) h_2(x_2, x_3) \dots h_6(x_6, x_7) $$
as an example. For samples $X = (X_1, \dots, X_n)$, the U-statistic takes the form
$$ U = \frac{1}{n(n-1)\cdots (n-6)} \sum_{(i_1,\dots,i_7) \in P_7}h_1(X_{i_1},X_{i_2})\cdots h_6(X_{i_6},X_{i_7}) $$
where $P_7$ denotes all 7-tuples of distinct indices.
3.2.1 Tensor Assembly
We assume that the kernel function values on samples $X$ have been precomputed and assembled into matrices $H_1, H_2, \dots, H_6 \in \mathbb{R}^{n \times n}$:
$$ H_k[i,j] = h_k(X_i, X_j) $$
3.2.2 Expression Formats
The expression defines how kernel matrices are connected in the computation. We take this U-statistic as an example to explain how to construct expression.
To express the structure of the kernel function $h(x_1, x_2, \dots, x_7) = h_1(x_1, x_2) \cdot h_2(x_2, x_3) \cdots h_{6}(x_{6}, x_7)$, we assign a unique index to each distinct variable $x_1, x_2, \dots, x_7$. For each factor $h_k(x_{k}, x_{k+1})$, we collect the indices of the variables it depends on into a pair. The sequence of pairs is then ordered according to the order of the factors in the product.
We can use the following notation to represent this structure:
Einstein Summation Notation:
expression = "ab,bc,cd,de,ef,fg->"
Nested List Notation:
expression = [[1,2],[2,3],[3,4],[4,5],[5,6],[6,7]]
Format Explanation:
- In Einstein notation: each letter represents an index, each string like
"ab"represents a factor of the kernel - In list notation: each sub-list
[i,j]represents a factor of the kernel Both formats are equivalent and specify the same computation pattern in our package
3.2.3 Complete Example
from u_stats import ustat, set_backend
import numpy as np
# Choose computation backend
set_backend("torch") # Use torch if available
# The default is numpy
# Set number of samples
n = 100
# Create precomputed kernel matrices
# In practice, these would be computed from your actual data
H1 = np.random.rand(n, n)
H2 = np.random.rand(n, n)
H3 = np.random.rand(n, n)
H4 = np.random.rand(n, n)
H5 = np.random.rand(n, n)
H6 = np.random.rand(n, n)
tensors = [H1, H2, H3, H4, H5, H6]
expression = "ab,bc,cd,de,ef,fg->"
# Compute the U-statistic
result = ustat(tensors=tensors, expression=expression, average=True)
print(f"7th-order U-statistic: {result}")
# You can also compute the unaveraged sum
sum_result = ustat(tensors=tensors, expression=expression, average=False)
print(f"Sum (before averaging): {sum_result}")
4. API Reference
4.1 Main Functions
ustat(tensors, expression, average=True, optimize="greedy", **kwargs)
Compute U-statistics from input tensors.
Parameters:
tensors(List[np.ndarray]): List of input tensors (numpy arrays or torch tensors)expression(str | List | Tuple): Tensor contraction expression- String format: Einstein summation notation (e.g., "ij,jk->ik")
- List format: Nested indices (e.g., [[1,2],[2,3]])
average(bool, default=True): Whether to compute average (True) or sum (False)optimize(str, default="greedy"): Optimization strategy for tensor contraction- "greedy": Fast heuristic optimization
- "optimal": Exhaustive search for optimal contraction order
- "dp": Dynamic programming approach
**kwargs: Additional keyword arguments passed toopt_einsum.contract
Returns:
float: Computed U-statistic value
Example:
result = ustat([H1, H2], "ij,jk->", average=True, optimize="optimal")
vstat(tensors, expression, average=True, optimize="greedy", **kwargs)
Compute V-statistics from input tensors.
Parameters: Same as ustat
Returns: Computed V-statistic value
u_stats_loop(tensors, expression)
Reference implementation using explicit loops (for validation and small computations).
Note: This class is primarily for testing and educational purposes. Use ustats for production code.
set_backend(backend_name)
Set the tensor computation backend.
Parameters:
backend_name(str): Backend identifier"numpy": Use NumPy backend"torch": Use PyTorch backend
Example:
set_backend("torch") # Switch to PyTorch backend
get_backend()
Get the current tensor computation backend.
Returns:
str: Current backend name ("numpy" or "torch")
4.2 Classes
UStats(expression)
Class-based interface for U-statistics computation with advanced features.
Parameters:
expression: Tensor contraction expression (same format as function interface)
Methods:
compute(tensors, average=True, **kwargs): Compute U-statisticcomplexity_analysis(): Analyze computational complexityget_contraction_path(): Get optimized contraction path
Example:
ustats_obj = UStats("ij,jk->")
result = ustats_obj.compute([H1, H2], average=True)
complexity = ustats_obj.complexity_analysis()
VStats(expression)
Class-based interface for V-statistics computation with advanced features.
Parameters and Methods: Same as UStats
5. Changelog
See CHANGELOG.md for detailed version history and changes.
6. License
This project is licensed under the MIT License – see the LICENSE file for details.
7. Contributing
We welcome contributions! Here's how you can help:
Reporting Issues
- Use the GitHub issue tracker
- Include minimal reproducible examples
- Specify your environment (Python version, OS, backend)
Development Setup
# Clone the repository
git clone https://github.com/Amedar-Asterisk/U-Statistics-python.git
cd U-Statistics-python
# Install in development mode
pip install -e ".[test]"
Pull Requests
- Fork the repository and create a feature branch
- Add tests for new functionality
- Ensure all tests pass and type checking succeeds
- Update documentation as needed
- Follow the existing code style
For questions or discussions, feel free to open an issue or reach out to the maintainers.
Metadata
Release files for u-stats 0.7.6
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| u_stats-0.7.6.tar.gz | 35.3 kB | Without provenance | Details for u_stats-0.7.6.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| u_stats-0.7.6-py3-none-any.whl | Python 3 | none | any | Details for u_stats-0.7.6-py3-none-any.whl |
Total release size: 71.8 kB
Release files / u_stats-0.7.6.tar.gz
| Download URL | u_stats-0.7.6.tar.gz |
|---|---|
| Size | 35.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f10deabb81f1c47072a2a37c6f5f919c4b7b0331955f40013a5f6142007e168e
|
|
BLAKE2b-256 checksum How to use checksums |
1dfcd90a316598de8778367a89b4be20f67f04334f6b20d9b63acf4b3d8ef359
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.12.8
|
Release files / u_stats-0.7.6-py3-none-any.whl
| Download URL | u_stats-0.7.6-py3-none-any.whl |
|---|---|
| Size | 36.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
11d31033acfbeecd5eb1e13966575524a04b6f3d5ea7cbedefe4bc599de0ce15
|
|
BLAKE2b-256 checksum How to use checksums |
13ff2d437f49b7a5a124fe8fb205dbeeed6cb888e58eead6321dc0f68a8d7428
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.12.8
|
Security for u-stats 0.7.6
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.