import numpy as np
import matplotlib.pyplot as plt
from utils import *
%matplotlib inline
plt.rcParams["font.family"] = ["sans-serif","SimHei"]
plt.rcParams['axes.unicode_minus'] = False
X_train, X_val, y_val = load_data()
print('X_train的形状是:', X_train.shape)
print('X_val的形状是:', X_val.shape)
print('y_val的形状是: ', y_val.shape)
plt.scatter(X_train[:, 0], X_train[:, 1], marker='x', c='b')
plt.title("第一个数据集")
plt.ylabel('吞吐量 (mb/s)')
plt.xlabel('延迟 (ms)')
plt.axis([0, 30, 0, 30])
plt.show()
def estimate_gaussian(X):
"""
计算数据集中所有特征的均值和方差
参数:
X (ndarray): (m, n) 数据矩阵,m个样本,n个特征
返回:
mu (ndarray): (n,) 每个特征的均值
var (ndarray): (n,) 每个特征的方差
"""
m, n = X.shape
mu = np.mean(X, axis=0)
var = np.var(X, axis=0)
return mu, var
mu, var = estimate_gaussian(X_train)
print("每个特征的均值:", mu)
print("每个特征的方差:", var)
from public_tests import estimate_gaussian_test
estimate_gaussian_test(estimate_gaussian)
p = multivariate_gaussian(X_train, mu, var)
visualize_fit(X_train, mu, var)
def select_threshold(y_val, p_val):
"""
基于验证集的概率结果(p_val)和真实标签(y_val)找到最佳异常检测阈值
参数:
y_val (ndarray): 验证集的真实标签(1表示异常,0表示正常)
p_val (ndarray): 验证集样本的概率密度
返回:
epsilon (float): 选择的阈值
F1 (float): 使用该阈值得到的F1分数
"""
best_epsilon = 0
best_F1 = 0
F1 = 0
step_size = (max(p_val) - min(p_val)) / 1000
for epsilon in np.arange(min(p_val), max(p_val), step_size):
predictions = (p_val < epsilon).astype(int)
TP = np.sum((predictions == 1) & (y_val == 1))
FP = np.sum((predictions == 1) & (y_val == 0))
FN = np.sum((predictions == 0) & (y_val == 1))
precision = TP / (TP + FP) if (TP + FP) > 0 else 0
recall = TP / (TP + FN) if (TP + FN) > 0 else 0
F1 = 2 * (precision * recall) / (precision + recall) if (precision + recall) > 0 else 0
if F1 > best_F1:
best_F1 = F1
best_epsilon = epsilon
return best_epsilon, best_F1
p_val = multivariate_gaussian(X_val, mu, var)
epsilon, F1 = select_threshold(y_val, p_val)
print('通过交叉验证找到的最佳阈值: %e' % epsilon)
print('交叉验证集上的最佳F1分数: %f' % F1)
from public_tests import select_threshold_test
select_threshold_test(select_threshold)
outliers = p < epsilon
visualize_fit(X_train, mu, var)
plt.plot(X_train[outliers, 0], X_train[outliers, 1], 'ro',
markersize=10, markerfacecolor='none', markeredgewidth=2)
X_train_high, X_val_high, y_val_high = load_data_multi()
print('X_train_high的形状是:', X_train_high.shape)
print('X_val_high的形状是:', X_val_high.shape)
print('y_val_high的形状是: ', y_val_high.shape)
mu_high, var_high = estimate_gaussian(X_train_high)
p_high = multivariate_gaussian(X_train_high, mu_high, var_high)
p_val_high = multivariate_gaussian(X_val_high, mu_high, var_high)
epsilon_high, F1_high = select_threshold(y_val_high, p_val_high)
print('通过交叉验证找到的最佳阈值: %e' % epsilon_high)
print('交叉验证集上的最佳F1分数: %f' % F1_high)
print('发现的异常点数量: %d' % sum(p_high < epsilon_high))