π
<-

Calcul algèbre Linéaire avec Khicas

TI's micropython + modules

Calcul algèbre Linéaire avec Khicas

Unread postby rmarion37 » 25 Mar 2022, 18:38

Bonjour,

Je suis en train de tester khicas en faisant un petit calcul sur des tableaux "array". J'ai donc fait un programme Python et crée un fichier numpy.py avec le code que j'ai trouvé sur le forum. J'ai mis ces deux fichiers dans le répertoire Xcas pour pouvoir les lancer.

Le code que je veux tester est le suivant :
Code: Select all
import numpy as np

X = np.array([[-2,4,-1], [4,1,-1], [1,6,-1], [2,4,-1], [6,2,-1]])
y = np.array([-1,-1,1,1,1])

def perceptron_sgd(X,y):
    w = np.zeros(len(X[0]))
    eta = 1
    epochs = 20

    for t in range(epochs):
        for i,x in enumerate(X):
            if (np.dot(X[i], w)*y[i])<=0:
                w=w+eta*X[i]*y[i]
    return w

w = perceptron_sgd(X,y)
print(w)


Khicas bloque sur la ligne
Code: Select all
if (np.dot(X[i], w)*y[i])<=0:
avec le message suivant :

File "numpy.py.tns", line 17, in __mul__
ValueError: Wrong type of 1st argument.


Le .dot() de mon programme utilise bien la méthode __mul__ de la classe array de numpy.py :

Code: Select all
def __mul__(self,other):
    if type(self)==array:
        if type(other)==array:
             return array(linalg.mul(self.a,other.a))
        return array(linalg.mul(self.a,other))
    return array(linalg.mul(self,other.a))


Pourtant X et y sont bien des array. Et de toute façon, le code de numpy.py semble gérer tous les cas.

Avez-vous une idée d'où vient le problème ?

rmarion37
User avatar
rmarion37
Niveau 2: MI2 (Membre Initié)
Niveau 2: MI2 (Membre Initié)
Level up: 66.7%
 
Posts: 9
Joined: 23 Mar 2022, 16:52
Gender: Not specified
Calculator(s):
MyCalcs profile

Re: Calcul algèbre Linéaire avec Khicas

Unread postby rmarion37 » 26 Mar 2022, 18:39

J'ai essayé de remplacer __mul__ par __rmul__ dans numpy.py.tns, sans succès.
User avatar
rmarion37
Niveau 2: MI2 (Membre Initié)
Niveau 2: MI2 (Membre Initié)
Level up: 66.7%
 
Posts: 9
Joined: 23 Mar 2022, 16:52
Gender: Not specified
Calculator(s):
MyCalcs profile

Re: Calcul algèbre Linéaire avec Khicas

Unread postby parisse » 26 Mar 2022, 19:06

Il semble que np.dot renvoie un array (ce qui est mathematiquement curieux, mais correspond a la definition de la multiplication de 2 objets de type array), ensuite le test <=0 echoue (pas de methode pour comparer un array et un int).
User avatar
parisseVIP++
Niveau 12: CP (Calculatrice sur Pattes)
Niveau 12: CP (Calculatrice sur Pattes)
Level up: 92.8%
 
Posts: 3784
Joined: 13 Dec 2013, 16:35
Gender: Not specified
Calculator(s):
MyCalcs profile

Re: Calcul algèbre Linéaire avec Khicas

Unread postby rmarion37 » 27 Mar 2022, 10:25

np.dot renvoie bien un array mais c'est sa multiplication avec y[i] qui cause l'erreur sur __mul__.
y[i] est pour pourtant un simple entier (int).
C'est à priori la ligne array(linalg.mul(self.a,other)) qui coince.
User avatar
rmarion37
Niveau 2: MI2 (Membre Initié)
Niveau 2: MI2 (Membre Initié)
Level up: 66.7%
 
Posts: 9
Joined: 23 Mar 2022, 16:52
Gender: Not specified
Calculator(s):
MyCalcs profile

Re: Calcul algèbre Linéaire avec Khicas

Unread postby rmarion37 » 27 Mar 2022, 10:33

En faisant quelques essais, je viens de me rendre compte que dot(X[0],w) donne comme résultat array(0.0) alors qu'il faudrait array([0.0]).
En faisant array([0.0])*-1, plus d'erreur __mul__.
User avatar
rmarion37
Niveau 2: MI2 (Membre Initié)
Niveau 2: MI2 (Membre Initié)
Level up: 66.7%
 
Posts: 9
Joined: 23 Mar 2022, 16:52
Gender: Not specified
Calculator(s):
MyCalcs profile

Re: Calcul algèbre Linéaire avec Khicas

Unread postby parisse » 27 Mar 2022, 15:37

Dans ce cas, c'est a l'initialisation qu'il faut faire une modif
Code: Select all
class array:
    def __init__(self, a):
        self.a = a

devrait devenir:
Code: Select all
class array:
    def __init__(self, a):
        if type(a)==list:
           self.a = a
        else:
           self.a = [a]
User avatar
parisseVIP++
Niveau 12: CP (Calculatrice sur Pattes)
Niveau 12: CP (Calculatrice sur Pattes)
Level up: 92.8%
 
Posts: 3784
Joined: 13 Dec 2013, 16:35
Gender: Not specified
Calculator(s):
MyCalcs profile

Re: Calcul algèbre Linéaire avec Khicas

Unread postby rmarion37 » 30 Mar 2022, 10:23

J'ai fait la modif et j'ai une une erreur sur la ligne :

Code: Select all
if (np.dot(X[i], w)*y[i])<=0:


la comparaison avec la méthode __le__ (<=) ne fonctionnant pas avec les array.

J'ai donc modifié le code comme suit pour prendre la valeur du tableau array :

Code: Select all
if (np.dot(X[i], w)*y[i])[0]<=0:


C'est moins souple que le Python pure mais c'est jouable.

Merci pour vos réponses.

rmarion37
User avatar
rmarion37
Niveau 2: MI2 (Membre Initié)
Niveau 2: MI2 (Membre Initié)
Level up: 66.7%
 
Posts: 9
Joined: 23 Mar 2022, 16:52
Gender: Not specified
Calculator(s):
MyCalcs profile

Re: Calcul algèbre Linéaire avec Khicas

Unread postby parisse » 30 Mar 2022, 12:25

Je vais mettre le nouvelle initialisation dans le source de KhiCAS. Je pense qu'il faudrait aussi redefinir les operateurs de comparaison pour imiter le numpy de Python desktop, mais il faudrait quelqu'un qui connait bien numpy pour faire cela.

The comparison operators (<, <=, >, >=, == and !=) can be overloaded by providing definition to __lt__, __le__, __gt__, __ge__, __eq__ and __ne__ magic methods.

par exemple qu'est-ce qu'on fait pour def __ge__(self, other): ...? et pour __eq__?
User avatar
parisseVIP++
Niveau 12: CP (Calculatrice sur Pattes)
Niveau 12: CP (Calculatrice sur Pattes)
Level up: 92.8%
 
Posts: 3784
Joined: 13 Dec 2013, 16:35
Gender: Not specified
Calculator(s):
MyCalcs profile

Re: Calcul algèbre Linéaire avec Khicas

Unread postby rmarion37 » 30 Mar 2022, 16:47

Je n'ai malheureusement pas les compétences pour mettre les mains sous le capot.

Mais effectivement Numpy est très performant grâce à ses règles de broadcasting pour les opérations mathématiques et les règles de comparaison.

On ne compare pas tout à fait les arrays Numpy comme les autres objets Python.
User avatar
rmarion37
Niveau 2: MI2 (Membre Initié)
Niveau 2: MI2 (Membre Initié)
Level up: 66.7%
 
Posts: 9
Joined: 23 Mar 2022, 16:52
Gender: Not specified
Calculator(s):
MyCalcs profile

Re: Calcul algèbre Linéaire avec Khicas

Unread postby rmarion37 » 31 Mar 2022, 08:26

Savez-vous quel fichier de khicas contient ces méthodes de comparaison (__le__, ...) ? J'ai trouvé le bout de code de Numpy qui me semble "cadrer" le comportement de ces méthodes sur les tableaux array avec les autres types de variables.

Je vais tenter de faire les modifs !!!!
User avatar
rmarion37
Niveau 2: MI2 (Membre Initié)
Niveau 2: MI2 (Membre Initié)
Level up: 66.7%
 
Posts: 9
Joined: 23 Mar 2022, 16:52
Gender: Not specified
Calculator(s):
MyCalcs profile

Next

Return to Python

Who is online

Users browsing this forum: ClaudeBot [spider] and 2 guests

-
Search
-
Social TI-Planet
-
Featured topics
Comparaisons des meilleurs prix pour acheter sa calculatrice !
"1 calculatrice pour tous", le programme solidaire de Texas Instruments. Reçois gratuitement et sans aucune obligation d'achat, 5 calculatrices couleur programmables en Python à donner aux élèves les plus nécessiteux de ton lycée. Tu peux recevoir au choix 5 TI-82 Advanced Edition Python ou bien 5 TI-83 Premium CE Edition Python.
Enseignant(e), reçois gratuitement 1 exemplaire de test de la TI-82 Advanced Edition Python. À demander d'ici le 31 décembre 2024.
Aidez la communauté à documenter les révisions matérielles en listant vos calculatrices graphiques !
1234
-
Donations / Premium
For more contests, prizes, reviews, helping us pay the server and domains...
Donate
Discover the the advantages of a donor account !
JoinRejoignez the donors and/or premium!les donateurs et/ou premium !


Partner and ad
Notre partenaire Jarrety Calculatrices à acheter chez Calcuso
-
Stats.
1315 utilisateurs:
>1274 invités
>34 membres
>7 robots
Record simultané (sur 6 mois):
6892 utilisateurs (le 07/06/2017)
-
Other interesting websites
Texas Instruments Education
Global | France
 (English / Français)
Banque de programmes TI
ticalc.org
 (English)
La communauté TI-82
tout82.free.fr
 (Français)