IT评测·应用市场-qidao123.com

标题: 【大数据】关于呆板学习----------规则学习 [打印本页]

作者: 络腮胡菲菲    时间: 2025-1-24 12:22
标题: 【大数据】关于呆板学习----------规则学习
一、基本概念

   注:本博文所含流程图引用知乎博主 deephub
  1. 规则学习


二、序贯覆盖

1. 基本头脑


一、示例配景


二、具体内容


三、最终规则


   经过两轮之后产生单条规则:好瓜 ←(色泽 = 乌黑)∧(根蒂 = 蜷缩),即当瓜的色泽为乌黑且根蒂蜷缩时,判断为好瓜。
  四、相干知识点

   
  2. 代码示例

  1. def sequential_cover(X, y, rule_generator):
  2.     rules = []
  3.     covered = set()
  4.     while True:
  5.         rule, performance = rule_generator(X, y, covered)
  6.         if rule is None:  # 无法生成更优规则
  7.             break
  8.         rules.append(rule)
  9.         covered.update(get_covered_instances(rule, X))  # 获取该规则覆盖的实例
  10.         if performance < threshold:  # 达到性能阈值
  11.             break
  12.     return rules
  13. def rule_generator(X, y, covered):
  14.     best_rule = None
  15.     best_performance = 0
  16.     for feature in features:
  17.         for threshold in thresholds:
  18.             rule = generate_rule(feature, threshold)  # 生成可能的规则
  19.             performance = evaluate_rule(rule, X, y, covered)  # 评估规则性能
  20.             if performance > best_performance:
  21.                 best_rule = rule
  22.                 best_performance = performance
  23.     return best_rule, best_performance
  24. def generate_rule(feature, threshold):
  25.     # 生成具体的 if-then 规则
  26.     rule = {'feature': feature, 'threshold': threshold}
  27.     return rule
  28. def evaluate_rule(rule, X, y, covered):
  29.     correct = 0
  30.     total = 0
  31.     for i, x in enumerate(X):
  32.         if i in covered:  # 跳过已覆盖的实例
  33.             continue
  34.         if satisfies_rule(x, rule):  # 满足规则
  35.             total += 1
  36.             if y[i] == positive_class:  # 假设 positive_class 是正类
  37.                 correct += 1
  38.     if total == 0:
  39.         return 0
  40.     return correct / total
  41. def satisfies_rule(x, rule):
  42.     # 判断实例 x 是否满足规则
  43.     if x[rule['feature']] > rule['threshold']:
  44.         return True
  45.     return False
  46. def get_covered_instances(rule, X):
  47.     covered = []
  48.     for i, x in enumerate(X):
  49.         if satisfies_rule(x, rule):
  50.             covered.append(i)
  51.     return covered
复制代码
三、剪枝优化

1. 基本概念

   
  一、左侧未剪枝的神经网络布局


二、右侧剪枝后的神经网络布局


三、相干知识点





一、Classic(经典流程)

二、Lottery Ticket(彩票假说流程)

三、LR-Rewinding(另一种回退再训练流程)

四、相干知识点




2. 错误率剪枝示例

  1. def prune_rule(rule, X, y):
  2.     original_performance = evaluate_rule(rule, X, y, set())
  3.     for condition in rule.conditions:
  4.         pruned_rule = rule.copy()
  5.         pruned_rule.conditions.remove(condition)
  6.         pruned_performance = evaluate_rule(pruned_rule, X, y, set())
  7.         if pruned_performance >= original_performance:
  8.             rule = pruned_rule
  9.     return rule
  10. class Rule:
  11.     def __init__(self):
  12.         self.conditions = []
  13. def evaluate_rule(rule, X, y, covered):
  14.     correct = 0
  15.     total = 0
  16.     for i, x in enumerate(X):
  17.         if i in covered:
  18.             continue
  19.         if satisfies_rule(x, rule):
  20.             total += 1
  21.             if y[i] == positive_class:
  22.                 correct += 1
  23.     if total == 0:
  24.         return 0
  25.     return correct / total
  26. def satisfies_rule(x, rule):
  27.     for condition in rule.conditions:
  28.         if not check_condition(x, condition):
  29.             return False
  30.     return True
  31. def check_condition(x, condition):
  32.     feature, threshold = condition
  33.     if x[feature] > threshold:
  34.         return True
  35.     return False
复制代码
四、一阶规则学习

1. 基本概念

   
  2. 代码示例(利用 ILP 库,如 Aleph)

  1. # 首先需要安装 Aleph 库
  2. # 以下是一个简单的使用示例,假设已有背景知识和正、反例数据文件
  3. aleph -F learn_file
复制代码

  1. :- set(i).
  2. :- modeh(1,father(+person,-person)).
  3. :- modeb(1,parent(+person,-person)).
  4. :- modeb(1,male(+person)).
  5. father(X,Y) :- parent(X,Y), male(Y).
复制代码

五、归纳逻辑程序计划(ILP)

1. 基本概念


2. 相干数学公式(基于信息增益)


3. 代码示例(利用 scikit-learn 风格的伪代码)

  1. from sklearn.base import BaseEstimator, ClassifierMixin
  2. class ILPClassifier(BaseEstimator, ClassifierMixin):
  3.     def __init__(self, max_rules=10):
  4.         self.max_rules = max_rules
  5.         self.rules = []
  6.     def fit(self, X, y):
  7.         for _ in range(self.max_rules):
  8.             rule = self.generate_rule(X, y)  # 生成规则
  9.             if rule is None:
  10.                 break
  11.             self.rules.append(rule)
  12.             X, y = self.remove_covered(X, y, rule)  # 移除已覆盖的样本
  13.         return self
  14.     def generate_rule(self, X, y):
  15.         # 生成新规则,这里假设使用序贯覆盖和信息增益
  16.         best_rule = None
  17.         best_gain = 0
  18.         for feature in features:
  19.             for threshold in thresholds:
  20.                 rule = Rule(feature, threshold)
  21.                 gain = self.calculate_information_gain(rule, X, y)
  22.                 if gain > best_gain:
  23.                     best_rule = rule
  24.                     best_gain = gain
  25.         return best_rule
  26.     def calculate_information_gain(self, rule, X, y):
  27.         # 计算信息增益
  28.         p_cover = self.rule_coverage(rule, X)
  29.         entropy_before = entropy(y)
  30.         entropy_cover = entropy(y[self.rule_covers(rule, X)])
  31.         entropy_remain = entropy(y[~self.rule_covers(rule, X)])
  32.         gain = entropy_before - p_cover * entropy_cover - (1 - p_cover) * entropy_remain
  33.         return gain
  34.     def rule_coverage(self, rule, X):
  35.         # 计算规则覆盖的样本
  36.         covered = []
  37.         for i, x in enumerate(X):
  38.             if satisfies_rule(x, rule):
  39.                 covered.append(i)
  40.         return np.array(covered)
  41.     def remove_covered(self, X, y, rule):
  42.         covered = self.rule_coverage(rule, X)
  43.         X = np.delete(X, covered, axis=0)
  44.         y = np.delete(y, covered)
  45.         return X, y
  46.     def predict(self, X):
  47.         predictions = []
  48.         for x in X:
  49.             for rule in self.rules:
  50.                 if satisfies_rule(x, rule):
  51.                     predictions.append(positive_class)
  52.                     break
  53.             else:  # 未被任何规则覆盖
  54.                 predictions.append(negative_class)
  55.         return np.array(predictions)
  56. def entropy(y):
  57.     # 计算熵
  58.     classes = np.unique(y)
  59.     entropy_value = 0
  60.     for c in classes:
  61.         p = np.mean(y == c)
  62.         if p > 0:
  63.             entropy_value -= p * np.log2(p)
  64.     return entropy_value
  65. class Rule:
  66.     def __init__(self, feature, threshold):
  67.         self.feature = feature
  68.         self.threshold = threshold
  69. def satisfies_rule(x, rule):
  70.     if x[rule.feature] > rule.threshold:
  71.         return True
  72.     return False
复制代码
总结


注意事项

   
  


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4