Instrukcje dostępne w języku R (ale też w innych), po cichu zakładają, że dane na jakich pracują są czyste. Pisząc czyste, mam na myśli o ustalonej strukturze. Niestety, może się zdarzyć, że jedna linijka znajdująca się gdzieś pośrodku jest… uszkodzona. Pobranie całego pliku kończy się wtedy błedem. Oto przykład:
> cars <- fread(
+ input ='https://archive.ics.uci.edu/ml/machine-learning-databases/auto-mpg/auto-mpg.data',
+ header = F,
+ sep = ' ',
+ na.strings = '?',
+ fill = T)
[0%] Downloaded 0 bytes...
Warning message:
In fread(input = "https://archive.ics.uci.edu/ml/machine-learning-databases/auto-mpg/auto-mpg.data", :
Stopped early on line 293. Expected 12 fields but found 13. Consider fill=TRUE and comment.char=.
First discarded non-empty line: <<18.5 8 360.0 150.0 3940. 13.0 79 1 "chrysler lebaron town @ country (sw)">>
Gdyby takie dane były dostarczane przez np. inny dział firmy, najprościej byłoby się z nimi skontaktować i zwrócić uwagę na nieprawidłowo utworzony plik. Jeśli jednak takiej możliwości nie ma… można próbować obejść problem.
Propozycja nr 1 – opuśćmy uszkodzoną linijkę
Skorzystamy z parametrów nrow (ile wierszy pobrać) oraz skip (ile opuścić). Aby pobrać pierwsze 292 wiersze uruchom
Po uruchomieniu setup.exe w celu instalacji aktualizacji, nic się nie dzieje. Wygląda na poważny problem z .NET lub zabezpieczeniami antywirusowymi, które uniemożliwiają uruchomienie programu
Troubleshooting:
Nawet kiedy wygląda, że nic się nie dzieje, to coś się jednak dzieje. Setup.exe powinien w katalogu wskazywanym przez zmienną środowiskową %temp% tworzyć pliki log, z zapisem wykonywanych czynności i napotykanych błędów.
1. Kliknij start >> run i wpisz %temp%
2. W oknie wyszukaj plików/katalogów z datą modyfikacji z chwili próby uruchomienia setup.exe
3. W moim przypadku znalazł się plik sqlsetup.log z zapisami:
W uczeniu maszynowym często wykonujemy operacje na macierzach (wektor to też przykład macierzy, tylko że jeden z wymiarów wynosi 1). Cchcemy takie operacje wykonywać, gdzie tylko się da przy pomocy funkcji z modułu numpy, bo tak jest efektywniej!
Matematyka jest bezlitosna. Istnieją pewne określone reguły, określające warunki kiedy na macierzach można wykonywać operacje:
aby dodać do siebie macierze/wektory, muszą one mieć takie same wymiary
aby pomnożyć przez siebie dwie macierze, pierwsza z nich musi mieć tyle kolumn, co druga wierszy
Tymczasem u nas te warunki nie zawsze będą spełnione. Można się jednak „umówić”, co do tego jak wykonywać operacje, których, matematycznie rzecz ujmując, nie można wykonywać. Taki mechanizm w numpy nosi nazwę broadcasting, bo określa on, jak należy powiększyć mniejszą macierz do rozmiarów pasujących do większej macierzy, aby w intuicyjny sposób wykonać operację na macierzach.
Żeby uniknąć matematycznego hejtu, na usprawiedliwienie należy dodać, że broadcasting-u można by uniknąć. W takim przypadku programista musiałby po prostu samodzielnie dbać o to, żeby macierze miały właściwe rozmiary. Taka praca, nie dość że nudna, to jeszcze spowoduje znaczne użycie pamięci. Dlatego tak się palimy do zautomatyzowanego i zoptymalizowanego procesu broadcastu. Czytaj dalej »
Błąd pojawiał się na Centos 8 zainstalowanym pod Hyper-V. Cała instalacja przebiegła pomyślnie, ale po restarcie pokazywał się tylko komunikat
FATAL: no config space access function found
Co bardzo ważne, serwer był instalowany razem z grafiką i to właśnie problem z którymś ze sterowników powodował błąd. Wystarczyło przełączyć się do innej konsoli (CTRL+ALT+F2) i zaktualizować:
yum update
Inna kwestia, że oprócz nie działającej grafiki, również i klawiatura działała wolno…. dlatego zdecydowałem się uruchomić serwer w run level 3
Podczas instalacji Centos na Windows 10 z HyperV pojawil się komunikat:
The image’s hash and certificate are not allowed (DB)
Plik z instalają był pobrany z pewnego źródła, więc komunikat był trochę zastanawiający….
Przyczyną była opcja „Enable Secure Boot”, która jest domyślnie zaznaczona na nowej maszynie wirtualnej. Żeby ją wyłaczyć należy wejść w ustawienia maszyny wirtualnej, w sekcji Security odszukać zaznaczonej opcji „Enable Secure Boot”, odznaczyć ją, zapisać zmiany i gotowe!
Zaczynamy od zainstalowania pakietu pixiedust. W tym celu w anaconda prompt wykonaj polecenie:
pip install pixiedust
Teraz już w Jupyter Notebook należy załadować moduł odpowiedzialny za debugowanie:
import pixiedust
Kiedy chcesz rozpocząć debugowanie kodu dodaj do niego linijkę %%pixie_debugger, o tak:
%%pixie_debugger
i = 1
while i < 10:
print(i)
i += 3
if i % 2 == 0:
i -= 2
print('done i={}'.format(i))
Po uruchomieniu tej komórki, zostanie pod nią wyświetlony interfejs debuggera:
Nie wchodząc zbytnio w szczegóły pierwszy pomarańczowy przycisk uruchamia kod dalej (run), drugi - ze strzałką wykonuje jedną linijkę kodu itd. Warto po prostu poczytać dymki widoczne w tych raptem kilku widocznych poleceniach.
Kiedy chesz sprawdzić wartość wyrażenia korzystasz z evaluate:
A kiedy chcesz zatrzymać program w określonej linijce, kliknij na numerze tej linijki myszką. W ten sposób zdefiniujesz breakpoint symbolizowany ikonką rozdeptanego robaka na marginesie. Numer linii będzie można też zobaczyć w okienku Breakpoints.
I co? Nie da się? Da się, tylko może jest potrzebnych kilka dodatkowych kroków!
W Pythonie występuje funkcja globals(), która zwraca tablicę przechowującą wszystkie zmienne sesji. Kiedy chcesz utworzyć nową zmienną, możesz po prostu dodać nowy element do tej listy
for i in range(0, 3):
globals()['var_{}'.format(i)] = i * 100
print(var_0, var_1, var_2)
Tutaj przechodzimy pętlą for przez kod 3 razy i tworzymy zmienne o nazwach var_0, var_1 i var_2. Żeby się przekonać, że instrukcja wykorzystująca funkcję globals działa, wyświetlamy zmienne podając ich statyczne nazwy, jakie na tym etapie wykonania kodu powinny już istnieć.
Zależnie od wykorzystywanego edytora, przy linijce zawierającej ten kod może się pojawić ostrzeżenie:
Skoro ta metoda jest taka zła, to czego używać zamiast tego? Można by próbować z listą:
my_list = []
for i in range(0, 3):
my_list.append(i * 100)
print(my_list[0], my_list[1], my_list[2])