ভূমিকা
যদি আমি আপনাকে সঠিকভাবে বুঝতে পারি তবে আপনার এমন কোনও ব্যবহারকারীকে সনাক্ত করতে হবে যার জন্য আপনার কোনও অনন্য পরিচয়দাতা নেই, তাই আপনি এলোমেলো ডেটার সাথে ম্যাচ করে এটি সনাক্ত করতে চান। আপনি ব্যবহারকারীর পরিচয় নির্ভরযোগ্যভাবে সংরক্ষণ করতে পারবেন না কারণ:
- কুকিজ মুছে ফেলা যায়
- আইপি ঠিকানা পরিবর্তন করতে পারেন
- ব্রাউজার পরিবর্তন করতে পারে
- ব্রাউজার ক্যাশে মুছে ফেলা হতে পারে
একটি জাভা অ্যাপলেট বা কম কম অবজেক্ট হ্যাডওয়্যার সম্পর্কিত তথ্য হ্যাশ ব্যবহার করে একটি সহজ সমাধান হতে পারে, কিন্তু আজকাল মানুষ এত সুরক্ষা-সচেতন যে তাদের সিস্টেমে এই ধরণের প্রোগ্রাম ইনস্টল করা লোকদের পক্ষে কঠিন হবে। এটি আপনাকে কুকিজ এবং অন্যান্য অনুরূপ সরঞ্জাম ব্যবহার করে আটকে দেয়।
কুকিজ এবং অন্যান্য, অনুরূপ সরঞ্জাম
আপনি কোনও ডেটা প্রোফাইল তৈরির কথা বিবেচনা করতে পারেন এবং তারপরে কোনও সম্ভাব্য ব্যবহারকারীকে সনাক্ত করার জন্য সম্ভাব্যতা পরীক্ষাগুলি ব্যবহার করে । নিম্নলিখিতগুলির সংমিশ্রণে এর জন্য দরকারী একটি প্রোফাইল তৈরি করা যেতে পারে:
- আইপি ঠিকানা
- আসল আইপি ঠিকানা Address
- প্রক্সি আইপি ঠিকানা (ব্যবহারকারীরা প্রায়শই একই প্রক্সি বারবার ব্যবহার করেন)
- বিস্কুট
- ওয়েব বাগ (কম নির্ভরযোগ্য কারণ বাগগুলি স্থির হয়ে গেলেও এখনও দরকারী)
- পিডিএফ বাগ
- ফ্ল্যাশ বাগ
- জাভা বাগ
- ব্রাউজার
- ট্র্যাকিং ক্লিক করুন (অনেক ব্যবহারকারী প্রতিটি ভিজিটে একই সিরিজের পৃষ্ঠাগুলি যান)
- ব্রাউজারগুলির আঙুলের মুদ্রণ - ইনস্টল হওয়া প্লাগইনগুলি (লোকেরা প্রায়শই বৈচিত্র্যময় থাকে, প্লাগইনগুলির কিছুটা পৃথক সেট থাকে)
- ক্যাশেড ছবিগুলি (লোকেরা কখনও কখনও তাদের কুকিগুলি মুছে ফেলে তবে ক্যাশেড ছবিগুলি ছেড়ে দেয়)
- ব্লব ব্যবহার করা
- ইউআরএল (গুলি) (ব্রাউজারের ইতিহাস বা কুকিজগুলিতে ইউআরএলগুলিতে অনন্য ইউজার আইডি থাকতে পারে যেমন https://stackoverflow.com/users/1226894 বা http://www.facebook.com/barackobama?fref=ts )
- সিস্টেম হরফ সনাক্তকরণ (এটি সামান্য পরিচিত তবে প্রায়শই অনন্য কী স্বাক্ষর)
- এইচটিএমএল 5 এবং জাভাস্ক্রিপ্ট
- এইচটিএমএল 5 লোকালস্টোরেশন
- এইচটিএমএল 5 জিওলোকেশন এপিআই এবং বিপরীত জিওকোডিং
- আর্কিটেকচার, ওএস ল্যাঙ্গুয়েজ, সিস্টেমের সময়, স্ক্রিন রেজোলিউশন ইত্যাদি
- নেটওয়ার্ক তথ্য API
- ব্যাটারির স্থিতি এপিআই
আমি তালিকাভুক্ত আইটেমগুলি অবশ্যই ব্যবহারকারীকে অনন্য সনাক্তকরণের কয়েকটি সম্ভাব্য উপায়। আরও অনেক আছে।
এ থেকে এলোমেলো উপাত্ত উপাদানগুলির একটি সেট থেকে একটি ডেটা প্রোফাইল তৈরি করতে, এর পরে কী হবে?
পরবর্তী পদক্ষেপটি হ'ল কিছু अस्पष्ट লজিক বা আরও উন্নততর একটি কৃত্রিম নিউরাল নেটওয়ার্ক (যা ফাজি যুক্তি ব্যবহার করে) বিকাশ করে । উভয় ক্ষেত্রেই, ধারণাটি হ'ল আপনার সিস্টেমকে প্রশিক্ষণ দেওয়া, এবং তারপরে আপনার ফলাফলের যথার্থতা বাড়াতে বায়েসিয়ান ইনফারেন্সের সাথে এর প্রশিক্ষণটি একত্রিত করুন ।
NeuralMesh পিএইচপি জন্য আপনার লাইব্রেরি কৃত্রিম নিউরাল নেটওয়ার্ক উত্পন্ন করতে পারবেন। বায়েশিয়ান অনুমান প্রয়োগ করতে, নীচের লিঙ্কগুলি দেখুন:
এই মুহুর্তে, আপনি ভাবতে পারেন:
আপাতদৃষ্টিতে সহজ কাজের জন্য এত ম্যাথ এবং লজিক কেন?
মূলত, কারণ এটি কোনও সহজ কাজ নয় । আপনি যা অর্জন করার চেষ্টা করছেন তা হ'ল প্রকৃত সম্ভাবনা । উদাহরণস্বরূপ, নিম্নলিখিত পরিচিত ব্যবহারকারীদের দেওয়া:
User1 = A + B + C + D + G + K
User2 = C + D + I + J + K + F
আপনি যখন নিম্নলিখিত তথ্য পাবেন:
B + C + E + G + F + K
আপনি যে প্রশ্নটি মূলত জিজ্ঞাসা করছেন তা হ'ল:
প্রাপ্ত ডেটা (বি + সি + ই + জি + এফ + কে) আসলে ইউজার 1 বা ইউজার 2 হওয়ার সম্ভাবনা কত? এবং এই দুটি ম্যাচের মধ্যে কোনটি সবচেয়ে সম্ভাব্য?
এই প্রশ্নের কার্যকরভাবে উত্তর দেওয়ার জন্য, আপনাকে ফ্রিকোয়েন্সি বনাম সম্ভাব্যতার ফর্ম্যাট এবং কেন যুগ্ম সম্ভাবনা আরও ভাল পদ্ধতির হতে হবে তা বুঝতে হবে। বিশদটি এখানে toোকার জন্য অনেক বেশি (যে কারণে আমি আপনাকে লিঙ্ক দিচ্ছি), তবে একটি ভাল উদাহরণ হ'ল মেডিকেল ডায়াগনোসিস উইজার্ড অ্যাপ্লিকেশন , যা সম্ভাব্য রোগগুলি সনাক্ত করতে লক্ষণগুলির সংমিশ্রণ ব্যবহার করে।
ডাটা পয়েন্টের সিরিজের যা (উপরোক্ত উদাহরণের b + c + E ব্যবহার + + G + এ এফ + + কে) আপনার ডেটা প্রোফাইল গঠিত হিসেবে একটি মুহূর্ত জন্য মনে লক্ষণ , এবং অজানা ব্যবহারকারী রোগ । রোগটি সনাক্ত করে, আপনি আরও উপযুক্ত চিকিত্সাটি সনাক্ত করতে পারবেন (এই ব্যবহারকারীকে ব্যবহারকারী 1 হিসাবে গণ্য করুন)।
স্পষ্টতই, এমন একটি রোগ যার জন্য আমরা 1 টিরও বেশি লক্ষণ চিহ্নিত করেছি এটি সনাক্ত করা সহজ। প্রকৃতপক্ষে, আমরা যত বেশি লক্ষণগুলি সনাক্ত করতে পারি, তত সহজেই আমাদের নির্ণয়ের সুনির্দিষ্ট।
অন্য কোন বিকল্প আছে?
অবশ্যই. বিকল্প ব্যবস্থা হিসাবে, আপনি আপনার নিজস্ব সাধারণ স্কোরিং অ্যালগরিদম তৈরি করতে পারেন এবং এটি সঠিক মিলগুলির উপর ভিত্তি করে। এটি সম্ভাবনার মতো দক্ষ নয়, তবে এটি কার্যকর করার জন্য আপনার পক্ষে সহজ হতে পারে।
উদাহরণ হিসাবে, এই সাধারণ স্কোর চার্টটি বিবেচনা করুন:
+ + ------------------------- + + -------- + + ------------ + +
| সম্পত্তি | ওজন | গুরুত্ব |
+ + ------------------------- + + -------- + + ------------ + +
| আসল আইপি ঠিকানা | 60 | 5 |
| ব্যবহৃত প্রক্সি আইপি ঠিকানা | 40 | 4 |
| এইচটিটিপি কুকিজ | 80 | 8 |
| সেশন কুকিজ | 80 | 6 |
| তৃতীয় পক্ষের কুকিজ | 60 | 4 |
| ফ্ল্যাশ কুকিজ | 90 | 7 |
| পিডিএফ বাগ | 20 | 1 |
| ফ্ল্যাশ বাগ | 20 | 1 |
| জাভা বাগ | 20 | 1 |
| ঘন ঘন পৃষ্ঠা | 40 | 1 |
| ব্রাউজারগুলির ফিঙ্গার প্রিন্ট | 35 | 2 |
| ইনস্টল করা প্লাগইনস | 25 | 1 |
| ক্যাশেড ছবি | 40 | 3 |
| ইউআরএল | 60 | 4 |
| সিস্টেম হরফ সনাক্তকরণ | 70 | 4 |
| লোকালস্টোরেজ | 90 | 8 |
| ভূ-অবস্থান | 70 | 6 |
| এওএলটিআর | 70 | 4 |
| নেটওয়ার্ক তথ্য এপিআই | 40 | 3 |
| ব্যাটারির স্থিতি এপিআই | 20 | 1 |
+ + ------------------------- + + -------- + + ------------ + +
প্রদত্ত অনুরোধের ভিত্তিতে আপনি যে তথ্য সংগ্রহ করতে পারেন তার প্রতিটি অংশের জন্য, সম্পর্কিত স্কোরকে পুরষ্কার দিন, তারপরে স্কোরগুলি সমান হলে বিরোধগুলি সমাধান করার জন্য গুরুত্ব ব্যবহার করুন ।
ধারণার প্রমাণ
ধারণার সাধারণ প্রমাণের জন্য দয়া করে পেরসেপ্ট্রনটি একবার দেখুন । পারসেপ্ট্রন একটি আরএনএ মডেল যা সাধারণত প্যাটার্ন স্বীকৃতি প্রয়োগগুলিতে ব্যবহৃত হয়। এমনকি একটি পুরাতন পিএইচপি ক্লাস রয়েছে যা একে পুরোপুরি প্রয়োগ করে, তবে আপনাকে সম্ভবত এটি আপনার উদ্দেশ্যে পরিবর্তন করতে হবে।
একটি দুর্দান্ত সরঞ্জাম হওয়া সত্ত্বেও Perceptron এখনও একাধিক ফলাফল (সম্ভাব্য ম্যাচ) আসতে পারেন, একটি স্কোর এবং পার্থক্য তুলনা ব্যবহার তাই এখনো শনাক্ত করতে সহায়ক সেরা সেই ম্যাচের।
অনুমিতি
- প্রতিটি ব্যবহারকারীর সম্পর্কে সমস্ত সম্ভাব্য তথ্য (আইপি, কুকিজ ইত্যাদি) সংরক্ষণ করুন
- যেখানে ফলাফলটি হুবহু মিল, সেখানে স্কোর বাড়িয়ে
- যেখানে ফলাফলটি হুবহু মিল নয়, সেখানে স্কোর হ্রাস করুন
প্রত্যাশা
- আরএনএ লেবেল তৈরি করুন
- একটি ডাটাবেস অনুকরণ করে এলোমেলো ব্যবহারকারী তৈরি করুন
- একক অজানা ব্যবহারকারী তৈরি করুন
- অজানা ব্যবহারকারী আরএনএ এবং মানগুলি তৈরি করুন
- সিস্টেমটি আরএনএ তথ্যগুলিকে একীভূত করবে এবং পেরসেপ্ট্রনকে শেখাবে
- পারসেপ্ট্রন প্রশিক্ষণ দেওয়ার পরে, সিস্টেমটির ওজনগুলি একটি সেট হবে
- আপনি এখন অজানা ব্যবহারকারীর প্যাটার্নটি পরীক্ষা করতে পারেন এবং পারসেপ্ট্রন একটি ফলাফল সেট তৈরি করবে।
- সমস্ত ধনাত্মক মিল সংরক্ষণ করুন
- ম্যাচগুলি প্রথমে স্কোর অনুসারে বাছাই করুন, তারপরে পার্থক্য অনুসারে (উপরে বর্ণিত হিসাবে)
- দুটি নিকটতম ম্যাচ আউটপুট করুন, বা, কোনও মিল না পাওয়া গেলে খালি ফলাফল আউটপুট করুন
প্রুফ অফ কনসেপ্টের কোড
$features = array(
'Real IP address' => .5,
'Used proxy IP address' => .4,
'HTTP Cookies' => .9,
'Session Cookies' => .6,
'3rd Party Cookies' => .6,
'Flash Cookies' => .7,
'PDF Bug' => .2,
'Flash Bug' => .2,
'Java Bug' => .2,
'Frequent Pages' => .3,
'Browsers Finger Print' => .3,
'Installed Plugins' => .2,
'URL' => .5,
'Cached PNG' => .4,
'System Fonts Detection' => .6,
'Localstorage' => .8,
'Geolocation' => .6,
'AOLTR' => .4,
'Network Information API' => .3,
'Battery Status API' => .2
);
// Get RNA Lables
$labels = array();
$n = 1;
foreach ($features as $k => $v) {
$labels[$k] = "x" . $n;
$n ++;
}
// Create Users
$users = array();
for($i = 0, $name = "A"; $i < 5; $i ++, $name ++) {
$users[] = new Profile($name, $features);
}
// Generate Unknown User
$unknown = new Profile("Unknown", $features);
// Generate Unknown RNA
$unknownRNA = array(
0 => array("o" => 1),
1 => array("o" => - 1)
);
// Create RNA Values
foreach ($unknown->data as $item => $point) {
$unknownRNA[0][$labels[$item]] = $point;
$unknownRNA[1][$labels[$item]] = (- 1 * $point);
}
// Start Perception Class
$perceptron = new Perceptron();
// Train Results
$trainResult = $perceptron->train($unknownRNA, 1, 1);
// Find matches
foreach ($users as $name => &$profile) {
// Use shorter labels
$data = array_combine($labels, $profile->data);
if ($perceptron->testCase($data, $trainResult) == true) {
$score = $diff = 0;
// Determing the score and diffrennce
foreach ($unknown->data as $item => $found) {
if ($unknown->data[$item] === $profile->data[$item]) {
if ($profile->data[$item] > 0) {
$score += $features[$item];
} else {
$diff += $features[$item];
}
}
}
// Ser score and diff
$profile->setScore($score, $diff);
$matchs[] = $profile;
}
}
// Sort bases on score and Output
if (count($matchs) > 1) {
usort($matchs, function ($a, $b) {
// If score is the same use diffrence
if ($a->score == $b->score) {
// Lower the diffrence the better
return $a->diff == $b->diff ? 0 : ($a->diff > $b->diff ? 1 : - 1);
}
// The higher the score the better
return $a->score > $b->score ? - 1 : 1;
});
echo "<br />Possible Match ", implode(",", array_slice(array_map(function ($v) {
return sprintf(" %s (%0.4f|%0.4f) ", $v->name, $v->score,$v->diff);
}, $matchs), 0, 2));
} else {
echo "<br />No match Found ";
}
আউটপুট:
Possible Match D (0.7416|0.16853),C (0.5393|0.2809)
"ডি" এর মুদ্রণ_আর:
echo "<pre>";
print_r($matchs[0]);
Profile Object(
[name] => D
[data] => Array (
[Real IP address] => -1
[Used proxy IP address] => -1
[HTTP Cookies] => 1
[Session Cookies] => 1
[3rd Party Cookies] => 1
[Flash Cookies] => 1
[PDF Bug] => 1
[Flash Bug] => 1
[Java Bug] => -1
[Frequent Pages] => 1
[Browsers Finger Print] => -1
[Installed Plugins] => 1
[URL] => -1
[Cached PNG] => 1
[System Fonts Detection] => 1
[Localstorage] => -1
[Geolocation] => -1
[AOLTR] => 1
[Network Information API] => -1
[Battery Status API] => -1
)
[score] => 0.74157303370787
[diff] => 0.1685393258427
[base] => 8.9
)
যদি ডিবাগ = সত্য হয় তবে আপনি ইনপুট (সেন্সর এবং পছন্দসই), প্রাথমিক ওজন, আউটপুট (সেন্সর, সম, নেটওয়ার্ক), ত্রুটি, সংশোধন এবং চূড়ান্ত ওজনগুলি দেখতে সক্ষম হবেন ।
+----+----+----+----+----+----+----+----+----+----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+------+-----+----+---------+---------+---------+---------+---------+---------+---------+---------+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----+----+----+----+----+----+----+----+----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----------+
| o | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | x10 | x11 | x12 | x13 | x14 | x15 | x16 | x17 | x18 | x19 | x20 | Bias | Yin | Y | deltaW1 | deltaW2 | deltaW3 | deltaW4 | deltaW5 | deltaW6 | deltaW7 | deltaW8 | deltaW9 | deltaW10 | deltaW11 | deltaW12 | deltaW13 | deltaW14 | deltaW15 | deltaW16 | deltaW17 | deltaW18 | deltaW19 | deltaW20 | W1 | W2 | W3 | W4 | W5 | W6 | W7 | W8 | W9 | W10 | W11 | W12 | W13 | W14 | W15 | W16 | W17 | W18 | W19 | W20 | deltaBias |
+----+----+----+----+----+----+----+----+----+----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+------+-----+----+---------+---------+---------+---------+---------+---------+---------+---------+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----+----+----+----+----+----+----+----+----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----------+
| 1 | 1 | -1 | -1 | -1 | -1 | -1 | -1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -1 | -1 | -1 | -1 | 1 | 1 | 1 | 0 | -1 | 0 | -1 | -1 | -1 | -1 | -1 | -1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -1 | -1 | -1 | -1 | 1 | 1 | 0 | -1 | -1 | -1 | -1 | -1 | -1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -1 | -1 | -1 | -1 | 1 | 1 | 1 |
| -1 | -1 | 1 | 1 | 1 | 1 | 1 | 1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | 1 | 1 | 1 | 1 | -1 | -1 | 1 | -19 | -1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -1 | -1 | -1 | -1 | -1 | -1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -1 | -1 | -1 | -1 | 1 | 1 | 1 |
| -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- |
| 1 | 1 | -1 | -1 | -1 | -1 | -1 | -1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -1 | -1 | -1 | -1 | 1 | 1 | 1 | 19 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -1 | -1 | -1 | -1 | -1 | -1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -1 | -1 | -1 | -1 | 1 | 1 | 1 |
| -1 | -1 | 1 | 1 | 1 | 1 | 1 | 1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | 1 | 1 | 1 | 1 | -1 | -1 | 1 | -19 | -1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -1 | -1 | -1 | -1 | -1 | -1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -1 | -1 | -1 | -1 | 1 | 1 | 1 |
| -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- |
+----+----+----+----+----+----+----+----+----+----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+------+-----+----+---------+---------+---------+---------+---------+---------+---------+---------+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----+----+----+----+----+----+----+----+----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----------+
x1 থেকে x20 কোড দ্বারা রূপান্তরিত বৈশিষ্ট্যগুলি উপস্থাপন করে।
// Get RNA Labels
$labels = array();
$n = 1;
foreach ( $features as $k => $v ) {
$labels[$k] = "x" . $n;
$n ++;
}
এখানে একটি অনলাইন ডেমো রয়েছে
ক্লাস ব্যবহৃত:
class Profile {
public $name, $data = array(), $score, $diff, $base;
function __construct($name, array $importance) {
$values = array(-1, 1); // Perception values
$this->name = $name;
foreach ($importance as $item => $point) {
// Generate Random true/false for real Items
$this->data[$item] = $values[mt_rand(0, 1)];
}
$this->base = array_sum($importance);
}
public function setScore($score, $diff) {
$this->score = $score / $this->base;
$this->diff = $diff / $this->base;
}
}
পরিবর্তিত পারসেপ্ট্রন ক্লাস
class Perceptron {
private $w = array();
private $dw = array();
public $debug = false;
private function initialize($colums) {
// Initialize perceptron vars
for($i = 1; $i <= $colums; $i ++) {
// weighting vars
$this->w[$i] = 0;
$this->dw[$i] = 0;
}
}
function train($input, $alpha, $teta) {
$colums = count($input[0]) - 1;
$weightCache = array_fill(1, $colums, 0);
$checkpoints = array();
$keepTrainning = true;
// Initialize RNA vars
$this->initialize(count($input[0]) - 1);
$just_started = true;
$totalRun = 0;
$yin = 0;
// Trains RNA until it gets stable
while ($keepTrainning == true) {
// Sweeps each row of the input subject
foreach ($input as $row_counter => $row_data) {
// Finds out the number of columns the input has
$n_columns = count($row_data) - 1;
// Calculates Yin
$yin = 0;
for($i = 1; $i <= $n_columns; $i ++) {
$yin += $row_data["x" . $i] * $weightCache[$i];
}
// Calculates Real Output
$Y = ($yin <= 1) ? - 1 : 1;
// Sweeps columns ...
$checkpoints[$row_counter] = 0;
for($i = 1; $i <= $n_columns; $i ++) {
/** DELTAS **/
// Is it the first row?
if ($just_started == true) {
$this->dw[$i] = $weightCache[$i];
$just_started = false;
// Found desired output?
} elseif ($Y == $row_data["o"]) {
$this->dw[$i] = 0;
// Calculates Delta Ws
} else {
$this->dw[$i] = $row_data["x" . $i] * $row_data["o"];
}
/** WEIGHTS **/
// Calculate Weights
$this->w[$i] = $this->dw[$i] + $weightCache[$i];
$weightCache[$i] = $this->w[$i];
/** CHECK-POINT **/
$checkpoints[$row_counter] += $this->w[$i];
} // END - for
foreach ($this->w as $index => $w_item) {
$debug_w["W" . $index] = $w_item;
$debug_dw["deltaW" . $index] = $this->dw[$index];
}
// Special for script debugging
$debug_vars[] = array_merge($row_data, array(
"Bias" => 1,
"Yin" => $yin,
"Y" => $Y
), $debug_dw, $debug_w, array(
"deltaBias" => 1
));
} // END - foreach
// Special for script debugging
$empty_data_row = array();
for($i = 1; $i <= $n_columns; $i ++) {
$empty_data_row["x" . $i] = "--";
$empty_data_row["W" . $i] = "--";
$empty_data_row["deltaW" . $i] = "--";
}
$debug_vars[] = array_merge($empty_data_row, array(
"o" => "--",
"Bias" => "--",
"Yin" => "--",
"Y" => "--",
"deltaBias" => "--"
));
// Counts training times
$totalRun ++;
// Now checks if the RNA is stable already
$referer_value = end($checkpoints);
// if all rows match the desired output ...
$sum = array_sum($checkpoints);
$n_rows = count($checkpoints);
if ($totalRun > 1 && ($sum / $n_rows) == $referer_value) {
$keepTrainning = false;
}
} // END - while
// Prepares the final result
$result = array();
for($i = 1; $i <= $n_columns; $i ++) {
$result["w" . $i] = $this->w[$i];
}
$this->debug($this->print_html_table($debug_vars));
return $result;
} // END - train
function testCase($input, $results) {
// Sweeps input columns
$result = 0;
$i = 1;
foreach ($input as $column_value) {
// Calculates teste Y
$result += $results["w" . $i] * $column_value;
$i ++;
}
// Checks in each class the test fits
return ($result > 0) ? true : false;
} // END - test_class
// Returns the html code of a html table base on a hash array
function print_html_table($array) {
$html = "";
$inner_html = "";
$table_header_composed = false;
$table_header = array();
// Builds table contents
foreach ($array as $array_item) {
$inner_html .= "<tr>\n";
foreach ( $array_item as $array_col_label => $array_col ) {
$inner_html .= "<td>\n";
$inner_html .= $array_col;
$inner_html .= "</td>\n";
if ($table_header_composed == false) {
$table_header[] = $array_col_label;
}
}
$table_header_composed = true;
$inner_html .= "</tr>\n";
}
// Builds full table
$html = "<table border=1>\n";
$html .= "<tr>\n";
foreach ($table_header as $table_header_item) {
$html .= "<td>\n";
$html .= "<b>" . $table_header_item . "</b>";
$html .= "</td>\n";
}
$html .= "</tr>\n";
$html .= $inner_html . "</table>";
return $html;
} // END - print_html_table
// Debug function
function debug($message) {
if ($this->debug == true) {
echo "<b>DEBUG:</b> $message";
}
} // END - debug
} // END - class
উপসংহার
ইউনিক আইডেন্টিফায়ার ছাড়া কোনও ব্যবহারকারীকে চিহ্নিত করা সরাসরি-সামনের বা সহজ কাজ নয়। এটি প্রচুর পরিমাণে র্যান্ডম ডেটা সংগ্রহ করার উপর নির্ভরশীল যা আপনি বিভিন্ন পদ্ধতি দ্বারা ব্যবহারকারীর কাছ থেকে সংগ্রহ করতে সক্ষম।
এমনকি যদি আপনি কোনও কৃত্রিম নিউরাল নেটওয়ার্ক ব্যবহার না করা বেছে নেন, তবে আমি কমপক্ষে অগ্রাধিকার এবং সম্ভাবনার সাথে একটি সাধারণ সম্ভাবনা ম্যাট্রিক্স ব্যবহার করার পরামর্শ দিচ্ছি - এবং আমি আশা করি যে উপরে বর্ণিত কোড এবং উদাহরণগুলি আপনাকে যথেষ্ট পরিমাণে এগিয়ে যেতে পারে।