Page 1 of 2

Calcul algèbre Linéaire avec Khicas

Unread postPosted: 25 Mar 2022, 18:38
by rmarion37
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

Re: Calcul algèbre Linéaire avec Khicas

Unread postPosted: 26 Mar 2022, 18:39
by rmarion37
J'ai essayé de remplacer __mul__ par __rmul__ dans numpy.py.tns, sans succès.

Re: Calcul algèbre Linéaire avec Khicas

Unread postPosted: 26 Mar 2022, 19:06
by parisse
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).

Re: Calcul algèbre Linéaire avec Khicas

Unread postPosted: 27 Mar 2022, 10:25
by rmarion37
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.

Re: Calcul algèbre Linéaire avec Khicas

Unread postPosted: 27 Mar 2022, 10:33
by rmarion37
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__.

Re: Calcul algèbre Linéaire avec Khicas

Unread postPosted: 27 Mar 2022, 15:37
by parisse
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]

Re: Calcul algèbre Linéaire avec Khicas

Unread postPosted: 30 Mar 2022, 10:23
by rmarion37
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

Re: Calcul algèbre Linéaire avec Khicas

Unread postPosted: 30 Mar 2022, 12:25
by parisse
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__?

Re: Calcul algèbre Linéaire avec Khicas

Unread postPosted: 30 Mar 2022, 16:47
by rmarion37
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.

Re: Calcul algèbre Linéaire avec Khicas

Unread postPosted: 31 Mar 2022, 08:26
by rmarion37
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 !!!!