Python基础——异常处理,一文秒懂

异常

常见异常

类名描述
Excepion所有异常的基类
AttributeError特性引用或者赋值失败时出现
IOError试图打开不存在的文件时出现
IndexError在使用序列中不存在索引时出现
KeyError在使用映射中不存在的键时出现
NameError找不到名字(变量)时出现
SyntaError在代码错误时出现
TypeError在内建操作或者函数应用于错误类型时出现
ValueError在内建操作或者函数应用于正确类型的对象,但是该对象使用不合适的值时出现
ZeroDivisionError在除法或者模操作的第二个参数为零时出现

处理异常,捕获异常

try:被检测的语句

​ pass :空语句只占位

except :处理异常的语句

“try”子句块中编写可能出现异常的语句,“ except ”子句中的语句块处理处理异常,如果“ try ”中语句出现异常并成功被“ except ”中语句成功处理,就不会因报错使程序终止,具体效果如下:

try:
     num1 = float(input("请输入第一个数字:"))
     num2 = float(input("请输入第二个数字:"))
     print(num1,"/",num2,"=",num1/num2)
except ZeroDivisionError:
    print("输入有误,分母不能为零!")
except ValueError:
    print("输入类型有误")
运行结果1、(出现分母为零的异常)
请输入第一个数字:2
请输入第二个数字:0
输入有误,分母不能为零!
运行结果2、(出现输入类型错误)
请输入第一个数字:w
输入类型有误
运行结果3、(无异常)
请输入第一个数字:9
请输入第二个数字:7
9.0 / 7.0 = 1.2857142857142858


    

获取异常信息

精确捕获需要把子类异常放在父类异常之前,在不知道具体的异常信息是,可以使用所有异常的基类“ Excepion ”去处理异常使用“ as ”去获取具体的异常信息,具体操作如下

try:
    list_data= [1,2,3,4]
    print(list_data [8])
except Exception as e :
    print(e)

输出结果:
list index out of range#列表索引超出范围


try:
   1/0
except Exception as e :
    print(e )
输出结果:
division by zero

raise :主动抛出一个异常

try:
  raise ZeroDivisionError("信息")
except Exception as e :
    print(e )
输出结果:
信息

finally 无论有没有异常都会执行,一般都是一些关闭或者清理的操作

else在finally前面except后面,没有异常就会执行else的语句

try:
     num1 = float(input("请输入第一个数字:"))
     num2 = float(input("请输入第二个数字:"))

except ZeroDivisionError:
    print("输入有误,分母不能为零!")
except ValueError:
    print("输入类型有误")
else: print(num1,"/",num2,"=",num1/num2)
finally:print("程序结束")
运行结果1、:(无异常)
请输入第一个数字:7
请输入第二个数字:9
7.0 / 9.0 = 0.7777777777777778
程序结束
运行结果2、:(有异常)
请输入第一个数字:w
输入类型有误
程序结束
### 关于八种异常检测算法的详细解释 #### 1. 监督异常检测 (Supervised Anomaly Detection) 监督异常检测依赖于已标注的据集来区分正常和异常情况。通过这些标签,可以构建分类模型以预测新据点的状态。常用的算法有逻辑回归、支持向量机和支持向量机变体如C-SVM、ν-SVM等,还有决策树及其集成版本随机森林。 ```python from sklearn.svm import SVC clf = SVC() clf.fit(X_train, y_train) predictions = clf.predict(X_test) ``` 这种类型的检测适用于拥有充足标记样本的情况[^2]。 #### 2. 无监督异常检测 (Unsupervised Anomaly Detection) 当缺乏足够的带标签据时,则可采用无监督的方法来进行异常探测。这类方法利用了据内在结构特性而不需额外的信息指导。典型代表包括k-means聚类、DBSCAN密度基空间聚类以及孤立森林(Isolation Forests),后者特别适合处理高维稀疏据。 ```python from sklearn.ensemble import IsolationForest iso_forest = IsolationForest(contamination=0.1) y_pred = iso_forest.fit_predict(X) ``` 此方式能够有效应对未知类别或难以获取标签的情形。 #### 3. 半监督异常检测 (Semi-Supervised Anomaly Detection) 介于两者之间的是半监督模式,在这里仅有部分实例被赋予真值指示其状态;其余大部分保持未定。此类场景下常见的策略涉及自编码器(autoencoders)与生成对抗网络(GANs)相结合的形式——即所谓的“深度置信网”。 ```python import tensorflow as tf autoencoder = tf.keras.models.Sequential([ ... ]) history = autoencoder.fit(x_train_noisy, x_train, epochs=epochs, batch_size=batch_size, shuffle=True, validation_data=(x_val_noisy, x_val)) ``` 这种方法充分利用有限量的手动标注资源提升整体效果。 #### 4. 在线异常检测 (Online Anomaly Detection) 在线环境下的挑战在于必须即时响应不断流入的新观测值,并及时调整内部参适应变化趋势。为此设计了一系列增量更新机制,比如Hoeffding Trees(霍夫丁树)、Adaptive Resonance Theory Networks(ART神经网络),它们能够在不影响现有知识的前提下逐步纳入最新信息源。 ```python from skmultiflow.trees.hoeffding_tree import HoeffdingTreeClassifier ht = HoeffdingTreeClassifier() for i in range(n_samples): ht.partial_fit([X[i]], [y[i]]) ``` 该方案非常适合动态背景下连续监控任务的需求。 #### 5. 基于距离/相似度测量的距离型异常检测(Distance-based Anomaly Detection) 基于欧几里得或其他形式的距离测度计算个体间差异程度作为判断依据之一。LOF局部离群因子(Local Outlier Factor)便是其中一员,它衡量目标对象相对于周围邻居位置偏离平均状况的程度。 ```python from pyod.models.lof import LOF detector = LOF() detector.fit(X) scores_pred = detector.decision_function(X_test) ``` 这种方式直观易且易于实现,但在维度灾难面前可能遭遇瓶颈[^1]。 #### 6. 统计学基础的概率型异常检测(Statistical-based Anomaly Detection) 运用经典统计理论框架内建立假设检验流程,例如格鲁布斯准则(Grubbs' test)用于单变量集合中寻找极端偏差成员。对于多元情形则存在马氏距离(Mahalanobis Distance)这样的工具可供选用。 ```python from scipy.stats import chi2 def mahalanobis(x=None, data=None, cov=None): """Compute the Mahalanobis distance.""" x_minus_mu = x - np.mean(data) inv_covmat = sp.linalg.inv(np.cov(data.T)) left_term = np.dot(x_minus_mu, inv_covmat) mahal_dist = np.dot(left_term, x_minus_mu.T) return math.sqrt(mahal_dist) ``` 上述过程严格遵循理推导路径确保结论可靠性。 #### 7. 时间序列特定的时间序列异常检测(Time Series-specific Anomaly Detection) 考虑到顺序排列特点而专门定制化的解决方案,像ARIMA差分整合移动平均自回归模型(Autoregressive Integrated Moving Average Model)就专攻于此领域。近年来兴起的一些研究还探索了如何借助LSTM长短记忆单元(Long Short-Term Memory Units)捕捉长期依赖关系从而改善预报精度。 ```python model = Sequential() model.add(LSTM(units=50, return_sequences=True, input_shape=(X_train.shape[1],1))) model.compile(optimizer='adam', loss='mean_squared_error') model.fit(X_train, y_train, epochs=1, batch_size=1, verbose=2) ``` 这有助于更精准地把握随时间演变规律并提前预警潜在风险事件的发生可能性[^4]。 #### 8. 对抗性训练增强的异常检测(Adversarial Training-enhanced Anomaly Detection) 引入GAN架构理念创造一对相互对立又彼此促进的学习实体:一个是负责生成看似真实的伪造品的生成器(generator),另一个则是试图分辨真假混杂输入流判别器(discriminator). USAD就是这样一种创新性的尝试,旨在克服传统单一视角局限性的同时提高泛化能力。 ```python class Generator(tf.keras.Model): def __init__(self): super().__init__() ... class Discriminator(tf.keras.Model): def __init__(self): super().__init__() ... generator_optimizer = tf.keras.optimizers.Adam(1e-4) discriminator_optimizer = tf.keras.optimizers.Adam(1e-4) checkpoint_prefix = os.path.join(checkpoint_dir, "ckpt") checkpoint = tf.train.Checkpoint(generator_optimizer=generator_optimizer, discriminator_optimizer=discriminator_optimizer, generator=generator, discriminator=discriminator) ``` 如此这般既强化了系统的稳健性和灵活性,也为后续改进留下了广阔的空间。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值