What are some good programming jokes?

Answer by Vineet Kumar:

This is Epic.

View Answer on Quora

Reklamlar

K-Ortalama Algoritması

Kümeleme temel olarak bir veri matrisinde yer alan ve hangi sınıfa ait oldukları kesin olarak bilinmeyen özellikleri benzer olan sınıflara ayırmaya yardımcı olan yöntemler topluluğudur. Örüntü tanıma işlemlerinde ve daha birçok alanda sıkça kullanılan bir yöntemdir.

K-ortalama en eski sınıflandırma (kümeleme) algoritmalarından birisidir ve verdiği başarılı sonuçlar ve uygulama kolaylığı ile sık tercih edilir. Burada temel amaç N adet özellik çıkarımı yapılmış verinin belirlenen k tane sınıfa ayrılmasıdır. Sınıflandırmada her veri sadece bir sınıfa dahil edilir.

Algoritmanın işleyiş adımları aşağıdaki gibidir.

  1. Özellik uzayında k (sınıf sayısı) tane rastgele başlangıç ağırlık merkezleri seç.
  2. Tüm verileri kendilerine en yakın olan ağırlık merkezi ile etiketle (sınıflandır).
  3. Etiketlenen verileri kullanarak her bir sınıfın yeni ağırlık merkezlerini hesapla.
  4. Sonraki adımda ağırlık merkezleri değişmeyene kadar 2. adıma git ve devam et.

Ağırlık merkezleri ve veriler arasındaki mesafe hesaplanırken öklid uzaklığı kullanıldı. İstenirse Manhattan gibi diğer mesafe hesaplama formülleri de kullanılabilir. Daha detaylı bilgiye buradan ulaşabilirsiniz.

K-Ortalama Algoritma Uygulaması

Matlab ile geliştirdiğim uygulama yukarıda belirtilen algoritma işleyiş adımlarına göre olarak gerçekleştirdim. Uygulamanın çalıştırılması için matlab uygulama geliştirme ortamı komut satırından KMeans(OzVekt, 3) komutunun girilmesi yeterlidir. Burada OzVekt parametresi sınıflandırılmak istenen ham veriyi temsil etmektedir. 3 parametresi ise sınıflandırma işleminde verimizi 3 tane sınıfa ayırmak istediğimizi bildirir.

Sınıflandırılmak istenen ham veri buradaki matlab kodu ile oluşturuldu.  Özellik vektörü üretimi ile ilgili daha geniş bilgiye buradan ulaşabilirsiniz.

Uygulama aşağıda listelenen işlevler kullanıldı.

İşlevler:

  • KMeans: Ana işlevdir. Girdi olarak sınıflandırılacak ham veriyi ve verilerin kaç tane sınıfa ayrılacağı parametrelerini alır. Sınıflandırma işlemini gerçekleştirir.
  • MesafeHesapla: Ağırlık merkezleri ile tüm diğer veriler arasındaki öklid mesafesini hesaplar. Verileri kendisine en yakın olan ağırlık merkezine göre sınıflandırır. Verilerin tutulduğu OzVekt matrisini yeni mesafe bilgilerine göre günceller.
  • OrtalamaAl: Yeniden ağırlık merkezinin hesaplanması için daha önceden hesaplanan tüm kümelerin 2 boyutlu uzayda orta noktalarını hesaplar. Tüm sınıflar için ortalama noktalarını [Sınıf Sayısı x 2] boyutunda bir matrise atar.
  • SiniflariCizdir: Sınıflandırılan verileri herbiri farklı renkte olacak şekilde 2 boyutlu özellik uzayında çizdirir.

 

Ham veriler uygulama ile sınıflandırıldığında aşağıdaki gibi sınıflandırma işlemi başarılı bir şekilde gerçekleşiyor.

knn

Uygulama kodlarına buradan ulaşabilirsiniz.

Sobel Edge Detection without Using Built in OpenCV Functions

Sobel operator is a widely used edge detection algorithm in image processing and computer vision.  It uses convulation masks to detect edges of images and  has two basic simple steps:

  • Calculate the x  and y direction derivative of image using the following convulation masks    gx_gy
  •   Calculate the gradient using the following formula

gx2_gy2

Also, you can calculate the magnitude of gradient using |G|=|Gx|+|Gy| formula.

Check  wikipedia to get more detailed explanation of Sobel Operator. Get code using this link.

Source Code:

#include "stdafx.h"
#include <cv.h>
#include <highgui.h>
int main( int argc, const char** argv )
{

IplImage* img = 0;
// change the path of image file
img=cvLoadImage("E://lena.jpg");
IplImage* img_sobel=cvCloneImage(img);
//create variable that holds memory address of image data
uchar *adrSrc =(uchar *)img->imageData;
uchar *ptr =(uchar *)img_sobel->imageData;


//number of color channels in image: Blue, Green and Red
int nOfChannel=img->nChannels;
//horizantal amount of step
int step=img->widthStep;
int i,j,k;
int color_value=0;
double gx,gy=0;


//apply sobel operator
for(i=0;i<img->height-2;i++){
for(j=0;j<img->width-2;j++){
//calculate horizontal derivative
gx=(2*ptr[(i+2)*step+(j+1)*nOfChannel] + ptr[(i+2)*step+(j)*nOfChannel]
+ ptr[(i+2)*step+(j+2)*nOfChannel])-(2*ptr[(i)*step+(j+1)*nOfChannel] + ptr[(i)*step+(j)*nOfChannel] + ptr[(i)*step+(j+2)*nOfChannel]);

//calculate vertical derivative
gy=(2*ptr[(i+1)*step+(j+2)*nOfChannel] + ptr[(i)*step+(j+2)*nOfChannel] + ptr[(i+2)*step+(j+2)*nOfChannel])- (2*ptr[(i+1)*step+(j)*nOfChannel] + ptr[(i)*step+(j)*nOfChannel] + ptr[(i+2)*step+(j)*nOfChannel]);

for(k=0;k<nOfChannel;k++)
{
//assign gradient  to color values
ptr[i*step+j*nOfChannel+k]=(byte)pow((pow(gx,2)+pow(gy,2)),0.5);
}//k
}} //for-for


// create a window for original image
cvNamedWindow("Main Image", CV_WINDOW_AUTOSIZE);
cvMoveWindow("Main Image", 100, 100);
cvShowImage("Main Image",img);
//create a window for edge detected image
cvNamedWindow("Sobel Image", CV_WINDOW_AUTOSIZE);
cvMoveWindow("Sobel Image",500, 100);
cvShowImage("Sobel Image",img_sobel);
// wait for a key to exit
cvWaitKey(0);
// release the images
cvReleaseImage(&img);
cvReleaseImage(&img_sobel);
return 0;
}

Convert RGB Image to Greyscale without Using Built in OpenCV Functions

One of the simplest example to learn image processing is to convert RGB image to Grayscale image. I explained commands in source code using comment lines. Also you can get source code using this link.

Source Code:

#include “stdafx.h”
#include <cv.h>
#include <highgui.h>

using namespace std;
using namespace cv;

int main( int argc, const char** argv )
{
IplImage* img = 0;

// change the path of image file
img=cvLoadImage(“E://lena.jpg”);

IplImage* img_grey=cvCloneImage(img);
//create variable that holds memory address of image data
uchar *adrSrc =(uchar *)img->imageData;
uchar *adrGrey =(uchar *)img_grey->imageData;
//number of color channels in image: Blue, Green and Red
int nOfChannel=img->nChannels;
//horizantal amount of step
int step=img->widthStep;

int i,j,k;
int color_value=0;

// Calculate greyscale values
for(i=0;iheight;i++){
for(j=0;jwidth;j++){

//OpenCV uses BGR color space, not RGB
color_value=0.299 * adrSrc[i*step + j*nOfChannel+2] +
0.587 * adrSrc[i*step + j*nOfChannel+1] +
0.114 * adrSrc[i*step + j*nOfChannel];
for(k=0;k<nOfChannel;k++)
{
adrGrey[i*step+j*nOfChannel+k]=color_value;
}
}}

// create a window for original image
cvNamedWindow(“Main Image”, CV_WINDOW_AUTOSIZE);
cvMoveWindow(“Main Image”, 100, 100);
cvShowImage(“Main Image”,img);

//create a window for grey image
cvNamedWindow(“Greyscale Image”, CV_WINDOW_AUTOSIZE);
cvMoveWindow(“Greyscale Image”,500, 100);
cvShowImage(“Greyscale Image”,img_grey);

// wait for a key to exit
cvWaitKey(0);
// release images
cvReleaseImage(&img);
cvReleaseImage(&img_grey);
return 0;

}

Paralel Hesaplama

Paralel hesaplamada yapılacak bir iş, birden çok iş bölümlerine ayrılır ve her iş bölümünde bulunan sonuçlar bir yerde toplanır ve bu şekilde, bu işlerin daha kısa zamanda ve daha hızlı bir şekilde yapılmasına olanak sağlanır. Günümüzde, artık çoğu bilgisayarda çok çekirdekli işlemcilerin kullanılmasıyla paralel hesaplamayla yapılabilecek projelere yeni alanlar açılmış ve bu sayede paralel hesaplama üzerindeki ilgi daha da artmıştır. Paralel hesaplamaları gerçekleştirmek için ya istemci sunucu tarzı bir yaklaşım ya da Paralel Hesaplama için geliştirilmiş özel yöntem ve programlar kullanılabilir. Günümüzde, paralel hesaplamaları gerçekleştirmek için OpenMP, MPI ve PVM sıkça kullanılan paralel programlama kütüphaneleridir. Ayrıca, birçok modern programlama dili paralel programlamaya destek vermektedir. [1]

Paralel hesaplama yaparken şunlara dikkat edilmelidir.

  1. Program önce sıralı programlama kullanılarak geliştirilmeli ve bu sırada oldukça iyi optimize edilmelidir.
  2. Program içerisinde en fazla hesaplama miktarına sahip alanlara dikkat edilmelidir.
  3. Program içerisinde büyük iterasyon değerlerine sahip tüm döngüler paralelize edilmelidir.
  4. Paralel kodlar minimize edilmelidir.
  5. Bütün çekirdeklere ortalama olarak aynı miktarda iş dağıtılmalıdır.
  6. Değişkenlerin kullanım amacına göre özel veya paylaşımlı olarak dağıtılmasına dikkat edilmelidir.
  7. Hesaplama işlemlerinin birbirlerine bağımlı olup olmadıkları kontrol edilmelidir.
  8. Sistemin Cc-NUMA mimarisi kullanıp kullanmadığı göz önüne alınmalıdır. Cc-NUMA mimarisinde yakın erişimler hızlıdır ancak uzak erişimler yavaştır.
  9. Çoklu iş parçacıkları aynı ön bellek (cache) veri yolu üzerinde işlem yaparlar, buna dikkat edilmelidir.
  10. Paylaşılan ve sadece okunabilir veriler yanlış paylaşıma neden olmazlar, uygun değişkenler bu şekilde sadece okunabilir olarak tanımlanabilir.
[1] Paralel hesaplama hakkında temel bilgiler: Akçay M., Erdem H. A., “Paralel Hesaplama ve Matlab Uygulamaları”

Özellik Vektörü Üretimi

Özellik vektörleri üretilirken normal (gauss) dağılımda veriler üreten randn(nxm) işlevi kullanıldı. Üretilen özellik vektörleri uzayda istenilen konumda ve dağılımda olabileceklerinden üretilecek verilere belirli standart sapma ve ortalama değerleri eklendi. Bu işlem aşağıdaki gibi gerçekleştirildi. a sabit sayı değerleri standart sapmayı, b sabit sayı değerleri ise verinin ortalama değerini ifade etmektedir.

x1=a1* randn(1xN)+b1
x2=a2 * randn(1xN)+b2

Veri üretimini daha detaylı incelemek için aşağıdaki kod parçasını kullanalım. Burada öncelikle rand(‘seed’) işlevi ile üretilecek rastgele değerlerin aynı çekirdekten üretilmesi sağlandı ve N değişkenine üretilecek özellik vektöründeki örnek sayısı değeri atandı. X matrisine, standart sapması 30, ortalaması 0 olan ve N tane normal dağılıma sahip değer atandı. Aynı şekilde, y matrisine standart sapması 30, ortalaması 0 olan ve N tane değer atandı.

Matlab ortamında geliştirilen uygulama kodlarına buradan ulaşabilirsiniz.

Yazılımcı Yalanları

  • Dün çalışıyordu.
  • Benim bilgisayarımda çalışıyordu.
  • Neredeyse bitti.
  • Daha önce bunun benzeri birşeyler yapmıştım.
  • Internet Explorer’da çalışıyordu.
  • Hata varsa benim kodumdan kaynaklanmıyordur.
  • Site SEO uyumlu olacak.
  • Bu bir bug değil, programın özelliği.
  • Yorum satırlarını ve dökümantasyonu daha sonra halledeceğim.
  • Teste gerek yok, denedim, gayet iyi çalışıyor.
  • 2 dakikada hallederim.
  • %90’ı bitti.
  • Kodun nasıl çalıştığını anladım.
  • Benim kodumda hata yok, sen yanlış kullanıyorsun.
  • Test ettim.
  • Kodun bu kısmını ben yazmadım.
  • Program derleniyor.
  • Bu donanım kaynaklı bir sorun, yazılımdan kaynaklanmıyor.
  • Bu kodu ben yazmadım.
  • Bu kod daha fazla optimize edilemez.
  • Bu beta sürümü.
  • Eğer yeniden yazarsak bence daha hızlı çalışır.
  • Bu özellik benim koduma kolayca entegre edilebilir.
  • Çok esnek bir kodum var, gelecekte üzerinde değişiklikler yapılabilir.
  • Neredeyse bitti, sadece düzeltilmesi gereken bir kaç tane bug kaldı.
  • Algoritma çok karışık, bitmesi birkaç hafta daha alır.
  • Tasarımcıların işlerini bitirmesini bekliyorum, daha sonra kodlamaya devam ederim.
  • Diğer sürümde Birim Testi (Unit Test) ekleyeceğim.
  • Bu sadece geçici bir çözüm, gerçek uygulamada kullanmayacağız.
  • Neredeyse bitti, sadece birkaç şeyi kaldırmam gerekli.
  • Çok kolay, bir kaç günde hallederim.
  • Benim sorunum değil.
  • Dökümantasyonu okudum.
  • Hatayı düzeltmeye çalışıyorum.
  • Mesai sonuna kadar bitirmiş olurum.
  • Hafta içinde bitireceğim.
  • Sorun tasarımdan kaynaklanıyor.

Kaynak: What are the most common lies told by programmers?