Repository navigation
Expand file tree
/
Copy pathsemantic_net.py
More file actions
319 lines (274 loc) · 18.7 KB
/
Copy pathsemantic_net.py
File metadata and controls
319 lines (274 loc) · 18.7 KB
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
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
import random
class LPStructure:
def __init__(self, eLengthItems, eItemBitSize):
self.eLengthItems = eLengthItems
self.eItemBitSize = eItemBitSize
def EQ(self, ls, rs):
for i in range(self.eLengthItems):
if ls[i] != rs[i]:
return False
return True
def EZ(self, ls):
for i in range(self.eLengthItems):
if ls[i]:
return False
return True
def LE(self, ls, rs):
for i in range(self.eLengthItems):
if (ls[i] | rs[i]) != rs[i]:
return False
return True
def LT(self, ls, rs):
bExistLT = False
for i in range(self.eLengthItems):
if (ls[i] | rs[i]) == rs[i]:
if ls[i] != rs[i]:
bExistLT = True
else:
return False
return bExistLT
def lJoin(self, ls, rs):
for i in range(self.eLengthItems):
ls[i] |= rs[i]
def lMeet(self, ls, rs):
for i in range(self.eLengthItems):
ls[i] &= rs[i]
def lDiff(self, ls, rs):
res = False
for i in range(self.eLengthItems):
if ls[i] & rs[i]:
ls[i] &= ~rs[i]
res = True
return res
def isMeet(self, ls, rs):
for i in range(self.eLengthItems):
if ls[i] & rs[i]:
return True
return False
def isON(self, eTest, nAtom):
nItem = nAtom // self.eItemBitSize
nBit = nAtom % self.eItemBitSize
nMask = 1 << (self.eItemBitSize - 1 - nBit)
return bool(eTest[nItem] & nMask)
class SCPAlgorithm:
def __init__(self, lp_structure, population_size=100, generations=100):
self.lp_structure = lp_structure
self.population_size = population_size
self.generations = generations
self.population = self.initialize_population()
def initialize_population(self):
# Initialize a random population
return [self.random_individual() for _ in range(self.population_size)]
def random_individual(self):
# Create a random individual
return [random.randint(0, 1) for _ in range(self.lp_structure.eLengthItems)]
def run(self, sequences, min_support, min_confidence):
# Initialize and evolve the population
best_individual = self.evolve()
# Placeholder for generating frequent itemsets and rules
# This should be replaced with actual logic to generate itemsets and rules
freq_itemsets = [] # Example: list of frequent itemsets
rules = [] # Example: list of rules with confidence
# Return the best individual as a placeholder for the actual results
return freq_itemsets, rules
def evolve(self):
for generation in range(self.generations):
# Evaluate fitness of each individual
fitness_scores = [self.fitness(individual) for individual in self.population]
# Select individuals for the next generation
selected_individuals = self.selection(fitness_scores)
# Create the next generation through crossover and mutation
next_generation = self.crossover_and_mutate(selected_individuals)
# Update the population
self.population = next_generation
# Return the best individual from the final generation
best_individual = max(self.population, key=self.fitness)
return best_individual
def fitness(self, individual):
# Define a fitness function for individuals
return sum(individual) # Example: maximize the number of '1's
def selection(self, fitness_scores):
# Select individuals based on fitness scores
selected = random.choices(self.population, weights=fitness_scores, k=self.population_size)
return selected
def crossover_and_mutate(self, selected_individuals):
# Perform crossover and mutation to create the next generation
next_generation = []
for i in range(0, len(selected_individuals), 2):
parent1 = selected_individuals[i]
parent2 = selected_individuals[i + 1] if i + 1 < len(selected_individuals) else selected_individuals[0]
child1, child2 = self.crossover(parent1, parent2)
next_generation.extend([self.mutate(child1), self.mutate(child2)])
return next_generation
def crossover(self, parent1, parent2):
# Perform crossover between two parents
crossover_point = random.randint(1, len(parent1) - 1)
child1 = parent1[:crossover_point] + parent2[crossover_point:]
child2 = parent2[:crossover_point] + parent1[crossover_point:]
return child1, child2
def mutate(self, individual):
# Mutate an individual
mutation_rate = 0.01
return [gene if random.random() > mutation_rate else 1 - gene for gene in individual]
def fitness(self, individual):
# Define a fitness function for individuals
return sum(individual) # Example: maximize the number of '1's
def selection(self, fitness_scores):
# Select individuals based on fitness scores
selected = random.choices(self.population, weights=fitness_scores, k=self.population_size)
return selected
def crossover_and_mutate(self, selected_individuals):
# Perform crossover and mutation to create the next generation
next_generation = []
for i in range(0, len(selected_individuals), 2):
parent1 = selected_individuals[i]
parent2 = selected_individuals[i + 1] if i + 1 < len(selected_individuals) else selected_individuals[0]
child1, child2 = self.crossover(parent1, parent2)
next_generation.extend([self.mutate(child1), self.mutate(child2)])
return next_generation
def crossover(self, parent1, parent2):
# Perform crossover between two parents
crossover_point = random.randint(1, len(parent1) - 1)
child1 = parent1[:crossover_point] + parent2[crossover_point:]
child2 = parent2[:crossover_point] + parent1[crossover_point:]
return child1, child2
def mutate(self, individual):
# Mutate an individual
mutation_rate = 0.01
return [gene if random.random() > mutation_rate else 1 - gene for gene in individual]
def scp_algorithm(sequences, min_support, min_confidence):
unique_items = set(item for sequence in sequences for item in sequence)
lp_structure = LPStructure(len(unique_items), 1) # Assuming 1 bit per item for simplicity
scp = SCPAlgorithm(lp_structure)
return scp.run(sequences, min_support, min_confidence)
def inverse_inference(rules, target_attribute):
inverse_rules = []
for antecedent, consequent, confidence in rules:
if any(item.startswith(target_attribute) for item in consequent):
inverse_rules.append((antecedent, consequent, confidence))
return inverse_rules
def optimize_decision_process(sequences, min_support, min_confidence, target_attributes):
# Step 1: Use SCP algorithm to identify key factors and patterns
freq_itemsets, rules = scp_algorithm(sequences, min_support, min_confidence)
# Step 2: Use relevant inverse inference to check factors against objectives and constraints
relevant_rules = []
for target in target_attributes:
relevant_rules.extend(inverse_inference(rules, target))
# Step 3: Optimize the decision-making process based on findings and patterns
decision_process = {}
for antecedent, consequent, confidence in relevant_rules:
decision = list(consequent)[0].split('=')[1]
conditions = [item.split('=') for item in antecedent]
decision_process[frozenset(conditions)] = (decision, confidence)
return decision_process
def make_decision(optimized_process, input_data):
for conditions, (decision, confidence) in optimized_process.items():
if all(attr in input_data and input_data[attr] == val for attr, val in conditions):
return decision, confidence
return "Unknown", 0.0
# Example usage
if __name__ == "__main__":
sequences = [
['относительный_вес=нормальный', 'зн=да'],
['относительный_вес=недостаточный', 'зн=да'],
['коронарный_риск=ниже_среднего', 'сердзаб=низкий'],
['коронарный_риск=средний', 'сердзаб=низкий'],
['старт=да', 'сердзаб=иной'],
['возраст=25_или_меньше', 'пол=ж', 'основная_продолжительность=72'],
['возраст=25_или_меньше', 'пол=м', 'основная_продолжительность=67'],
['возраст=25-55', 'пол=ж', 'основная_продолжительность=67'],
['возраст=25-55', 'пол=м', 'основная_продолжительность=62'],
['возраст=55_или_больше', 'пол=ж', 'основная_продолжительность=64'],
['возраст=55_или_больше', 'пол=м', 'основная_продолжительность=60'],
['вес=55_или_меньше', 'сложение=мелкое', 'пол=ж', 'относительный_вес=нормальный'],
['вес=85_или_больше', 'сложение=мелкое', 'пол=ж', 'относительный_вес=излишний'],
['вес=55-85', 'сложение=мелкое', 'пол=ж', 'относительный_вес=излишний'],
['вес=55_или_меньше', 'сложение=крупное', 'относительный_вес=недостаточный'],
['вес=55_или_меньше', 'сложение=крупное', 'пол=м', 'относительный_вес=недостаточный'],
['вес=55-85', 'сложение=мелкое', 'пол=ж', 'относительный_вес=излишний'],
['вес=55-85', 'сложение=крупное', 'пол=ж', 'относительный_вес=нормальный'],
['вес=55-85', 'сложение=мелкое', 'пол=м', 'относительный_вес=нормальный'],
['вес=55-85', 'сложение=крупное', 'пол=м', 'относительный_вес=недостаточный'],
['вес=85_или_больше', 'пол=ж', 'относительный_вес=излишний'],
['вес=85_или_больше', 'пол=м', 'сложение=мелкое', 'относительный_вес=излишний'],
['вес=85_или_больше', 'пол=м', 'сложение=крупное', 'относительный_вес=нормальный'],
['холестерин=низкий', 'жиры=излишек', 'коронарный_риск=ниже_среднего'],
['холестерин=низкий', 'жиры=норма', 'коронарный_риск=средний'],
['холестерин=излишек', 'коронарный_риск=выше_среднего'],
['холестерин=норма', 'коронарный_риск=средний'],
['соль=излишек', 'кровяное_давление=выше_среднего'],
['соль=норма', 'кровяное_давление=среднее'],
['кальций=излишек', 'риск_остеопороза=ниже_среднего'],
['кальций=норма', 'риск_остеопороза=средний'],
['кальций=низкий', 'риск_остеопороза=выше_среднего'],
['относительный_вес=излишний', 'коронарный_риск=выше_среднего', 'кровяное_давление=выше_среднего', 'курение=да',
'перспектива=унылая'],
['относительный_вес=излишний', 'коронарный_риск=выше_среднего', 'кровяное_давление=выше_среднего',
'курение=нет', 'перспектива=плохая'],
['относительный_вес=излишний', 'коронарный_риск=выше_среднего', 'кровяное_давление=среднее', 'курение=нет',
'перспектива=хорошая'],
['относительный_вес=излишний', 'сердзаб=низкий', 'кровяное_давление=среднее', 'курение=нет',
'перспектива=хорошая'],
['зн=да', 'сердзаб=низкий', 'кровяное_давление=среднее', 'курение=нет', 'перспектива=отличная'],
['зн=да', 'коронарный_риск=выше_среднего', 'кровяное_давление=среднее', 'курение=да',
'перспектива=посредственная'],
['зн=да', 'сердзаб=низкий', 'кровяное_давление=среднее', 'курение=да', 'перспектива=посредственная'],
['зн=да', 'сердзаб=низкий', 'кровяное_давление=среднее', 'курение=нет', 'перспектива=хорошая'],
['старт=да', 'перспектива=неизвестна'],
['раса=негроидная', 'происхождение=средиземноморское', 'риск=высокий'],
['характер=агрессивный', 'тип_личности=тип_a'],
['характер=мягкий', 'тип_личности=тип_b'],
['тип_личности=тип_a', 'риск=высокий'],
['старт=да', 'риск=неизвестен'],
['потребление_алкоголя=умеренное', 'дополн=посредственно'],
['потребление_алкоголя=не_употребляет', 'дополн=хорошо'],
['потребление_алкоголя=чрезмерное', 'дополн=плохо'],
['перспектива=унылая', 'риск=высокий', 'дополн=плохо', 'фактор=минус_12'],
['перспектива=отличная', 'риск=неизвестен', 'дополн=посредственно', 'фактор=плюс_12'],
['перспектива=отличная', 'риск=высокий', 'дополн=посредственно', 'фактор=ноль'],
['перспектива=хорошая', 'риск=высокий', 'дополн=посредственно', 'фактор=ноль'],
['перспектива=хорошая', 'риск=высокий', 'фактор=минус_12'],
['перспектива=посредственная', 'риск=высокий', 'фактор=минус_12'],
['перспектива=отличная', 'риск=неизвестен', 'дополн=хорошо', 'фактор=плюс_12'],
['перспектива=отличная', 'риск=неизвестен', 'дополн=плохо', 'фактор=плюс_12'],
['перспектива=посредственная', 'риск=неизвестен', 'фактор=плюс_12'],
['перспектива=хорошая', 'риск=неизвестен', 'фактор=ноль'],
['перспектива=унылая', 'риск=неизвестен', 'фактор=ноль'],
['старт=да', 'фактор=неизвестен'],
['старт=выход', 'фактор=выход'],
['основная_продолжительность=72', 'фактор=ноль', 'продолжительность=72'],
['основная_продолжительность=67', 'фактор=ноль', 'продолжительность=67'],
['основная_продолжительность=64', 'фактор=ноль', 'продолжительность=64'],
['основная_продолжительность=62', 'фактор=ноль', 'продолжительность=62'],
['основная_продолжительность=60', 'фактор=ноль', 'продолжительность=60'],
['основная_продолжительность=72', 'фактор=плюс_12', 'продолжительность=84'],
['основная_продолжительность=67', 'фактор=плюс_12', 'продолжительность=79'],
['основная_продолжительность=64', 'фактор=плюс_12', 'продолжительность=76'],
['основная_продолжительность=62', 'фактор=плюс_12', 'продолжительность=74'],
['основная_продолжительность=60', 'фактор=плюс_12', 'продолжительность=72'],
['основная_продолжительность=72', 'фактор=минус_12', 'продолжительность=60'],
['основная_продолжительность=67', 'фактор=минус_12', 'продолжительность=55'],
['основная_продолжительность=64', 'фактор=минус_12', 'продолжительность=52'],
['основная_продолжительность=62', 'фактор=минус_12', 'продолжительность=50'],
['основная_продолжительность=60', 'фактор=минус_12', 'продолжительность=48']
]
min_support = 2
min_confidence = 0.5
target_attributes = ['продолжительность', 'перспектива', 'риск']
optimized_decision_process = optimize_decision_process(sequences, min_support, min_confidence, target_attributes)
print("Optimized Decision Process:")
for conditions, (decision, confidence) in optimized_decision_process.items():
print(f"If {', '.join([f'{attr}={val}' for attr, val in conditions])}")
print(f"Then {decision} (Confidence: {confidence:.2f})")
print()
# Example decision-making
input_data = {
'основная_продолжительность': '72',
'фактор': 'плюс_12',
'перспектива': 'отличная',
'риск': 'неизвестен',
'дополн': 'хорошо'
}
decision, confidence = make_decision(optimized_decision_process, input_data)
print(f"Decision for input data: {decision} (Confidence: {confidence:.2f})")
# Add more insertions as needed