REPUBLIQUE TUNISIENNE الجمهورية التونسية
Ministère de l'Enseignement Supérieur,
de la Recherche Scientifique وزارة التعليم العالي والبحث العلمي
Concours Nationaux d’Entrée انمناظرات انىطنية نهدخىل
إنى مراحم تكىين انمهندسين
aux Cycles de Formation d’Ingénieurs
2019 دورة
Session 2019
Concours Mathématique et Physique, Physique et Chimie et Technologie
Corrigé épreuve d’informatique
PROBLEME 1
Partie 1 : Représentation de la structure d’arbre binaire
1. la méthode isLeaf
def isLeaf(self):
return [Link] == None and [Link] == None
#ou bien return [Link] is [Link] is None
2. la méthode __len__
def __len__(self):
if [Link]():
return 1
elif [Link] == None:
return 1 + len([Link])
elif [Link] == None:
return 1 + len([Link])
else:
return 1 + len([Link]) + len([Link])
3. la méthode __str__
def __str__(self):
if [Link]():
return "Node("+[Link]+")"
else:
return "Node("+[Link]+","+str([Link])+
","+str([Link])+ ")"
Partie 2 : Représentation du modèle de décision
1. l’entête de la classe DecisionNode
class DecisionNode(Node):
2. la méthode __init__
def __init__(self,label,distr,S,left,right):
Node.__init__(self,label,left,right)
[Link] = S
[Link] = distr
Concours (Mathématiques et Physique, Physique et Chimie et Technologie)- Session Juin 2019 Epreuve d’Informatique Page 1/7
3. la méthode outcome
def outcome(self,val):
try:
assert not [Link]()
if val >= [Link]:
return [Link]
else:
return [Link]
except:
print("le noeud est une feuille")
4. la méthode __str__
def __str__(self):
L = [Link]()
ch=""
for e in L:
ch+="IF"
for i in range(1,len(e)):
if e[i] == e[i-1].left:
ch+=e[i-1].label+">="+str(e[i-1].seuil)+ "AND"
else:
ch+=e[i-1].label+"<"+str(e[i-1].seuil)+ "AND"
ch = ch[:len(ch)-4]+"THEN"+
e[len(e)-1].label+"="+str(e[len(e)-1].distr)+ "\n"
return ch
5. la méthode predict
def predict (self,dicobs):
currentNode = self
while not([Link]())and [Link] in dicobs:
curvalue = dicobs[[Link]]
currentNode = [Link](curvalue)
return [Link]
6. la méthode __init__
def __init__(self):
self. listNodes = []
7. la méthode add
def add(self,dt):
self. [Link](dt)
8. la méthode predict
def predict(self, dicobs):
if len([Link]) == 0:
distr = {0:0.5, 1:0.5}
else:
p0 = 0
for e in [Link]:
Concours (Mathématiques et Physique, Physique et Chimie et Technologie)- Session Juin 2019 Epreuve d’Informatique Page 2/7
d = [Link](dicobs)
p0+=d[0]
p0 = p0/len([Link])
distr = {0:p0, 1:1-p0}
return distr
Partie 3 : Apprentissage
1. la fonction CountValues
def CountValues(DSET,ind):
e = set()
for i in range([Link][0]):
[Link](DSET[i,ind])
return len(e)
2. la fonction EvalDistr
def EvalDistr(DSET):
n,m = [Link](DSET)
if (n,m) == (0,0):
d = {0:0.5,1:0.5}
else:
d={0:0,1:0}
for i in range(n):
if DSET[i,m-1] == 0:
d[0]+=1/n
else:
d[1]+=1/n
return d
3. la fonction IsPure
def IsPure(DSET):
d = EvalDistr(DSET)
if d[0] == 1 or d[1] == 1:
return True
else:
return False
4. la fonction IsQualitative
def IsQualitative(DSET):
n,m = [Link](DSET)
L = [True]*m
for j in range(m):
i = 0
while 1:
if DSET[i,j] not in [0,1]:
L[j] = False
break
i+=1
if i = n:
break
Concours (Mathématiques et Physique, Physique et Chimie et Technologie)- Session Juin 2019 Epreuve d’Informatique Page 3/7
return L
5. la fonction Cut
def Cut(DSET, Lcol, obs, S = 0.5):
indice = [Link](obs)
n,m = [Link](DSET)
n1,n2 = 0,0
for i in range(n):
if DSET[i,indice] >= S:
n1+=1
else:
n2+=1
ds1=[Link]((n1,m-1))
ds2=[Link]((n2,m-1))
k11,k21 = 0,0
for i in range (n):
if DSET[i,indice] >= S:
k2=0
for j in range(indice):
ds1[k11,k2]=DSET[i,j]
k2+=1
for j in range(indice+1,m):
ds1[k11,k2]=DSET[i,j]
k2+=1
k11+=1
else:
k2=0
for j in range(indice):
ds2[k21,k2]=DSET[i,j]
k2+=1
for j in range(indice+1,m):
ds2[k21,k2]=DSET[i,j]
k2+=1
k21+=1
L1 = Lcol[:indice] + Lcol[indice+1:]
L2 = [ds1,ds2]
L3 = [n1/n,n2/n]
return L1 , L2 , L3
6. la fonction Impurity
def Impurity(DSET, Lcol, obs, S = 0.5):
t = Cut(DSET, col, obs, S)
p1 = t[2][0]
p2 = t[2][1]
ds1 = t[1][0]
ds2 = t[1][1]
d1 = EvalDistr(ds1)
d2 = EvalDistr(ds2)
m1 = min(d1[0],d1[1])
m2 = min(d2[0],d2[1])
return(p1*m1+p2*m2)
Concours (Mathématiques et Physique, Physique et Chimie et Technologie)- Session Juin 2019 Epreuve d’Informatique Page 4/7
7. la fonction SortObs
def SortObs(DSET,Lcol,obs):
n,m = [Link](DSET)
indice = [Link](obs)
Lc = []
for i in range(n):
[Link]((DSET[i,indice],DSET[i,m-1]))
[Link]()
return Lc
8. la fonction BestCut
def BestCut(DSET, Lcol, obs, qual):
i = [Link](obs)
if qual[i]:
return Impurity(DSET,Lcol,obs,0.5))
else:
Lc = SortObs(DSET,Lcol,obs)
if IsPure(DSET):
LSeuil = [max(Lc)]
else:
LSeuil = []
for i in range(len(Lc)-1):
if Lc[i][1]!=Lc[i+1][1]:
[Link]((Lc[i][0]+Lc[i+1][0])/2)
sBest = LSeuil[0]
vbest = Impurity(DSET,Lcol,obs,sBest)
for s in LSeuil:
imp = Impurity(DSET,Lcol,obs,s)
if imp<vBest:
vBest = imp
sBest = s
return vBest,sBest
9. la fonction BuildTree
def BuildTree(DSET, Lcol, qual):
distr = EvalDistr(DSET)
if [Link] == (0,0) or IsPure(DSET) or len(Lcol) == 1:
return DecisionNode(Lcol[0], distr)
else:
LvBest = []
LsBest=[]
for obs in Lcol[:len(Lcol)-1]:
sBest, vBest = BestCut(DSET, colonnes, obs, qual)
[Link](vBest)
[Link](sBest)
indice=LvBest(min(LvBest))
sBest=LsBest[indice]
Concours (Mathématiques et Physique, Physique et Chimie et Technologie)- Session Juin 2019 Epreuve d’Informatique Page 5/7
oBest=Lcol[indice]
L=Cut(DSET, Lcol, oBest, sBest)
DSET1=L[1][0]
DSET2=L[1][1]
Lcol= L[0]
rqual = qual[:]
[Link]([Link](oBest))
root=DecisionNode(oBest,distr,BuildTree(DSET1,Lcol,rqual),
BuildTree(DSET2, Lcol, rqual),sBest)
return root
PROBLEME 2
Partie 1 : algèbre relationnelle
1. Π
𝑑𝑠 _𝑖𝑑 ,𝑑𝑠 _𝑛𝑎𝑚𝑒 ,𝑑𝑠 _𝑑𝑒𝑠𝑐𝑟𝑖𝑝𝑡𝑖𝑜𝑛 𝜎 𝑓𝑜𝑟𝑚𝑎𝑡 =′ 𝑐𝑠 𝑣 ′ 𝐷𝑎𝑡𝑎𝑆𝑒𝑡
2. Π𝑐𝑙𝑠 _𝑑𝑒𝑐𝑟𝑖𝑝𝑡𝑖𝑜𝑛 ( 𝜎𝑙𝑎𝑛𝑔𝑢𝑎𝑔𝑒 =′ 𝑃𝑦𝑡 𝑜𝑛 ′ 𝑒𝑡 𝑐𝑎𝑡𝑒𝑔𝑜𝑟𝑦 =′ 𝐾𝑁 𝑁 ′ (𝐶𝑙𝑎𝑠𝑠𝑖𝑓𝑖𝑒𝑢𝑟 ⋈𝑐𝑙𝑠 _𝑖𝑑 𝐶𝑜𝑚𝑏𝑖𝑛𝑒 ⋈𝑚 _𝑛𝑎𝑚𝑒 𝑀𝑒𝑡 𝑜𝑑 )
Partie 2 : SQL
3.
SELECT ds_id FROM Classifieur WHERE error_rate < 0.3
4.
SELECT D.ds_id , ds_name FROM DataSet AS D , Classifieur AS C
WHERE (D.ds_id = C.ds_id)
EXCEPT
SELECT D.ds_id , ds_name FROM DataSet AS D, Classifieur AS
WHERE (D.ds_id = C.ds_id) AND (language <> 'Python')
5.
SELECT D.ds_id , COUNT(DISTINCT M.m_name) AS NB_M
FROM DataSet AS D , Classifieur AS C , Combine AS CM , Method AS M
WHERE (D.ds_id = C.ds_id)
AND (C.cls_id = CM.cls_id)
AND (CM.m_name = M.m_name)
GROUP BY D.ds_id
6.
UPDATE DataSet SET nb_instances = nb_instances + 100
WHERE ds_id IN (SELECT ds_id FROM Classifieur WHERE language ='Python')
Partie 3 : sqlite3
7.
import sqlite3
cnx = [Link]("[Link]")
cur = [Link]()
[Link]("CREATE TABLE Method (m_name TEXT PRIMARY KEY,
category TEXT, m_description TEXT ) ")
Concours (Mathématiques et Physique, Physique et Chimie et Technologie)- Session Juin 2019 Epreuve d’Informatique Page 6/7
f = open("[Link]",’r’)
L = [Link]() # ou bien
Ldata = [ [Link]().split('#') for l in L] ldata =
[[Link]().split('
#') for l in f]
[Link]("INSERT INTO Method VALUES(?,?,?) ", ldata)
[Link]("SELECT ds_id , AVG(error_rate) AS M_erreur FROM Classifieur
GROUP BY ds_id ORDER BY ds_id")
L=[Link]() # ou bien
x=[i[0] for i in L] x, y =
y=[i[1] for i in L] zip(*cur.f
etchall())
import [Link] as plt
[Link](x,y)
[Link]()
Concours (Mathématiques et Physique, Physique et Chimie et Technologie)- Session Juin 2019 Epreuve d’Informatique Page 7/7