Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.
Nástěnka
❗22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
❗04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
❗23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.
Nejste přihlášen(a). Přihlásit
Zdravím. Chtěl bych se zeptat, zda víte o nějakém druhu AI/ML modelu, který je schopný rozpoznat vztahy mezi čísly. Možná by to umělo funkcionální progamování??? Ale nedokázal jsem přijít na to, jak to udělat.
Např. mám binární y (1 nebo 0) a 10 celočíselných kladných X 1-12. Mezi y a x je vztah takový, že pokud je y=1, tak součet x dohromady je dělitelný 7 beze zbytku, pokud je y=0, tak součet x dohromady je dělitelný 8 beze zbytku.
Celkem jednoduchý vztah, ale pokud se to řeší běžnými ML modely, tak ty to řešit nedokážou.
(Kod vygenerovaný ve spolupráci s ChatGPT)
import numpy as np import pandas as pd # Set random seed for reproducibility np.random.seed(42) # Function to generate a row with the given constraint for y def generate_row(y): while True: x = np.random.randint(1, 13, size=10) if y == 1 and np.sum(x) % 7 == 0: return list(x) + [y] elif y == 0 and np.sum(x) % 8 == 0: return list(x) + [y] # Generate the dataset data = [] for _ in range(500): # We want equal number of 1s and 0s data.append(generate_row(1)) data.append(generate_row(0)) # Convert to a DataFrame df = pd.DataFrame(data, columns=[f'x{i}' for i in range(1, 11)] + ['y']) # Shuffle the DataFrame df = df.sample(frac=1).reset_index(drop=True) # Save to a CSV file df.to_csv('dataset.csv', index=False)
from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier, ExtraTreesClassifier from xgboost import XGBClassifier from catboost import CatBoostClassifier from sklearn.linear_model import LogisticRegression from sklearn.svm import SVC from sklearn.neighbors import KNeighborsClassifier from sklearn.tree import DecisionTreeClassifier from sklearn.naive_bayes import GaussianNB from keras.models import Sequential from keras.layers import Dense # Load the dataset df = pd.read_csv('dataset.csv') # Split the dataset into features and target variable X = df.drop('y', axis=1) y = df['y'] # Split the dataset into training and testing sets X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # Define models models = { 'RandomForest': RandomForestClassifier(), 'GradientBoosting': GradientBoostingClassifier(), 'ExtraTrees': ExtraTreesClassifier(), 'XGBoost': XGBClassifier(use_label_encoder=False, eval_metric='logloss'), 'CatBoost': CatBoostClassifier(verbose=0), 'LogisticRegression': LogisticRegression(max_iter=1000), 'SVM': SVC(), 'KNN': KNeighborsClassifier(), 'DecisionTree': DecisionTreeClassifier(), 'NaiveBayes': GaussianNB() } # Train and evaluate models accuracies = {} for name, model in models.items(): model.fit(X_train, y_train) y_pred = model.predict(X_test) accuracy = accuracy_score(y_test, y_pred) accuracies[name] = accuracy print(f'{name} accuracy: {accuracy:.4f}') # Keras model model = Sequential() model.add(Dense(12, input_dim=10, activation='relu')) model.add(Dense(8, activation='relu')) model.add(Dense(1, activation='sigmoid')) model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) model.fit(X_train, y_train, epochs=100, batch_size=10, verbose=0) _, accuracy = model.evaluate(X_test, y_test) accuracies['Keras'] = accuracy print(f'Keras accuracy: {accuracy:.4f}') # Print all accuracies print("\nAll model accuracies:") for name, accuracy in accuracies.items(): print(f'{name}: {accuracy:.4f}')
Výsledek je:
RandomForest accuracy: 0.4900
GradientBoosting accuracy: 0.4500
ExtraTrees accuracy: 0.4500
XGBoost accuracy: 0.4700
CatBoost accuracy: 0.4800
LogisticRegression accuracy: 0.5000
SVM accuracy: 0.5150
KNN accuracy: 0.5150
DecisionTree accuracy: 0.4450
NaiveBayes accuracy: 0.5050
a pro keras:
Keras accuracy: 0.5150
Offline
↑ pseudohuber:
Ahoj, o jaké vztahy mezi čísly ti jde? A mezi reálnými nebo přirozenými? Komplexními?... Mezi každými dvěma čísly je nějaký vztah, např. mezi 33 a 5 je např. vztah, že se liší o 28....
Offline
check_drummer napsal(a):
↑ pseudohuber:
Ahoj, o jaké vztahy mezi čísly ti jde? A mezi reálnými nebo přirozenými? Komplexními?... Mezi každými dvěma čísly je nějaký vztah, např. mezi 33 a 5 je např. vztah, že se liší o 28....
Viz jak sem psal výše, jde mi v zásadě o klasifikaci - binární y a řada více X, třeba 10, čísla jsou většinou reálná. Příkladem toho vztahu je, že je-li součet 10 X dělitelný 7 beze zbytku, y = 1 a je-li součet 10 X dělitelný 8 beze zbytku, y = 0.
Offline
Aleš13 napsal(a):
Takže vyrábíš nějakou obdobu Ramanujan machine?
Pokoušel jsem se googlovat, co to je... no a jako až zas takové ambice nemám :D V první řadě bych nerad něco sám "vyráběl", určitě nebudu vyvíjet nějaký modely... na to nemám znalosti, schopnosti ani čas.
Prostě bych rád našel nějakej software, který by uměl typově řešit to, co sem napsal výše, aby pak v tom software stačilo napsat kod.
Offline
↑ pseudohuber:
Vždyť ty jsoi vůbec nenapsal jaká čísla jsou zadaná a jaká čísla hledáš... napsal jsi jen že máš dána nějaká čísla x,y, která splňují nějaké vztahy - ale co dál?
Offline
check_drummer napsal(a):
↑ pseudohuber:
Vždyť ty jsoi vůbec nenapsal jaká čísla jsou zadaná a jaká čísla hledáš... napsal jsi jen že máš dána nějaká čísla x,y, která splňují nějaké vztahy - ale co dál?
Moc nerozumím na to, na co se ptáš. Záleží na tom, jestli v tom x jsou čísla jako int nebo jako float? Nebo záleží na tom, jestli to jsou int třeba v intervalu1-12 nebo 1-100? Nebo myslíš něco jiného?
Zadaný je dataset a mým cílem je mít kod, který ten dataset umí zpracovat do té míry, aby se na základě odhalených vztahů daly předpovídat unseen data. Postup je typicky ten, že se ten dataset náhodně rozdělí na části train a test, třeba 80% a 20% a na základě těch 80% se předpovídá zbývajících 20%. Ale toto jsou základy, které určitě znáš.
Offline
↑ pseudohuber:
Takže je potřeba říct - co máš za vstupy a čeho chceš dosáhnout.
Jenom mi to připomíná trošku hádanky jakým číslem pokračuje posloupnost - pokud si myslíš, že v posloupnosti 1,2,3,4,.. následuje číslo 5 a jinak to být nemůže, tak buď tu zbytečně trávíme čas nebo musíš lépe specifikovat co máš na mysli pod těmi "odhalenými vztahy" - protože jak jsem psal na začátku - vztahů mezi zadanými čísly může existovat nekonečně mnoho....
Takže ještě jednou - jaká čísla máš zadána a jaké vztahy chceš "odhalit"?
Offline
check_drummer napsal(a):
↑ pseudohuber:
Takže je potřeba říct - co máš za vstupy a čeho chceš dosáhnout.
Jenom mi to připomíná trošku hádanky jakým číslem pokračuje posloupnost - pokud si myslíš, že v posloupnosti 1,2,3,4,.. následuje číslo 5 a jinak to být nemůže, tak buď tu zbytečně trávíme čas nebo musíš lépe specifikovat co máš na mysli pod těmi "odhalenými vztahy" - protože jak jsem psal na začátku - vztahů mezi zadanými čísly může existovat nekonečně mnoho....
Takže ještě jednou - jaká čísla máš zadána a jaké vztahy chceš "odhalit"?
Co přesně mám napsat mimo toho, co jsem napsal v prvním příspěvku?
Např. mám binární y (1 nebo 0) a 10 celočíselných kladných X 1-12. Mezi y a x je vztah takový, že pokud je y=1, tak součet x dohromady je dělitelný 7 beze zbytku, pokud je y=0, tak součet x dohromady je dělitelný 8 beze zbytku.
Pro upřesnění: popsaný vzah mezi y a 10 x je na jednom řádku datasetu. V datasetu je např. 1000 řádků, 500 pro každé y. Čísla jsou vygenerována náhodně, ale splňují ty podmínky.
Offline
↑ pseudohuber:
Ty jsi v prvním příspěvku napsal "například" - ale zadání přece s žádným "například" operovat nemůže - maximálně tím můžeš iluistrovat čeho je požadováno dosáhnout.
Tedy v prvním příspěvku operuješ s vlastností dělitelnosti 7 - zajímají tě pouze takovéto vztahy (dělitelnost 7)? Pokud ne, tak prosím formuluj zadání přesněji (obecněji).
Offline
↑ pseudohuber:
Som z toho volaaký zmatený.
>> Např. mám binární y (1 nebo 0) a 10 celočíselných kladných X 1-12. Mezi y a x je vztah takový, že pokud je y=1, tak součet x dohromady je dělitelný 7 beze zbytku, pokud je y=0, tak součet x dohromady je dělitelný 8 beze zbytku.
Celočíselných kladných 1 - 12 je dvanáct, součet je 78, není dělitelný ani sedmi, ani osmi a s nějakým y to nemá nic společného. Velké X je totéž, co malé x, anebo je to něco jiného?
Vůbec nevím, o co ti jde, a nejspíš nejsem sám. Prvním předpokladem správného řešení je správné pochopení zadání. Bez toho to nejde.
Offline
check_drummer napsal(a):
↑ pseudohuber:
Ty jsi v prvním příspěvku napsal "například" - ale zadání přece s žádným "například" operovat nemůže - maximálně tím můžeš iluistrovat čeho je požadováno dosáhnout.
Tedy v prvním příspěvku operuješ s vlastností dělitelnosti 7 - zajímají tě pouze takovéto vztahy (dělitelnost 7)? Pokud ne, tak prosím formuluj zadání přesněji (obecněji).
Obecně vzato mě zajímá, jestli existuje AI/ML model, který by dokázal odhalit "vztah mezi čísly" (tzn. mezi y a řadou x), když ten vztah existuje a platí bez výjimky ve všech případech (a třeba ani neví kdovíjak složitý), ale není vyjádřitelný korelací (mezi y a jednotlivými x), neplatí v něm korelace. Tedy takový vztah není "statistický". To, co jsem napsal výše, byl jeden příklad z obrovského množství takových možných vztahů.
Offline
Eratosthenes napsal(a):
↑ pseudohuber:
Som z toho volaaký zmatený.
>> Např. mám binární y (1 nebo 0) a 10 celočíselných kladných X 1-12. Mezi y a x je vztah takový, že pokud je y=1, tak součet x dohromady je dělitelný 7 beze zbytku, pokud je y=0, tak součet x dohromady je dělitelný 8 beze zbytku.
Celočíselných kladných 1 - 12 je dvanáct, součet je 78, není dělitelný ani sedmi, ani osmi a s nějakým y to nemá nic společného. Velké X je totéž, co malé x, anebo je to něco jiného?
Vůbec nevím, o co ti jde, a nejspíš nejsem sám. Prvním předpokladem správného řešení je správné pochopení zadání. Bez toho to nejde.
Součástí dotazu byl i kód v Pythonu, na který jsem předpokládal, že se čtenář podívá. (Kód není kdovíjak složitý.) Myšlena je kombinace deseti náhodných čísel v rozsahu 1 až 12. Co se týče rozdílu mezi velkým X a malým x, nerozumím otázce, ale předesílám, že vůbec nejsem matematik.
Offline
Takže žádné vztahy mezi čísly, ale úkolem je aby čtenář porozuměl kódu.
Ale jak to tak poslouchám, když zadavatel ani po opakovaných výzvách není schopen vysvětlit co řeší, tak to asi znamená, že to ani on sám neví...
Offline
Ale zkusím to ještě jednou a naposled:
Každý "rozumný" program, tedy takový, který řeší nějaký problém, dostane na vstupu nějakou sadu dar a má za úkol s ní něco provést - buď pro ní něco spočítat nebo rozhodnout zda platí nějaké tvrzení, a podobně. Ale u tohoto problému jsme se to zatím nedozvěděli co má být cílem a ani pořádně co je vstupem...
Offline
↑ pseudohuber:
Na kód jsem se nedíval, Python neumím.
Zatím jsem pochopil, že na vstupu máš deset náhodných čísel větších než nula a menších než třináct (předpokládám, že přirozených), tj. např 7, 5, 11, 2, 9, 4, 10, 1, 6, 8.
Co s tím vstupem chceš udělat, nebo co chceš zjistit?
Offline
check_drummer napsal(a):
Ale zkusím to ještě jednou a naposled:
Každý "rozumný" program, tedy takový, který řeší nějaký problém, dostane na vstupu nějakou sadu dar a má za úkol s ní něco provést - buď pro ní něco spočítat nebo rozhodnout zda platí nějaké tvrzení, a podobně. Ale u tohoto problému jsme se to zatím nedozvěděli co má být cílem a ani pořádně co je vstupem...
Už před týdnem jsem psal, že se jedná o klasifikaci. Cílem tedy evidentně je provádět klasifikaci, rozhodovat, zda pro daná x je y 1 nebo 0. Tedy programu se zadá část datasetu, např. 800 z 1000 řádků, on by se měl naučit rozpoznat pravidlo vztahu y a x a na základě toho pak předpovídat y u zbývajících 200 řádků.
Offline
Eratosthenes napsal(a):
↑ pseudohuber:
Na kód jsem se nedíval, Python neumím.
Zatím jsem pochopil, že na vstupu máš deset náhodných čísel větších než nula a menších než třináct (předpokládám, že přirozených), tj. např 7, 5, 11, 2, 9, 4, 10, 1, 6, 8.
Co s tím vstupem chceš udělat, nebo co chceš zjistit?
Když neumíš Python, tak je otázka, zda znáš základy ML/AI. Jedná se o typickou klasifikační úlohu. Nejedná se o triviální dotaz, jak napsat kód, který by sečetl čísla na řádku a zjistil, zda jsou dělitelná 7 nebo 8 !!
Na vstupu máš dataset, který má 1000 řádků. Každý řádek obsahuje 11 čísel, 1. číslo je y a zbývajcích 10 je x (x1, x2, x3) atd. Pro všechny data na 1000 řádcích platí, že y je buď 1 nebo 0 a pokud y=1, tak součet těch x na řádků (x1 až x10) je dělitelný 7 beze zbytku, tam kde y=0, tak součet x dohromady je dělitelný 8 beze zbytku.
Programu se zadá náhodných 800 z těch 1000 řádků, on se má naučit odhalit tu popsanou zákonitost a pak by měl u zbývajících 200 řádků s vysokou přeností rozhodovat, zda y je 1 nebo 0. (U testu se mu samozřejmě zadají jen ty x)
Jak už jsem psal, ten program tu popsanou zákonitost "nezná" ! Musí jí sám odhalit. Řešení není triviální funkce, která by sečetla čísla a rozhodla, zda je součet dělitelný 7 nebo 8.
Offline
pseudohuber napsal(a):
Na vstupu máš dataset, který má 1000 řádků. Každý řádek obsahuje 11 čísel, 1. číslo je y a zbývajcích 10 je x (x1, x2, x3) atd. Pro všechny data na 1000 řádcích platí, že y je buď 1 nebo 0 a pokud y=1, tak součet těch x na řádků (x1 až x10) je dělitelný 7 beze zbytku, tam kde y=0, tak součet x dohromady je dělitelný 8 beze zbytku.
Programu se zadá náhodných 800 z těch 1000 řádků, on se má naučit odhalit tu popsanou zákonitost a pak by měl u zbývajících 200 řádků s vysokou přeností rozhodovat, zda y je 1 nebo 0. (U testu se mu samozřejmě zadají jen ty x)
Tak konečně známe zadání.
A co když zadáme dataset, kde součet není dělitelný ani 7 ani 8 beze zbytku - jaká hodnota y je pak očekávána?
A teď teda to hlavní - o jaké zákonitosti se jedná? Nebo-li jaké všechny typy zákonitostí má ten program umět rozpoznávat?
Offline
Možná by se dalo formulovat nějaké "metatvrzení": Je-li problém dostatečně složitý, pak neexistuje algoritmus, který ho řeší.
Ale v tomto případě zatím ani nevíme, zda je problém složitý, protože v zadání chybí jaké typy vztahů máme hledat, to je potřeba upřesnit.
Offline
Nerozumím tomu, proč je zadáno 10 čísle a ne třeba jedno nebo dvě (která se sečtou), pak by se testovací množina dala připravit stejně a bylo by to jednodušší.
Offline
check_drummer napsal(a):
pseudohuber napsal(a):
Na vstupu máš dataset, který má 1000 řádků. Každý řádek obsahuje 11 čísel, 1. číslo je y a zbývajcích 10 je x (x1, x2, x3) atd. Pro všechny data na 1000 řádcích platí, že y je buď 1 nebo 0 a pokud y=1, tak součet těch x na řádků (x1 až x10) je dělitelný 7 beze zbytku, tam kde y=0, tak součet x dohromady je dělitelný 8 beze zbytku.
Programu se zadá náhodných 800 z těch 1000 řádků, on se má naučit odhalit tu popsanou zákonitost a pak by měl u zbývajících 200 řádků s vysokou přeností rozhodovat, zda y je 1 nebo 0. (U testu se mu samozřejmě zadají jen ty x)Tak konečně známe zadání.
A co když zadáme dataset, kde součet není dělitelný ani 7 ani 8 beze zbytku - jaká hodnota y je pak očekávána?
A teď teda to hlavní - o jaké zákonitosti se jedná? Nebo-li jaké všechny typy zákonitostí má ten program umět rozpoznávat?
Pokud modelu, který je trénovaný na tom datasetu se součty x dělitelnými 7 nebo 8 potom zadáš na predikce dataset, který ty vztahy neobsahuje, tak je irelevantní, jaký výsledky dává. Potřeba je, aby uměl správně klasifikovat ty případy, které ty podmínky splňují, nemusí umět nic jiného. (Jako pokud by u vztahů, které to nesplňují, dával hodnotu třeba -1, tak by to bylo hezké, ale není to věc, kterou bych vyloženě požadoval).
Jinak těm zákonitostem se asi typově říká "kategorická pravidla" nebo "logická pravidla" (?) Ty mohou být buď jednoduchý nebo složený. Dá se to omezit tak, že stačí když to bude schopné rozpoznávat pravidla složená třeba z max. 5 jednoduchých pravidel.
Offline
check_drummer napsal(a):
Nerozumím tomu, proč je zadáno 10 čísle a ne třeba jedno nebo dvě (která se sečtou), pak by se testovací množina dala připravit stejně a bylo by to jednodušší.
V reálném světě těch čísel bude mnohem víc než 10.
Offline
pseudohuber napsal(a):
Jinak těm zákonitostem se asi typově říká "kategorická pravidla" nebo "logická pravidla" (?) Ty mohou být buď jednoduchý nebo složený. Dá se to omezit tak, že stačí když to bude schopné rozpoznávat pravidla složená třeba z max. 5 jednoduchých pravidel.
Tak prosím uveď co se myslí tím "jednoduchým pravidlem". A jakým způsobem je povoleno skládat jednoduchá pravidla do složených pravidel.
Offline
↑ pseudohuber:
Ano, ale tady zkoušíme model, ne reálnou situaci - proto by asi bylo lepší začít s jednoduššším případem.
Offline