Aslen yazılımcı değilim. Zaman zaman mecburiyetten, zaman zaman proje çok keyifli geldiği için yazılım sürecine dahil oluyorum. Önümüzdeki günlerde yayına alacağımız bir proje için; sistemdeki kişileri, yaptıkları quiz sonucundaki puanları ile eşleştirecek bir mekanizma hazırlamamız gerekti. Bütün arkadaşlık sitelerinin yaptığı (ya da en azından yaptığını iddia ettiği) eşleştirme mantıklarını bolca araştırdık.
Diyelim ki önünüzde bir proje var. Projede, kişiler bir quiz yapıyorlar; bu quiz sonucunda elde ettikleri puanlarla da başka kullanıcılarla eşleşiyorlar.
Quiz sonucunda tek bir puan elde ediyor olsak, hayat oldukça kolay. Diğer kullanıcıları, kişinin puanına olan uzaklıklarına göre sıralayıp listelenebiliriz. Örneğin; quizde 50 aldıysanız, sistem size ilk başta 50 alanları, sonra 51 ve 49 alanları, sonra 52 ve 48 vb.. diye sıralayacaktı.
Ancak bizim quizimiz her sorusunda birden fazla değişkende puanlar oluşturuyor. Kullanıcının verdiği her cevapta nihai bir quiz skoru değil, quiz içindeki alt değişkenlerin skoru ayrı ayrı toplanarak oluşuyor. Sonuç olarak elimizde n adet değişken ve her değişkene belirlenmiş skorlar çıkıyor. Aşağıda örnek bir skor tablosu var;
XXX: 50
YYY: 60
ZZZ: 40
Bu durumda da yine yukarıdaki mantığı uyarlıyoruz. N adet değişkenle çalışmamız, sadece değerlendirme yapacağımız döngünün boyutunu belirliyor. Sistem eşleşmeyi yaparken her bir değişenin diğer kullanıcıların değişkenleri ile olan mesafesini (yani, XXX e ne kadar yakın, YYY ye ne kadar yakın olduğunu) hesaplayıp nihai bir fark puanı oluşturuyor. Bu fark puanlarını artan bir sıra ile dizdiğimizde, diğer kullanıcılarla en efektif eşleşmeyi yakalayabiliyoruz.
Her bir değişkenin üretilen farktaki ağırlık etkisi farklı ise, bu değişkenlerin fark puanlarını çarparak nihai fark puanındaki etkiyi arttırmak (ya da azaltmak) mümkün. Örneğin, ZZZ değişkenin yarattığı fark eşleşmede daha az önemli ise, bunu 0.75 ile çarpmak mümkün.
İşin bir sonraki aşaması, bazı değişkenlerin birbirileri ile eşli olması durumu. Örneğin, bu n adet değişkenden 2, 3, ve 4 tanesi biribiri ile ilişkili olsun. Her bir değer kendi içinde farklı ağırlıklara sahip olabileceği için, standart aritmetik ortalamalar yeterli değil.
2 nokta arasındaki farkı hesaplamak için bu iki noktayı, 2 boyutlu uzayda koordinatlarını bildiğimiz 2 nokta olarak almak mümkün. 1. Noktanın koordinatları, (kullanıcı1skor1,kullanıcı1skor2) ya da kısaca (K1S1,K1S2) ve 2 nokta; (K2S1,K2S2) bu iki koordinat ile mesafe hesaplamak kolay. (https://tr.khanacademy.org/math/basic-geo/basic-geometry-pythagorean-theorem/pythagorean-theorem-distance/a/distance-formula)
3 lü eşleşmede elimizde bu 2 nokta için 3 koordinat var (her bir kullanıcının verdiğini cevap) dolayısıyla koordinatla şöyle (K1S1,K1S2,K1S3) ve (K2S1,K2S2,K2S3). 3 boyutlu uzayda mesafe formülü ile bunu da hesaplıyoruz.
Aynı şey daha yüksek eşleşmeler için de geçerli. 4 nokta için 4 boyutlu uzayı ve üstünü hayal edemesek de, matematikte herşeyin mantığı oldukça açık. https://en.m.wikipedia.org/wiki/Euclidean_distance#n_dimensions
Ardından ortak eşleştirmeler geliyor. Yani iki kullanıcının yaptığı quiz değerleri ile bu ikiliyi başka bir kullanıcı ile eşleştirmek. Bunun için de yukarıdaki mantığı kullanmak mümkün. Yani skor bağlantısı yerine, 3 boyutlu uzayda (K1S1,K2S1,K3S1) gibi koordinatlar kullanabiliriz.
Bunun üzerine hem çok kullanıcısı eşleşme, hem de birbiri ile ilişkili puanlarla eşleştirme yapmaya çalışınca işler bir tık zorlaşıyor. Kullanıcı adedi ve ilişkili skor sayısından çarpımı elimizdeki koordinat değer adedini veriyor. Buradan da kaç boyutlu uzayda hareket ettiğimizi ve bu uzayda fark olarak neyi ölçtüğümüzü hesaplıyoruz. Bu örneği basit ve anlaşılır tutmak için ilişkili skor adedini boyut, kullanıcı adedini de ölçüm değeri alalım. (Keza aksi de mümkün, ancak her bir ilişkili skoru kendi bouyutunda değerlendirmek daha anlaşılır)
2 ilişkili skor, 2 kullanıcı: 2 boyutlu uzayda çizgi mesafesi
2 skor, 3 kullanıcı: 2D, üçgen alanı, 4+ kullanıcı: alan
3 skor, 2 kullanıcı: 3D mesafe. 3 kullanıcı: alan, 4 kullanıcı piramit hacmi, 5 kullanıcı yarı küp, 6 kullanıcı küp ve üstündeki kullanıcılarda oluşan objelerin hacmi
4 skor, 2 kullanıcı: 4D mesafe, 3 ve 4 kullanıcı alan (ancak alanlar hiperbolik olabilir) 5 kullanıcı pentatop (5-cell ya da 4 simplex) hiperhacmi, 6-15 kullanıcı 4 simplex varyantları ve 16+ tesseract hiper hacimleri. http://mathforum.org/mathimages/index.php/Tesseract#Hypervolume
Bunu ayni mantıkla yukarı taşımak da mümkün. https://en.m.wikipedia.org/wiki/Template_talk:Polytopes Teeseractların ortama üzeri bir anlatımı için CUBE filmlerini biraz konseptsel bir göz ile izlemek iyi bir fikir.
Kim demiş abstract ve topolojik matematik bir işe yaramaz diye!
O de, üniversitedeyken matematiğe bu kadar merak salsaymışım keşke 🙂