Skip to content

Instantly share code, notes, and snippets.

@gunungloli666
Created May 3, 2012 13:47
Show Gist options
  • Save gunungloli666/2585758 to your computer and use it in GitHub Desktop.
Save gunungloli666/2585758 to your computer and use it in GitHub Desktop.
perogram yang g' bisa selesai-selesai......
import numpy as np
from numpy import linalg as LA
import pylab as p
import csv
import math
import time
import random as r
import sys, os, csv
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import matplotlib
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt4agg import NavigationToolbar2QTAgg as NavigationToolbar
from matplotlib.figure import Figure
'''membuka file dalam txt... mungkin kurang efisien but whatever lah...
yang penting jalan'''
def open_file(s):
A = []
f = open(s, 'r')
rr = csv.reader(f, delimiter='\t')
for row in rr:
A.append(row)
for i in xrange(len(A)):
for j in xrange(len(A[0])):
A[i][j] = float(A[i][j])
return A
def matriks_a(A):
a = len(A)
b = len(B)
result = np.zeros((a+1,a+1))
for i in xrange(len(A)+1):
print i
'''
eksperimental variogram
A koordinat, B nilai data, lag = lag atau vektor jarak, tol = toleransi dari lag
'''
def variogram(A,B, lag, tol):
if tol<0: tol = tol*(-1)
a = len(A)
b = len(lag)
result = np.zeros((b))
lag_max = lag + tol # pastikan lag berupa numpy array, bukan list biasa
lag_min = lag - tol # agar operasi ini bisa jalan
count = np.zeros((b))
for i in xrange(a):
for j in xrange(i+1,a):
c = hitung_jarak(A[i], A[j])
for k in xrange(b):
if (c>=lag_min[k])and(c<=lag_max[k]):
result[k] += math.pow(B[i]-B[j],2)
count[k]+=1
for i in xrange(b):
result[i] = result[i]/(2*count[i])
return (result)
'''untuk menghitung variogram teori'''
def semivar(x, tipe, C1, C2,h, a):
if tipe == 0: # tipe linear
return C0+C1*h
elif tipe ==1: # tipe bola
if (h>=0) and (h<=a):
return C0+C1*(1.5*(h/a)-0.5*math.pow(h/3,3))
elif h > 0:
return C0 + C1
elif tipe == 2: # tipe eksponensial
# gunakan math.pow ketimbang pangkat (**) biar hasilnya lebih akurat
return C0 + C1*(1-math.exp(-h/a)
elif tipe == 3: # tipe gaussian
return C0+C1*(1-math.exp(-1*math.pow((h/a),2)))
'''menentukan parameter-parameter bagi nilai koefisien semivariogram dengan
lavenberg-marquardt,
A = menyatakan data eksperimen, B menyatakan vektor tampungan parameter awal'''
def lav_mer(A,B,):
print ''
'''
A menyatakan koordinat, B value, lag = vektor lag, tol = toleransi lag
'''
# iterasi berikut sangat tidak efiesien, mestinya ditulis dengan bahasa lain, Kalo Bisa
# def variogram(A,B,lag, tol):
# a = len(A)
# b = len(lag)
# if tol <0: tol = tol*(-1)
# lag_max = lag+tol
# lag_min = lag-tol
# result = np.zeros((b))
# for i in xrange(b):
# m = 0
# for j in xrange(a):
# for k in xrange(a):
# c = hitung_jarak(A[j], A[k])
# if (c>=lag_min)and (c<=lag_max):
# result[i]+= math.pow(B[j]-B[k],2)
# m+=1
# result[i]= math.sqrt(result[i])/(2*m)
# return result
def hitung_jarak(self,a,b):
return math.sqrt(math.pow(a[0]-b[0], 2)+math.pow(a[1]-b[1],2))
def var_model():
print ''
class Krig:
def __init__(self, A,B):
if len(A)!= len(B):
raise Data_Error('panjang a dan b tidak sama')
self.A = np.array(A)
self.B = np.array(B)
self.c = len(self.A)
self.matriks_alfa = self.build_matriks_1()
def get_len(self, A):
return len(A)
def get_matriks_alfa(self):
return self.matriks_alfa
def matriks_to_float(self,A): #tidak berguna
for i in xrange(len(A)):
for j in xrange(len(A[0])):
A[i][j] = float(A[i][j])
return A
def build_matriks(self, A, var):
result = np.zeros((len(A)+1, len(A)+1))
for i in xrange(len(A)):
for j in xrange(len(A)):
result[i,j] = hitung_jarak(A[i], A[j])
for i in xrange(len(A)):
result[len(A),i] = result[i, len(A)] = 1
return result
def start_krig(self,A):
result = 0
a = len(self.A)
matriksB = np.zeros((a+1))
matriksB[a] = 1
for i in xrange(a):
matriksB[i] = hitung_jarak(self.A[i], A)
x = LA.solve(self.matriks_alfa,matriksB)
for i in xrange(a):
result+= x[i]*self.B[i]
error = 0
for i in xrange(len(x)):
self.error+=(x[i]*matriksB[i])
print 'hasilnya = ',result
return (result,error)
def build_matriks_1(self):
a = len(self.A)
result = np.zeros((a+1,a+1))
for i in xrange(a):
for j in xrange(a):
result[i,j] = hitung_jarak(self.A[i], self.A[j])
for i in xrange(a):
result[a,i] = result[i,a] = 1
# print result
return result
def print_matriks(self, A):
print A
'''
menghitung crossvalidasi, A koordinat, B value,
state boolean jika True, semua data
akan di crossvalidasi, jika tidak hanya beberapa
data random yang akan di crossvalidasi
jika state bernilai False maka N = 0, jika true maka tentukan N nya,
jika tidak secara default panjang A yang digunakan
@author moh fajar
'''
def cross_validasi(A,B,state):
ME = 0
MAE = 0
RMSPE = 0
if state: # jika cross validasi dilakukan terhadap semua data observasi
tmp1 = np.zeros(len(A)-1,2) # menampung nilai data koordinat sementara
tmp2 = np.zeros(len(A) - 1) # menampung nilai data value sementara
n = len(A)
for i in xrange(len(A)):
m = 0
for j in xrange(len(A)-1):
if i!=m:
temp1[j] = A[m]
temp2[j] = B[m]
else:
m+=1
temp1[j] = A[m]
temp2[j] = B[m]
m+=1
# setelah didapatkan data koordinat dan data value sementara
# maka kemudian dilakukan kriging pada data koordinat ke -i
result = krig(temp1, temp2)
ME+=(result - B[i])
MAE+=abs(result - B[i])
RMSPE+= np.pow(result - B[i])
# ---------------------------susahnya python mesti pake indentasi,,
# ----------------------------lain editor lain penampakan
ME = ME/n
MAE = MAE/n
RMSPE = np.sqrt(RMSPE/n)
return (ME, MAE, RMSPE)
else:
temp1 = np.zeros(len(A)-1, 2)
temp2 = np.zeros(len(A))
for i in xrange(N):
m = r.randint(0,len(A)-1)
for j in xrange(len(A)-1):
if j!=m:
temp1[j] = A[m]
temp2[j] = B[m]
else:
m+=1
temp1[j] = A[m]
temp2[j] = B[m]
m+=1
result = krig(temp1, temp2)
ME+=(result - B[i])
MAE+=abs(result - B[i])
RMSPE+= np.pow(result - B[i])
ME = ME/n
MAE = MAE/n
RMSPE = np.sqrt(RMSPE/n)
return (ME, MAE, RMSPE)
class GUI(QMainWindow):
def __init__(self,parent =None):
super(GUI, self).__init__(parent)
self.setWindowTitle("Fajar Kriging")
# self.resize(700,480)
self.create_main_frame()
self.create_status_bar()
self.create_menu()
def create_main_frame(self):
self.main_frame = QWidget()
self.plot_frame = QWidget()
self.dpi = 100
self.fig = Figure((6.0, 4.0), dpi=self.dpi)
self.canvas = FigureCanvas(self.fig)
self.canvas.setParent(self.main_frame)
self.axes = self.fig.add_subplot(111)
self.mpl_toolbar = NavigationToolbar(self.canvas, self.main_frame)
# untuk tempat Plot
left_box = QVBoxLayout()
left_box.addWidget(self.canvas)
left_box.addWidget(self.mpl_toolbar)
# untuk tempat tombol
right_box = QVBoxLayout()
tombol_open = QPushButton("&Start Krig")
right_box.addWidget(tombol_open)
right_box.addStretch(1)
hbox = QHBoxLayout()
hbox.addLayout(left_box)
hbox.addLayout(right_box)
self.main_frame.setLayout(hbox)
self.setCentralWidget(self.main_frame)
def create_menu(self):
self.file_menu = self.menuBar().addMenu("&File")
self.help_menu = self.menuBar().addMenu("&Help")
# load_action = self.create_action("&Load file",
# shortcut="Ctrl+L", slot=self.load_file, tip="Load a file")
# quit_action = self.create_action("&Quit", slot=self.close,
# shortcut="Ctrl+Q", tip="Close the application")
# self.add_actions(self.file_menu,
# (load_action, None, quit_action))
# about_action = self.create_action("&About",
# shortcut='F1', slot=self.on_about,
# tip='About the demo')
# self.add_actions(self.help_menu, (about_action,))
# self.setCentralWidget(self.main_frame)
# self.main_frame = QWidget()
# plot_frame = QWidget()s
# print ' Hellop'
# self.a = 2
# self.a = 100
# self.dpi = 100
# self.fig = Figure((6.0, 4.0), dpi=self.dpi)
# self.canvas = FigureCanvas(self.fig)
# self.canvas.setParent(self.main_frame)
# self.axes = self.fig.add_subplot(111)
# self.mpl_toolbar = NavigationToolbar(self.canvas, self.main_frame)
def create_status_bar(self):
self.status_text = QLabel("Please load a data file")
self.statusBar().addWidget(self.status_text, 1)
def asembli():
app = QApplication(sys.argv)
form = GUI()
form.show()
app.exec_()
# C = open_file("D:/A.txt")
# D = open_file("D:/B.txt")
# krig = Krig(C,D)
# A = np.array((1,3))
# print krig.get_matriks_alfa(), '\n'
# krig.start_krig(A)
# c = krig.get_matriks_alfa()
# print c
# print 'finish'
# app = wx.PySimpleApp()
# app.frame = GUI()
# app.frame.Show()
# app.MainLoop()
# del app
# def plot_data_xy(A,B,xlabel,ylabel,title ):
# p.plot(A,B)
# p.xlabel(xlabel)
# p.ylabel(ylabel)
# p.title(title)
# p.show()
if __name__=='__main__':
asembli()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment