ART1 algoritmining manba kodi tavsiyalar berish tartibini o'z ichiga oladi, qaysi yuqorida aytib o'tilgan edi. To'liq kod misollar bilan arxivda mavjud. ustida sayt nashriyotlar "DMK bosing" va balki bo'l tuzilgan v linux yoki Cygwin kutubxonasidan foydalangan holda Windows.
Manba kodi namunaviy ma'lumotlardan boshlanadi. Ma'lumotlar mijozning xarid yozuvlarini aks ettiruvchi xususiyat vektorlari to'plamidir . Avval muhokama qilinganidek, ma'nosi bitta mos keladi sotib olish tovarlar xaridor a 0 ko'rsatadi
hech qanday xarid yo'q edi. Xususiyat vektorlari (mijoz ma'lumotlar bazasi) va boshqa tegishli tuzilmalar 3.1 ro'yxatda ko'rsatilgan.
Roʻyxat 3.1. Tuzilishi ma'lumotlar ART1 uchun shaxsiylashtirish
#aniqlash MAX_ITEMS (11)
#aniqlash MAX_CUSTOMER (10)
#aniqlash TOTAL_PROTOTYPE_VECTORS (5)
const float beta = 1,0; /* kichik ijobiy butun */ const float hushyorligi = 0,9; /* 0 <= mulohazalilik < 1 */
int numPrototypeVektorlar = 0; /* Miqdori vektorlar prototiplar */ int prototypeVector[TOTAL_PROTOTYPE_VECTORS][MAX_ITEMS];
/* Tavsiyalarni chiqarish uchun yig'ish vektori */ int sumVector[TOTAL_PROTOTYPE_VECTORS][MAX_ITEMS];
/* Klasterdagi aʼzolar soni */ int a'zolar[TOTAL_PROTOTYPE_VECTORS];
/* Raqam klaster, Kimga kimga tegishli mijoz */ int a'zolik[MAX_CUSTOMERS];
/* String unvonlar elementlar vektorlar */ char *elementName[MAX_ITEMS] = {
"Bolg'a" qog'oz, "Snickers" "Tornavida", "Qalam", "Kit Kat", "Kalit", "Qalam",
"Xit bar", "Tasma o'lchov", "Birlashtiruvchi" };
/*
massiv vektorlar belgilar. dalalar hozir mahsulot, qaysi
oladi mijoz. Nol - mahsulot xaridor Ko'proq emas
sotib olingan
*/
/* Hmr Ppr Snk Scr Qalam Kkt Wrn pcl hth tpm bdr */ int ma'lumotlar bazasi[MAX_CUSTOMERS][MAX_ITEMS] = {
-
{
|
0,
|
0,
|
0,
|
0,
|
0,
|
bitta,
|
0,
|
0,
|
bitta,
|
0,
|
0},
|
{
|
0,
|
bitta,
|
0,
|
0,
|
0,
|
0,
|
0,
|
bitta,
|
0,
|
0,
|
bir},
|
{
|
0,
|
0,
|
0,
|
bitta,
|
0,
|
0,
|
bitta,
|
0,
|
0,
|
bitta,
|
0},
|
{
|
0,
|
0,
|
0,
|
0,
|
bitta,
|
0,
|
0,
|
bitta,
|
0,
|
0,
|
bir},
|
{
|
bitta,
|
0,
|
0,
|
bitta,
|
0,
|
0,
|
0,
|
0,
|
0,
|
bitta,
|
0},
|
{
|
0,
|
0,
|
0,
|
0,
|
bitta,
|
0,
|
0,
|
0,
|
0,
|
0,
|
bir},
|
{
|
bitta,
|
0,
|
0,
|
bitta,
|
0,
|
0,
|
0,
|
0,
|
0,
|
0,
|
0},
|
{
|
0,
|
0,
|
bitta,
|
0,
|
0,
|
0,
|
0,
|
0,
|
bitta,
|
0,
|
0},
|
-
{ 0,
|
0,
|
0,
|
0,
|
bitta,
|
0,
|
0,
|
bitta,
|
0,
|
0,
|
0},
|
{ 0,
|
0,
|
bitta,
|
0,
|
0,
|
bitta,
|
0,
|
0,
|
bitta,
|
0,
|
0}
|
};
massiv prototip vektor ko'rsatadi vektor prototiplari uchun har bir klaster. Vektor yig'indisiVektor ishlatilgan faqat uchun ekstraditsiya tavsiyalar va standart ART1 algoritmiga kiritilmagan. a'zolar massivi raqamni ko'rsatadi a'zolari v aniq klaster, a massiv A'zolik o'rnatadi, Kimga kimga _ klaster tegishli vektor belgilar xaridor. Nihoyat, massiv ma'lumotlar bazasi xaridorlar uchun noyob xususiyat vektorlarini belgilaydi.
Funktsiya asosiy ishlab chiqaradi qayta ishlash ma'lumotlar Bilan Yordam bering algoritm ART1 va keyin algoritm natijalariga asoslangan tavsiyalar chiqaradi. asosiy funksiya _ 3.2 ro'yxatda ko'rsatilgan.
Roʻyxat 3.2. Funktsiya asosiy da shaxsiylashtirish Bilan foydalanish algoritm ART1
int asosiy()
{
int mijoz;
srand (vaqt (NULL ) ); ishga tushirish (); performART1(); displayCustomerDatabase();
uchun (mijoz = 0 ; mijoz < MAX_CUSTOMER ; mijoz ++) { makeRecommendation(mijoz);
}
qaytish 0;
}
Tasodifiy sonlar generatorini srand funktsiyasi bilan ishga tushirgandan so'ng ishga tushirish funktsiyasi ART1 algoritmi tomonidan ishlatiladigan tuzilmalarni tozalash va ishga tushirish uchun mo'ljallangan, shuningdek tavsiyalar algoritmi deb ataladi. ART1 algoritmi performART1 funktsiyasi bilan ifodalanadi . Tavsiyalar makeRecommendation funksiyasi yordamida chiqariladi . Funk displayCustomerMa'lumotlar bazasi _ har biri uchun prototip vektorlarini ko'rsatadi th klaster yaratilmoqda, shuningdek, klasterlardagi xususiyat vektorlari.
Roʻyxat 3.3. Initializatsiya tuzilmalar ma'lumotlar algoritm
bekor ishga tushirish ( bekor )
{
int men, j;
/* tozalash vektorlar prototiplar */
uchun (i = 0 ; i < TOTAL_PROTOTYPE_VEKTORLAR ; i++) { uchun (j = 0 ; j < MAX_ITEMS ; j++) {
prototip vektor[i][j] = 0;
sumVector[i][j] = 0;
}
a'zolar[i] = 0;
}
/* Qayta o'rnatish qiymatlar aksessuarlar vektorlar Kimga klasterlar */ uchun (j = 0 ; j < MAX_CUSTOMERS ; j++) {
aʼzolik[j] = bitta;
}
}
Funktsiya ishga tushirish v ro'yxatga olish 3.3 tozalaydi vektorlar prototiplar, yig'indisi vektori, shuningdek massiv a'zolari va a'zolik .
3.4 ro'yxati ikkita yordamchi funktsiyani ko'rsatadi, vektorMag nitude va vektorBitwiseAnd .
Roʻyxat 3.4. Yordamchi funktsiyalari uchun algoritm ART1
int vektorMagnituda( int *vektor )
{
int j, jami = 0;
uchun (j = 0 ; j < MAX_ITEMS ; j++) {
agar (vektor[j] == bitta) jami++;
}
qaytish jami;
}
bekor vektorBitwiseAnd( int *natija, int *v, int *w )
{
int i;
uchun (i = 0 ; i < MAX_ITEMS ; i++) {
natija[i] = (v[i] && w[i]);
}
qaytish;
}
Funktsiya vektorMagnitudasi oddiygina o'ylaydi raqam ob'ektlar v vektor (bilan qiymat 1) va summani qaytaradi. vectorBitwiseAnd funksiyasi ikkita vektorda bitli AND operatsiyasini bajaradi, natijada yangi vektor paydo bo'ladi.
Uchun shaxsiylashtirish shuningdek talab qilinadi ikki funktsiyalari boshqaruv yangi klaster yaratish va unda sodir bo'lgan o'zgarishlar (klasterdan olib tashlangan yoki unga joylashtirilgan ma'lumotlar) asosida uni yangilash uchun foydalaniladigan prototip vektorlari . Ushbu funktsiyalar ro'yxat 3.5da ko'rsatilgan.
Roʻyxat 3.5. Funksiyalar boshqaruv vektorlar: prototiplar
int YangiPrototipVector yaratish( int *misol )
{
int men, klaster;
uchun (klaster = 0; klaster < TOTAL_PROTOTYPE_VECTORS; klaster ++)
{
agar (a'zolar[klaster] == 0) sindirish;
}
agar (klaster == TOTAL_PROTOTYPE_VECTORS) assert(0);
#ifdef DEBUG
printf("Yaramoqda yangi klaster %d\n", klaster); #endif
numPrototypeVectors++;
uchun (i = 0 ; i < MAX_ITEMS ; i++) {
prototip vektor[klaster][i] = misol[i]; #ifdef DEBUG
printf("%1d ", misol [i]);
#endif
}
a'zolar[klaster] = bitta; #ifdef DEBUG
printf("\n"); #endif
qaytish klaster;
}
bekor prototip vektorlarini yangilash( int klaster )
{
int element, mijoz, birinchi = bitta; assert (klaster >= 0);
#ifdef DEBUG
printf (“Qayta hisoblash prototip vektor %d (%d)\n",
klaster, a'zolar[klaster]); #endif
uchun (modda = 0 ; element < MAX_ITEMS ; element ++) { prototypeVector[klaster][element] = 0;
sumVector[klaster][element] = 0;
}
uchun (mijoz = 0 ; mijoz < MAX_CUSTOMER ; mijoz ++) { agar (a'zolik [mijoz] == klaster) {
agar (birinchi) {
uchun (modda = 0 ; element < MAX_ITEMS ; element ++) { prototypeVector[klaster][element] =
ma'lumotlar bazasi[mijoz][element]; sumVector[klaster][element] = ma'lumotlar bazasi[mijoz][element];
}
birinchi = 0;
} boshqa {
uchun (modda = 0 ; element < MAX_ITEMS ; element ++) { prototypeVector[klaster][element] =
prototipVector[klaster][element] && ma'lumotlar bazasi[mijoz][element];
sumVector[klaster][element] += ma'lumotlar bazasi[mijoz][element];
}
}
}
}
qaytish;
}
Birinchidan funktsiya, yaratish NewPrototypeVector , beret vektor belgilar va yaratadi _ u uchun yangi klaster. Xususiyat vektori oddiygina vektorga ko'chiriladi proto turi klaster. Miqdori a'zolari v klaster avtomatik ravishda aylanadi teng 1. Funktsiya PrototypeVektorlarni yangilang hisobga oladi vektor prototip ustida bular _ ma'lumotlar, qaysi v nemis o'z ichiga oladi. Eslab qoling (tenglama 3.4), nima vektor prototipi barcha vektorlarda bit bo'yicha VA operatsiyasini qo'llash natijasidir belgilar. Funktsiya dan ro'yxatga olish 3.5 yuklar birinchi vektor belgilar v vektor _ prototip, a keyin amalga oshiradi operatsiya VA uchun keyingi vektorlar klasterdagi xususiyatlar . Shuningdek , u faqat ishlatiladigan vektor sumVector ni ham hisoblab chiqadi uchun ekstraditsiya tavsiyalar va emas kiritilgan v algoritm ART1.
Amalga oshirish algoritm ART1 taqdim etdi v ro'yxatga olish 3.6. Kod o'z ichiga oladi disk raskadrovka direktivalari. Nosozliklarni tuzatish xususiyatini yoqish va jarayonni kuzatish uchun bajarilishi algoritm, o'zgartirish ip #undef ustida #aniqlash v erta DEBUG doimiysi uchun fayl .
Roʻyxat 3.6. ART1 algoritmi
int performART1( bekor )
{
int natija [MAX_ITEMS];
int pvc, magpe, magp, magE; float natijasi, test;
int indeks, bajarildi = 0; int soni = 50;
esa (!bajarildi) { bajarildi = 1;
/* tomonidan hamma xaridorlar */
uchun (indeks = 0 ; indeks < MAX_CUSTOMER ; indeks++) {
/* Qadam 3 */
uchun (pvec = 0 ; pvec < TOTAL_PROTOTYPE_VEKTORLAR ; pvec++) {
/* Mavjud xoh v bu klaster elementlar? */ agar (a'zolar[pvec]) {
vektorBitwiseAnd( natija, &ma'lumotlar bazasi[index][0],
&prototipVector[pvec][0] );
magPE = vektorMagnituda( va natija );
magP = vektorMagnituda( &prototipVector[pvec][0] ); magE = vektorMagnitude( &ma'lumotlar bazasi[index][0] );
natija = (float)magPE / (beta + (float)magP); sinov = (suzuvchi) magE / (beta + (suzuvchi)MAX_ITEMS);
/* Ifoda 3.2 */ agar (natija > test) {
/* Sinov ustida diqqatlilik / (Ifoda 3.3) */ agar (((float)magPE/(float)magE) < hushyorlik) {
int eski;
/* Ishonch hosil qilmoq, nima bu boshqa klaster */ if (a'zolik[indeks] != pvec) {
/* Ko'chirish xaridor v boshqa klaster */
eski = a'zolik[indeks]; aʼzolik[indeks] = pvec;
agar (eski >= 0) { a'zolar[eski] ;
agar (a'zolar[eski] == 0) numPrototypeVektorlar ;
}
a'zolar[pvec]++;
/* Qayta hisoblang vektorlar prototiplar uchun hammasi
* klasterlar
*/
agar ((eski >= 0) && (eski < TOTAL_PROTOTYPE_VECTORS))
{
prototip vektorlarini yangilash( eski );
}
prototip vektorlarini yangilash( pvec ); bajarildi = 0;
sindirish;
} boshqa {
/* Allaqachon v bu klaster */
}
} /* Sinov ustida diqqatlilik */
}
}
} /* Velosiped yoqilgan vektorlar */
/* Biz tekshiramiz qayta ishlangan xoh vektor */ agar (a'zolik[indeks] == bir) {
/* Yo'q edi topildi mos klaster - yaratmoq yangi
* klaster uchun bu vektor belgilar
*/
aʼzolik[indeks] = NewPrototypeVector yarating
( &ma'lumotlar bazasi[index][0] );
bajarildi = 0;
}
} /* Velosiped yoqilgan xaridorlar */ agar (! hisob ) sindirish;
} /* Tugallandi */ qaytish 0;
}
ART1 algoritmi juda oddiy: u barcha xususiyat vektorlarini barcha klaster prototipi vektorlari bilan taqqoslaydi. Agar klasterlarda boshqa o'zgarishlar bo'lmasa, algoritm tugallangan deb hisoblanadi va biz asosiy funktsiyaga qaytamiz . Taqdim etilgan manba kodi 3.1–3.4 tenglamalarning amalga oshirilishidir. O'zgaruvchilar mag* samaradorlikni oshirish maqsadida bir marta hisoblab chiqiladigan vektorlarning ahamiyati. Algoritm shuningdek, prototip vektorlarini e'tiborsiz qoldiradigan bir qator optimallashtirishlarni ham o'z ichiga oladi. emas bor a'zolari (bo'sh klasterlar emas hisobga olinadi). Agar v jarayon
tasnifi vektor belgilar emas edi joylashtirilgan v klaster, bo'ladi avtomatik ravishda yangi klaster yaratiladi. Shunday qilib, 3.1 tenglama qat'iy bajariladi. Oxirgi funksiya, makeRecommendation , berilgan uchun tavsiya ishlab chiqaradi xaridor (yuborilgan vektor belgilar) - sm. ro'yxatga olish 3.7.
Roʻyxat 3.7. Algoritm tavsiyalar
bekor tavsiya qilish ( int mijoz )
{
int eng yaxshi element = bitta; intval = 0;
int buyum;
uchun (modda = 0 ; element < MAX_ITEMS ; element ++) { if ((maʼlumotlar bazasi[mijoz][element] == 0) &&
(sumVector[a'zolik[mijoz]][element] > val)) { bestItem = element;
val = sumVector[a'zolik[mijoz]][element];
}
}
printf("uchun mijoz %d, ", mijoz); agar (bestItem >= 0) {
printf("The eng yaxshi tavsiya hisoblanadi %d (%s)\n", bestItem, itemName[bestItem]);
printf("Egasi tomonidan %d tashqariga ning %d a'zolari ning bu klaster\n", sumVector[a'zolik[mijoz]][bestItem], a'zolar[a'zolik[mijoz]]);
} boshqa {
printf("Yo'q tavsiya mumkin bo'l qilingan.\n");
}
printf("Allaqachon egalik qiladi: ");
uchun (modda = 0 ; element < MAX_ITEMS ; element ++) {
agar (ma'lumotlar bazasi[mijoz][element]) printf("%s ", itemName[item]);
}
printf("\n\n");
}
Ga binoan guruch. 3.3 algoritm amalga oshiradi Qidirmoq eng mashhur tovarlar v mijoz tomonidan hali sotib olinmagan klaster . makeRecommendation funktsiyasining boshlang'ich tsikli topadi muvofiqlik, aniqlash eng mashhur keyin var va uning raqamini yozing ( sumVector funktsiyasi ustuni ). Kodning qolgan qismi sizga tavsiya haqida matnli ma'lumot beradi (agar iloji bo'lsa). Funktsiya, shuningdek, mijoz tomonidan sotib olingan barcha narsalar ro'yxatini qaytaradi. tel (sinov natijasi sifatida).
Misol ishga tushirish
Do'stlaringiz bilan baham: |