quantization2 / zscore.py
chen459664's picture
Add files using upload-large-folder tool
1f57542 verified
import numpy as np
import json
def kurtosis_outlier_layers(kurtosis_values, threshold=3.0, method="subtract"):
"""
根据 Kurtosis 值列表,计算差分并用 z-score 检测异常层
参数:
kurtosis_values (list or np.ndarray): Kurtosis 值序列 (s1, s2, ..., sn)
threshold (float): z-score 阈值 (默认 3.0)
method (str): 差分方式
"subtract" -> si+1 - si
"divide" -> si+1 / si
返回:
z_scores (np.ndarray): 差分的 z-score
outlier_indices (list): 被判定为异常的层索引 (对应原始 Kurtosis 序列中的层号)
"""
values = np.array(kurtosis_values, dtype=float)
# Step 1: 差分
if method == "subtract":
diffs = np.diff(values) # s2-s1, s3-s2, ...
elif method == "divide":
diffs = values[1:] / values[:-1]
else:
raise ValueError("method must be 'subtract' or 'divide'")
# Step 2: 计算 z-score
mean = np.mean(diffs)
std = np.std(diffs, ddof=1) # 样本标准差
z_scores = abs((diffs - mean) / std)
results = [(i+1, z) for i, z in enumerate(z_scores)]
results.sort(key=lambda x: x[1], reverse=False)
print(results)
results = [i[0] for i in results]
return results
k_path = '/mnt/bn/life-mllm/users/cxr/quantization/lm-quant-toolkit/kurtosis_means/kurtosis_means-Llama-2-7b-hf.json'
with open(k_path, "r", encoding="utf-8") as f:
kurtosis_values = json.load(f)
kurtosis_outlier_layers(kurtosis_values)