网站系统设计目标,成都网站建设 致尚,微信小程序游戏开发教程,家政服务网站开发的依据数据集在作业一异常检测异常检测就是发现与大部分对象不同的对象#xff0c;其实就是发现离群点。异常检测有时也称偏差检测。异常对象是相对罕见的。用数据集建立概率模型p ( x )#xff0c;如果新的测试数据在这个模型上小于某个阈值#xff0c;则说它极大可能为异常点算法…数据集在作业一异常检测异常检测就是发现与大部分对象不同的对象其实就是发现离群点。异常检测有时也称偏差检测。异常对象是相对罕见的。用数据集建立概率模型p ( x )如果新的测试数据在这个模型上小于某个阈值则说它极大可能为异常点算法流程1.求出均值与方差2.计算正态分布密度函数3.找出合适的阈值代码实现读取数据及可视化
import numpy as np
import matplotlib.pyplot as plt
import scipy.io as sio# 读取数据
datasio.loadmat(ex8data1.mat)
Xdata[X]
X_valdata[Xval]
y_valdata[yval]
# print(X.shape)(307, 2)# 可视化
# plt.scatter(X[:,0],X[:,1],markero,cy,edgecolorsg)
# plt.show()获取均值和方差
def estimate_gaussian(X,isCovariance):munp.mean(X,axis0)if isCovariance:sigma np.cov(X.T)else:sigmanp.var(X,axis0)return mu,sigma这里的方差有一个不同之处因为X有多个特征不能判断特征之间是否没有线性关系若没有则按照每列来计算各列的方差反之我们就要用协方差。协方差矩阵计算概率密度
def gaussian_prob(X,mu,sigma):pnp.zeros((X.shape[0],1))nlen(mu)if np.ndim(sigma) 1: # 返回sigma的维度是1sigma np.diag(sigma) # 将一维数组转化为方阵非对角线元素为0for i in range(X.shape[0]):# 计算公式中的指数部分-0.5*(x-μ)⊤Σ⁻¹(x-μ)exponent -0.5 * (X[i, :] - mu).T np.linalg.inv(sigma) (X[i, :] - mu)# 计算概率密度值并赋值给p[i]p[i] (2 * np.pi) ** (-n / 2) # 公式中的(2π)^(-n/2)p[i] * np.linalg.det(sigma) ** (-1 / 2) # 乘以|Σ|^(-1/2)p[i] * np.exp(exponent) # 乘以指数部分return ppgaussian_prob(X,mu,sigma)绘制梯度密度等高线
def plot_gaussian(X,means,sigma):xnp.arange(0,30,0.5)ynp.arange(0,30,0.5)xx,yynp.meshgrid(x,y)Zgaussian_prob(np.c_[xx.ravel(),yy.ravel()],means,sigma)zzZ.reshape(xx.shape)contour_levels [10 ** h for h in range(-20, 0, 3)]plt.contour(xx, yy, zz, contour_levels)#生成了 [1e-20, 1e-17, 1e-14, 1e-11, 1e-8, 1e-5, 1e-2] 这 7 个值# 表示只绘制密度等于这些值的等高线。plt.scatter(X[:, 0], X[:, 1], markerx, cb)plt.show()# plot_gaussian(X,mu,sigma)这里是通过取足够多的点并计算它们的概率密度从而实现等高线。找出最佳阈值
#4.阈值epsilonz自取
def selecteps(yval,p):bestEpsilon 0 # 最佳阈值初始化为0bestF1 0 # 最佳F1分数初始化为0# 生成1000个候选阈值均匀分布在p的最小值和最大值之间epsilons np.linspace(min(p), max(p), 1000)for e in epsilons:# 基于当前阈值e判断p e → 异常1否则正常0p_ p e# 计算混淆矩阵的四个指标tp np.sum((yval 1) (p_ 1)) # 真正例实际异常预测也异常fp np.sum((yval 0) (p_ 1)) # 假正例实际正常预测异常tn np.sum((yval 0) (p_ 0)) # 真负例实际正常预测正常fn np.sum((yval 1) (p_ 0)) # 假负例实际异常预测正常# 计算精确率Precision预测为异常的样本中实际异常的比例prec tp / (tp fp) if (tp fp) else 0 # 避免分母为0# 计算召回率Recall实际异常的样本中被正确预测的比例rec tp / (tp fn) if (tp fn) else 0 # 避免分母为0# 计算F1分数精确率和召回率的调和平均综合评价模型性能F1 (2 * prec * rec) / (prec rec) if (prec rec) else 0# 更新最佳阈值和F1分数if F1 bestF1:bestF1 F1bestEpsilon ereturn bestF1,bestEpsilonp_valgaussian_prob(X_val,mu,sigma)
bestF1,bestEpsilonselecteps(y_val,p_val)这里利用了混淆矩阵来更新最佳阈值。圈出异常点
# 圈出异常点
pgaussian_prob(X,mu,sigma)
anoms np.array([X[i] for i in range(X.shape[0]) if p[i] bestEpsilon])
plt.scatter(anoms[:,0], anoms[:,1], s100, markero, facecolorsnone, edgecolorsr, linewidths2)
plot_gaussian(X, mu, sigma)总结读取数据——获取均值与方差——用概率密度函数构建模型——找出最佳阈值——找出异常点。