π
<-
Chat plein-écran
[^]

Calcul algèbre Linéaire avec Khicas

TI's micropython + modules

Calcul algèbre Linéaire avec Khicas

Message non lude 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: Tout sélectionner
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: Tout sélectionner
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: Tout sélectionner
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
Avatar de l’utilisateur
rmarion37
Niveau 2: MI2 (Membre Initié)
Niveau 2: MI2 (Membre Initié)
Prochain niv.: 66.7%
 
Messages: 9
Inscription: 23 Mar 2022, 16:52
Genre: Non spécifié
Calculatrice(s):
MyCalcs profile

Re: Calcul algèbre Linéaire avec Khicas

Message non lude rmarion37 » 26 Mar 2022, 18:39

J'ai essayé de remplacer __mul__ par __rmul__ dans numpy.py.tns, sans succès.
Avatar de l’utilisateur
rmarion37
Niveau 2: MI2 (Membre Initié)
Niveau 2: MI2 (Membre Initié)
Prochain niv.: 66.7%
 
Messages: 9
Inscription: 23 Mar 2022, 16:52
Genre: Non spécifié
Calculatrice(s):
MyCalcs profile

Re: Calcul algèbre Linéaire avec Khicas

Message non lude 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).
Avatar de l’utilisateur
parisseVIP++
Niveau 12: CP (Calculatrice sur Pattes)
Niveau 12: CP (Calculatrice sur Pattes)
Prochain niv.: 79.8%
 
Messages: 3550
Inscription: 13 Déc 2013, 16:35
Genre: Non spécifié
Calculatrice(s):
MyCalcs profile

Re: Calcul algèbre Linéaire avec Khicas

Message non lude 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.
Avatar de l’utilisateur
rmarion37
Niveau 2: MI2 (Membre Initié)
Niveau 2: MI2 (Membre Initié)
Prochain niv.: 66.7%
 
Messages: 9
Inscription: 23 Mar 2022, 16:52
Genre: Non spécifié
Calculatrice(s):
MyCalcs profile

Re: Calcul algèbre Linéaire avec Khicas

Message non lude 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__.
Avatar de l’utilisateur
rmarion37
Niveau 2: MI2 (Membre Initié)
Niveau 2: MI2 (Membre Initié)
Prochain niv.: 66.7%
 
Messages: 9
Inscription: 23 Mar 2022, 16:52
Genre: Non spécifié
Calculatrice(s):
MyCalcs profile

Re: Calcul algèbre Linéaire avec Khicas

Message non lude parisse » 27 Mar 2022, 15:37

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

devrait devenir:
Code: Tout sélectionner
class array:
    def __init__(self, a):
        if type(a)==list:
           self.a = a
        else:
           self.a = [a]
Avatar de l’utilisateur
parisseVIP++
Niveau 12: CP (Calculatrice sur Pattes)
Niveau 12: CP (Calculatrice sur Pattes)
Prochain niv.: 79.8%
 
Messages: 3550
Inscription: 13 Déc 2013, 16:35
Genre: Non spécifié
Calculatrice(s):
MyCalcs profile

Re: Calcul algèbre Linéaire avec Khicas

Message non lude rmarion37 » 30 Mar 2022, 10:23

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

Code: Tout sélectionner
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: Tout sélectionner
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
Avatar de l’utilisateur
rmarion37
Niveau 2: MI2 (Membre Initié)
Niveau 2: MI2 (Membre Initié)
Prochain niv.: 66.7%
 
Messages: 9
Inscription: 23 Mar 2022, 16:52
Genre: Non spécifié
Calculatrice(s):
MyCalcs profile

Re: Calcul algèbre Linéaire avec Khicas

Message non lude 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__?
Avatar de l’utilisateur
parisseVIP++
Niveau 12: CP (Calculatrice sur Pattes)
Niveau 12: CP (Calculatrice sur Pattes)
Prochain niv.: 79.8%
 
Messages: 3550
Inscription: 13 Déc 2013, 16:35
Genre: Non spécifié
Calculatrice(s):
MyCalcs profile

Re: Calcul algèbre Linéaire avec Khicas

Message non lude 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.
Avatar de l’utilisateur
rmarion37
Niveau 2: MI2 (Membre Initié)
Niveau 2: MI2 (Membre Initié)
Prochain niv.: 66.7%
 
Messages: 9
Inscription: 23 Mar 2022, 16:52
Genre: Non spécifié
Calculatrice(s):
MyCalcs profile

Re: Calcul algèbre Linéaire avec Khicas

Message non lude 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 !!!!
Avatar de l’utilisateur
rmarion37
Niveau 2: MI2 (Membre Initié)
Niveau 2: MI2 (Membre Initié)
Prochain niv.: 66.7%
 
Messages: 9
Inscription: 23 Mar 2022, 16:52
Genre: Non spécifié
Calculatrice(s):
MyCalcs profile

Suivante

Retourner vers Python

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 3 invités

-
Rechercher
-
Social TI-Planet
-
Sujets à la une
"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.
Offre de test des nouveautés de rentrée 2024 par Casio. Enseignant(e), reçois gratuitement 1 exemplaire, à ton choix, de la Graph Light ou bien de la Graph Math+
14€ remboursés par Casio sur l'achat de ta calculatrice Graph 35 d'ici le 31 Octobre 2024
10€ remboursés par Casio sur l'achat de ta calculatrice Graph 90+E d'ici le 31 Décembre 2024
10€ remboursés par Casio sur l'achat de ta calculatrice Graph 25 d'ici le 31 Décembre 2024
8€ remboursés par Casio sur l'achat de ta calculatrice Graph Math+ d'ici le 31 Octobre 2024
Reprise de ton ancienne fx-92 Collège ou Graph 25/35/90 à 3€ peu importe son état. Même non fonctionnelle et donc invendable, même ancienne Graph 35 non conforme aux programmes (pas de Python), même ancienne Graph 25/35 inutilisable aux examens (pas de mode examen) et donc invendable. Etiquette de retour fournie, pas de frais de port à payer.
3€ remboursés par Casio sur l'achat de ta calculatrice fx-92 Collège d'ici le 30 Septembre 2024
5€ de remise immédiate sur l'achat de ta calculatrice TI-83 Premium CE Edition Python chez les revendeurs partenaires
4€ de remise immédiate sur l'achat de ta calculatrice TI-82 Advanced Edition Python chez les revendeurs partenaires
3€ de remise immédiate sur l'achat de ta calculatrice TI-82 Advanced chez les revendeurs partenaires
Comparaisons des meilleurs prix pour acheter sa calculatrice !
Aidez la communauté à documenter les révisions matérielles en listant vos calculatrices graphiques !
1234567891011121314
-
Faire un don / Premium
Pour plus de concours, de lots, de tests, nous aider à payer le serveur et les domaines...
Faire un don
Découvrez les avantages d'un compte donateur !
JoinRejoignez the donors and/or premium!les donateurs et/ou premium !


Partenaires et pub
Notre partenaire Jarrety Calculatrices à acheter chez Calcuso
-
Stats.
1171 utilisateurs:
>1134 invités
>33 membres
>4 robots
Record simultané (sur 6 mois):
6892 utilisateurs (le 07/06/2017)
-
Autres sites intéressants
Texas Instruments Education
Global | France
 (English / Français)
Banque de programmes TI
ticalc.org
 (English)
La communauté TI-82
tout82.free.fr
 (Français)