Created
May 3, 2012 13:47
-
-
Save gunungloli666/2585758 to your computer and use it in GitHub Desktop.
perogram yang g' bisa selesai-selesai......
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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