1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
|
def create_data_set(): data_set = [] data_set.append(["男", "运动员", "70后", "光头", "80后", "离婚", "选秀", "篮球", "内地", "演员"]) data_set.append(["是", "是", "否", "否", "是", "否", "否", "是", "是", "否", "姚明"]) data_set.append(["是", "是", "否", "否", "是", "是", "否", "否", "是", "否", "刘翔"]) data_set.append(["是", "是", "是", "是", "否", "否", "否", "是", "否", "否", "科比"]) data_set.append(["是", "是", "否", "否", "是", "否", "否", "否", "否", "否", "c罗"]) data_set.append(["是", "否", "否", "否", "否", "否", "否", "否", "否", "是", "刘德华"]) data_set.append(["是", "否", "否", "否", "否", "否", "是", "否", "是", "否", "毛不易"]) data_set.append(["是", "否", "是", "否", "否", "否", "否", "否", "否", "是", "周杰伦"]) data_set.append(["是", "否", "是", "否", "否", "否", "否", "否", "是", "是", "黄渤"]) data_set.append(["是", "否", "是", "是", "否", "否", "否", "否", "是", "是", "徐峥"]) data_set.append(["否", "是", "否", "否", "是", "否", "否", "否", "是", "否", "张怡宁"]) data_set.append(["否", "是", "否", "否", "否", "是", "否", "否", "是", "否", "郎平"]) data_set.append(["否", "是", "否", "否", "否", "否", "否", "否", "是", "否", "朱婷"]) data_set.append(["否", "否", "否", "否", "否", "否", "是", "否", "是", "是", "杨超越"]) data_set.append(["否", "否", "否", "否", "是", "是", "否", "否", "是", "是", "杨幂"]) data_set.append(["否", "否", "否", "否", "否", "否", "否", "否", "否", "否", "邓紫棋"]) data_set.append(["否", "否", "否", "否", "是", "否", "是", "否", "否", "否", "徐佳莹"]) data_set.append(["否", "否", "否", "否", "是", "否", "否", "否", "是", "是", "赵丽颖"]) attr = data_set[0] del (data_set[0]) print("属性集:") print(attr) print("数据集:") print(data_set) return data_set, attr
def split_data_set(data_set, axis, value): sub_data_set = [] for line in data_set: if line[axis] == value: newline = line[:] del newline[axis] sub_data_set.append(newline) return sub_data_set
def calc_info_ent(data_set): num = len(data_set) count = {} for i in data_set: current_label = i[-1] if current_label not in count.keys(): count[current_label] = 0 count[current_label] += 1 info_ent = 0.0 for key in count.keys(): probability = float(count[key]) / num info_ent -= probability * log(probability, 2) return info_ent
def best_split(data_set): feature_num = len(data_set[0]) - 1 base_ent = calc_info_ent(data_set) best_info_gain = 0.0 best_index = -1 for axis in range(feature_num): row = [] for line in data_set: row.append(line[axis]) unique_row = set(row) new_ent = 0.0 for value in unique_row: sub_data_set = split_data_set(data_set, axis, value) probability = float(len(sub_data_set)) / len(data_set) new_ent += probability * calc_info_ent(sub_data_set) info_gain = base_ent - new_ent if info_gain > best_info_gain: best_info_gain = info_gain best_index = axis return best_index
def create_tree(data_set, attr): true_labels = [] for line in data_set: true_labels.append(line[-1]) if true_labels.count(true_labels[0]) == len(true_labels): return true_labels[0] if len(data_set[0]) == 1: return max(true_labels, key=true_labels.count) best_index = best_split(data_set) best_attr = attr[best_index] root = {best_attr: {}} best_row = [] for line in data_set: best_row.append(line[best_index]) unique_row = set(best_row) for value in unique_row: sub_attr = attr[:] del sub_attr[best_index] root[best_attr][value] = create_tree(split_data_set(data_set, best_index, value), sub_attr) return root
|