9

मेरा इरादा Bayes Classifier Algorithm के माध्यम से अपनी कक्षा को ढूंढना है।बहुविकल्पीय कर्नेल अनुमान की मेरी गणना में क्या समस्या है?

मान लीजिए, निम्नलिखित प्रशिक्षण डेटा ऊंचाइयों, वजन, और विभिन्न लिंगों के पैर की लंबाई के

SEX   HEIGHT(feet) WEIGHT (lbs) FOOT-SIZE (inches) 
male  6    180    12 
male  5.92 (5'11") 190    11 
male  5.58 (5'7")  170    12 
male  5.92 (5'11") 165    10 
female  5    100    6 
female  5.5 (5'6")  150    8 
female  5.42 (5'5")  130    7 
female  5.75 (5'9")  150    9 
trans  4    200    5 
trans  4.10   150    8 
trans  5.42   190    7 
trans  5.50   150    9 

अब, मैं करने के लिए निम्नलिखित गुण (परीक्षण डाटा) के साथ एक व्यक्ति का परीक्षण करना चाहते का वर्णन करता है उसकी/उसके लिंग,

HEIGHT(feet) WEIGHT (lbs) FOOT-SIZE (inches) 
4    150    12 

यह लगता है यह भी एक बहु पंक्ति मैट्रिक्स हो सकता है।


मान लीजिए, मैं केवल पुरुष डेटा के भाग को अलग करने और एक मैट्रिक्स में यह व्यवस्था करने में सक्षम हूँ,

enter image description here

और, मैं निम्नलिखित खिलाफ अपनी Parzen Density Function लगाना चाहते हैं पंक्ति मैट्रिक्स जो किसी अन्य व्यक्ति (पुरुष/महिला/ट्रांसजेंडर) के समान डेटा का प्रतिनिधित्व करता है,

enter image description here (dataPoint में कई पंक्तियां हो सकती हैं।)

ताकि हम उन पुरुषों के साथ इस डेटा से कितनी बारीकी से मेल खा सकें।


मेरी प्रयास किया समाधान:

enter image description here


(1) मैं मैट्रिक्स के आयामी बेमेल की वजह से secondPart गणना करने में असमर्थ हूँ। मैं इसे कैसे ठीक कर सकता हूं?

(2) क्या यह दृष्टिकोण सही है?


MATLAB कोड

male = [6.0000 180 12 
     5.9200 190 11 
     5.5800 170 12 
     5.9200 165 10]; 
dataPoint = [4 150 2] 
variance = var(male); 

parzen.m

function [retval] = parzen (male, dataPoint, variance) 
    clc 
    %male 
    %dataPoint 
    %variance 
    sub = male - dataPoint 
    up = sub.^2 
    dw = 2 * variance; 
    sqr = sqrt(variance*2*pi); 
    firstPart = sqr.^(-1); 
    e = dw.^(-1) 
    secPart = exp((-1)*e*up); 
    pdf = firstPart.* secPart; 
    retval = mean(pdf); 

bayes.m

function retval = bayes (train, test, aprori) 
    clc 
    classCounts = rows(unique(train(:,1))); 

    %pdfmx = ones(rows(test), classCounts); 

    %%Parzen density. 

    %pdf = parzen(train(:,2:end), test(:,2:end), variance); 

    maxScore = 0; 
    pdfProduct = 1; 

    for type = 1 : classCounts 
     %if(type == 1) 
     clidxTrain = train(:,1) == type; 
     %clidxTest = test(:,1) == type; 
     trainMatrix = train(clidxTrain,2:end); 
     variance = var(trainMatrix); 
     pdf = parzen(trainMatrix, test, variance); 
     %dictionary{type, 1} = type; 
     %dictionary{type, 2} = prod(pdf); 
     %pdfProduct = pdfProduct .* pdf; 
     %end 
    end 

    for type=1:classCounts 

    end 
    retval = 0; 
endfunction 
+0

क्या आप बता सकते हैं कि आप पहले लिंक में दिए गए दृष्टिकोण का पालन कर रहे हैं, यानी, आप उस पृष्ठ के नीचे कोड को दोहराने की कोशिश कर रहे हैं (इच्छा है कि मैं उत्तर देने से पहले ...) – Oleg

उत्तर

4

पहले, आपके उदाहरण व्यक्ति के पास एक छोटा सा पैर है!

दूसरा, ऐसा लगता है कि आप कर्नेल घनत्व अनुमान और बेवकूफ बेयस को एक साथ मिला रहे हैं। एक केडीई में, आप अनुमान लगाते हैं कि एक पीडीएफ आपके कर्नेल में एक कर्नेल प्रति डेटा बिंदु है। तो यदि आप पुरुषों की ऊंचाई के केडीई करना चाहते हैं, तो आप चार गॉसियन जोड़ देंगे, प्रत्येक एक अलग पुरुष की ऊंचाई पर केंद्रित होगा।

बेवकूफ बेयस में, आप मानते हैं कि विशेषताएं (ऊंचाई, पैर आकार, आदि) स्वतंत्र हैं और प्रत्येक एक सामान्य वितरित होता है। आप अपने प्रशिक्षण डेटा से एक सिंगल गॉसियन प्रति फीचर के पैरामीटर का अनुमान लगाते हैं, फिर किसी निश्चित वर्ग से संबंधित एक नए उदाहरण की संयुक्त संभावना प्राप्त करने के लिए अपने उत्पाद का उपयोग करें। आपके द्वारा लिंक किया गया पहला पृष्ठ यह काफी अच्छी तरह से बताता है।

कोड में:

clear 

human = [6.0000 180 12 
     5.9200 190 11 
     5.5800 170 12 
     5.9200 165 10]; 
tiger = [ 
    2 2000 17 
    3 1980 16 
    3.5 2100 18 
    3 2020 18 
    4.1 1800 20 
]; 

dataPoints = [ 
    4 150 12 
    3 2500 20 
    ]; 

sigSqH = var(human); 
muH = mean(human); 

sigSqT = var(tiger); 
muT = mean(tiger); 

for i = 1:size(dataPoints, 1) 
    i 
    probHuman = prod(1./sqrt(2*pi*sigSqH) .* exp(-(dataPoints(i,:) - muH).^2 ./ (2*sigSqH))) 
    probTiger = prod(1./sqrt(2*pi*sigSqT) .* exp(-(dataPoints(i,:) - muT).^2 ./ (2*sigSqT) )) 
end 

बाघ बनाम मानव की संभावना की तुलना हमें निष्कर्ष है कि dataPoints(1,:) एक व्यक्ति जबकि dataPoints(2,:) एक बाघ है की सुविधा देता है। आप इस मॉडल को और अधिक जटिल बना सकते हैं, उदाहरण के लिए, एक वर्ग या दूसरे होने की पूर्व संभावनाएं जोड़ना, जो probHuman या probTiger गुणा करेगा।

संबंधित मुद्दे