Friday, March 30, 2018

Basit, Hızlı Diske Değer Yazma Okuma

Bir Python uygulaması için  basit, hızlı bir şekilde diske yazılabilen, ve istendiği zaman anahtar bazlı, tüm dosyayı hafızaya getirmeden hızlı şekilde okunabilen bir yapıya ihtiyaç vardı. Çözüm için önce Python'un sözlük (dictionary) yapısının diske yazılmasına izin veren çözümler akla geliyor, ki muhakkak o çerçevede pek çok çözüm var. Fakat bir çözüm var ki Python kurulumunun zaten içinde, tek bir dosyaya yönlendirilebilen depolaması mevcut, ve her yazımın diske gitmesini, ve hızlı okunabilmesini sağlıyor.

Bu yazılım sqlite3'ten başkası değil. Eğer az SQL yazmayı göze alırsak, ki bu dili tüm bilişimciler bilir, sqlite3 üstteki tüm ihtiyaçlara cevap verir. Test edelim,

import sqlite3
db = sqlite3.connect('/tmp/mydb.db')
import random

cursor = db.cursor()
cursor.execute('''CREATE TABLE users(id INTEGER PRIMARY KEY, name TEXT,
                  phone TEXT, email TEXT, password TEXT)
       ''')
db.commit()

cursor = db.cursor()
name1 = 'Andres'
phone1 = '3366858' 
email1 = 'user@example.com' + str(random.random())
password1 = '12345'
print (email1)
cursor.execute('''INSERT INTO users(name, phone, email, password)
                  VALUES(?,?,?,?)''', (name1,phone1, email1, password1))
db.commit()

Taban tek bir dosya, hangisi olacağını biz tanımladık, gayet basit.  Üstteki insert komutunu ardı ardına işletelim ve arada sırada /tmp/mydb.db dosyasına bakalım. Bu dosya içinde yaratılan farklı isimleri göreceğiz. Dosya büyüklüğünü kontrol etmek ise yaramayabilir çünkü sqlite taban dosyasını her yazimda degil, belli aralıklarla büyütüyor. 

Arada satır sayısını alttaki ile kontrol edebiliriz,

cursor = db.cursor()
cursor.execute('''SELECT count(*) FROM users''')
print (cursor.fetchone())

Taban iş bitince db.close ile kapatılır. Fakat düzgün kapatılmasa bile commit ile yazılanlar kaybolmayacaktır, yani süreç çökse, tekrar tabana dönsek en son yazdığımız satırı orada bulacağız. 

Bu tüm ihtiyaçları karşılıyor, farklı bir süreçte işleyen büyük bir taban değil, kurulmasına bile gerek yok zaten Python sürümünde var, ayrıca diske yazım var, hızlı okuma (herşeyi hafızaya getirmeden) destekleniyor. 

Monday, March 26, 2018

Veri Taban İçeriğini Gezmek

Eğer veri tabanı, içindeki tabloları, bu tablolardaki bazı verileri görmek istersek, GUİ araçları yerine bir jupyter not defteri üzerinden kod işletmeyi seçebiliriz. Taban erişimi için psycopg2 iş görür. Bağlantı aldıktan sonra (Postgresql olsun),

import psycopg2

conn = psycopg2.connect(
    host='[makina]',
    database='[taban]',
    user='[kullanici]',
    password='[sifre]',
    port=port
)

şu metotlarla taban içeriği gösterilebilir

import psycopg2

sql = "SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'"

def get_tables(con):
    """
    Tum tablolari goster
    """    
    cursor = con.cursor()
    res = []
    cursor.execute(sql)
    for table in cursor.fetchall():
        res.append(table)
    return res

def get_table_col_names(con, table_str):
    """
    Tablo kolon isimlerini al
    """
    col_names = []
    try:
        cur = con.cursor()
        cur.execute("select * from " + table_str + " LIMIT 0")
        for desc in cur.description:
            col_names.append(desc[0])        
        cur.close()
    except psycopg2.Error as e:
        print (e)
    return col_names

def get_sample(con, table_str):
    """
    Tablodan rasgele satirlar goster
    """
    res = []
    try:        
        cur = con.cursor()
        cur.execute("select * from " + table_str + " ORDER BY RANDOM() LIMIT 10")
        for x in cur: res.append(x)
        cur.close()
    except psycopg2.Error as e:
        print (e)
    return res

def get_count(con, table_str):
    """
    Tabloda kac satir var
    """    
    res = []
    try:        
        cur = con.cursor()
        cur.execute("select count(*) from " + table_str)
        res = cur.fetchone()
        cur.close()
    except psycopg2.Error as e:
        print (e)
    return res

Jupyter not defterinde bildiğimiz gibi etkileşimli (interactive) bir şekilde kod yazılabiliyor, bir hücrede yazılan kodu hemen işletip doküman içinde görüyoruz.. Eh böyle olunca üstteki çağrıları istedigimiz tablo üzerinde yapınca sanki GUİ araçından taban içeriğini gezmis oluyoruz.

Jupyter kurmak istemeyenler, direk markdown md dosyaları içinden üstteki işlemleri yapmak isteyenler (ve Emacs kullanıcıları) bizim eklentiyi kullanabilir.

Thursday, February 22, 2018

Elde Olmayan Eğitim Verisi

Kaggle sitesinde pek çok veri bilimcinin bildiği üzere veri bilim yarışmaları düzenleniyor. Mesela geçende bir tanesi basit ses komutlarını tanımak (Tensorflow kullanarak) hakkındaydı.

https://www.kaggle.com/c/tensorflow-speech-recognition-challenge

Eğitim verisi sağlanmış, yani etiketleriyle beraber ses verisi (mesela bir wav ses dosyası ve onun hangi komut olduğu, "yes", "no" gibi) bir de test verisi var, bu veri için etiket verilmemiş, sadece ses kaydı. Yarışmacı eğitim verisi üzerinde eğitim yapacak test verisi üzerinde bu modeli kullanıp etiket üretecek, ve Kaggle sitesine kontrol için verecek - sistem hemen başarıyı ölçüyor, kısa sürede cevap sağlıyor.

Yarışmacılar eğitimi yaparken tabii ki eğitim verisini alıp onun içinden kendileri bir test verisi yaratıyorlar, ki skorun gerçekten ne olabileceğini görebilsinler, model "ezberliyorsa" onu hemen anlayabilsinler, bu standart bir teknik. Fakat bazı yarışmacılar farkediyor ki eğitim / kendi test verilerinde elde edilen başarı Kaggle'dan gelen cevabın %10-15 gerisinde! Bu demektir ki Kaggle'ın sağladığı test verisi eğitim verisinden çok farklı. Yarışmacıdan beklenen ses verisini değiştirip, gürültü ekleyip, kaydırıp vs yeni eğitim verisi "üretmesi" ve böylece başarısını arttırması.

Bu durumun gerçek dünya şartlarını pek yansıtmadığını söylemek gerekir. Genelde modeller eldeki veri neyse onun üzerinde eğitilir, yani "gelecekte ne olabilir" türündeki spekülasyona girilmez. Eğer girilebiliyorsa o veri de elde vardır demektir ve eğitim verisi o'dur. Kaggle'ın yaptığı resimden kedi tanıyan bir yarışmada test verisinde üç, dört kulaklı kedilere hazır olunmasını istemek gibi.

Fakat gerçek dünyada şu olur: kullanılmış dış dünyadan gelen / gelmis veri değişmeye başlayabilir, bu duruma hazır olunması gerekir ki böylece bu yeni veriyle tekrar eğitim yapılsın, modeller güncellensin. O değişimi yakalamak için rutinler yazılabilir, vs. Fakat bu durum spekülatif şekilde elde olmayan veriye göre eğitmekten farklı.

Thursday, February 8, 2018

Go Oyunu, GnuGo

Ubuntu'da GnuGo kurmak icin

apt-get install gnugo

Go oyun kurallari

https://www.dropbox.com/s/xfcimo9ojhq3l2l/go.pdf?dl=1

Oyunu oynamak icin ornek bir komut

gnugo --level 10 --board 9

Bilgisayar 10 seviyesinde (en kolay) ve 9x9 boyutlarinda bir tahtada oyun baslar. Hamleler c4, b1 gibi kordinatlarla verilir.

GnuGo ile iletisim kurabilecek bir Python arayuzu surada bulunabilir. Ornek kullanim,

gnugo = gtp.GTPFacade("white", ["gnugo", "--mode", "gtp", "--level", "10"])
gnugo.boardsize(9)
gnugo.komi(5.5)
gnugo.clear_board()

res = gnugo.genmove(gtp.WHITE)
print 'res', res
gnugo.showboard()       

Wednesday, January 10, 2018

Marioflow