I. দুরত্ব মেট্রিক
প্রথমত, কোনও ডেটা সেটে ফিচারের সংখ্যা (কলাম) কেএনএন-তে ব্যবহারের জন্য দূরত্বের মেট্রিক নির্বাচন করার কোনও কারণ নয়। এই প্রশ্নের সঠিকভাবে নির্দেশিত করার জন্য বেশ কয়েকটি প্রকাশিত অধ্যয়ন রয়েছে এবং তুলনার জন্য সাধারণ ভিত্তিগুলি হ'ল:
আপনার ডেটা অন্তর্নিহিত পরিসংখ্যান বিতরণ;
বৈশিষ্ট্যগুলির মধ্যে সম্পর্ক যা আপনার ডেটা সমন্বিত করে (তারা কি স্বতন্ত্র - যেমন, কোভারিয়েন্স ম্যাট্রিক্স দেখতে কেমন লাগে); এবং
স্থানাঙ্ক স্থান যেখানে থেকে আপনার ডেটা প্রাপ্ত হয়েছিল।
আপনার যে বিতরণ (গুলি) থেকে আপনার ডেটা নমুনা করা হয়েছিল তার কোনও পূর্ববর্তী জ্ঞান না থাকলে কমপক্ষে একটি (ভাল নথিভুক্ত এবং পুঙ্খানুপুঙ্খ) অধ্যয়ন থেকে সিদ্ধান্ত নেওয়া হয়েছে যে ইউক্লিডিয়ান দূরত্ব সেরা পছন্দ the
YEuclidean মেট্রিক মেগা-স্কেল ওয়েব সুপারিশ ইঞ্জিনগুলির পাশাপাশি বর্তমান একাডেমিক গবেষণায় ব্যবহৃত হয়। ইউক্লিডিয়ান দ্বারা গণনা করা দূরত্বগুলির স্বজ্ঞাত অর্থ এবং গণনার আঁশ রয়েছে - অর্থাত, ইউক্লিডিয়ান দূরত্ব একইভাবে গণনা করা হয়, দুটি বিন্দু দ্বিমাত্রিক বা বাইশ মাত্রার জায়গাতেই হোক।
এটি কেবলমাত্র আমার জন্য কয়েকবার ব্যর্থ হয়েছে, ইউক্লিডিয়ান দূরত্বের প্রতিটি ক্ষেত্রেই ব্যর্থ হয়েছিল কারণ অন্তর্নিহিত (কার্তেসিয়ান) সমন্বয় ব্যবস্থাটি একটি নিম্ন পছন্দ ছিল। এবং আপনি সাধারণত এটি সনাক্ত করতে পারবেন কারণ উদাহরণস্বরূপ পাথ দৈর্ঘ্য (দূরত্ব) আর যুক্ত হয় না - যেমন, যখন মেট্রিক স্পেসটি দাবাবোর্ড হয়, ম্যানহাটনের দূরত্ব ইউক্লিডিয়ান থেকেও ভাল হয়, তেমনিভাবে যখন মেট্রিক স্থানটি পৃথিবী হয় এবং আপনার দূরত্বগুলি ট্রান্সফার হয় -কন্টিনেন্টাল ফ্লাইটস, একটি মেরু স্থানাঙ্ক ব্যবস্থার জন্য উপযুক্ত একটি দূরত্বের মেট্রিক একটি ভাল ধারণা (উদাহরণস্বরূপ, লন্ডন থেকে ভিয়েনা হয় 2.5 ঘন্টা, ভিয়েনা থেকে সেন্ট পিটার্সবার্গ একই পথে আরও 3 ঘন্টা, কম বা কম, লন্ডন থেকে সেন্ট পিটার্সবার্গ 5.5 ঘন্টা নয়, পরিবর্তে, 3 ঘন্টা থেকে কিছুটা কম is
তবে আপনার ডেটা কোনও নন-কার্টেসিয়ান সমন্বয় ব্যবস্থাতে অন্তর্ভুক্ত রয়েছে সেগুলি ছাড়াও দূরত্বের মেট্রিকের পছন্দটি সাধারণত উপাদান নয়। ( সিএনএসের এই শিক্ষার্থীর কাছ থেকে এই ব্লগ পোস্টটি দেখুন , কেএনএন শ্রেণিবদ্ধে তাদের প্রভাব পরীক্ষা করে বিভিন্ন দূরত্বের মেট্রিকের তুলনা করে - চি স্কোয়ার সেরা ফলাফল দেয় তবে পার্থক্যগুলি বড় নয়; আরও বিস্তৃত গবেষণাটি একাডেমিক গবেষণাপত্রে রয়েছে, তুলনামূলক অধ্যয়ন নিকটতম প্রতিবেশীদের জন্য দূরত্ব ফাংশন দূরত্বের কার্যাদি - মহালানোবিস (মূলত ইউক্লিডিয়ানকে সাধারণ মাত্রার সাথে সম্পর্কিত হিসাবে চিহ্নিত করা) এই সমীক্ষায় সেরা ছিল।
একটি গুরুত্বপূর্ণ প্রভিসো: দূরত্বের মেট্রিক গণনা অর্থবহ হওয়ার জন্য, আপনাকে অবশ্যই আবশ্যক পুনরায় স্কেলআপনার ডেটা - এটি না করে সঠিক ভবিষ্যদ্বাণী উত্পন্ন করতে খুব কমই কোনও কেএনএন মডেল তৈরি করা সম্ভব। উদাহরণস্বরূপ, যদি আপনি অ্যাথলেটিক পারফরম্যান্সের পূর্বাভাস দেওয়ার জন্য কেএনএন মডেল তৈরি করে চলেছেন এবং আপনার প্রত্যাশা ভেরিয়েবলগুলি উচ্চতা (সেমি), ওজন (কেজি), বডিফ্যাট (%) এবং বিশ্রামের নাড়ি (প্রতি মিনিটে বীট) হয় তবে একটি সাধারণ ডেটা পয়েন্ট হতে পারে এর মতো কিছু দেখুন: [180.4, 66.1, 11.3, 71]। স্পষ্টতই দূরত্বের গণনাটি উচ্চতা দ্বারা প্রাধান্য পাবে, যখন বডিফ্যাট% এর অবদান প্রায় নগণ্য হবে। অন্য কোনও উপায়ে বলুন, যদি পরিবর্তে, ডেটাগুলি আলাদাভাবে জানানো হয়, যাতে শরীরের ওজন কিলোগ্রামের চেয়ে গ্রামে ছিল, তবে 86.1 এর মূল মূল্য হবে 86,100, যা আপনার ফলাফলগুলিতে একটি বড় প্রভাব ফেলবে, যা ঠিক আপনি ডোন করেন না চাই না।
X_new = (X_old - mu) / sigma
২। ডেটা স্ট্রাকচার
আপনি যদি কেডি-ট্রি স্ট্রাকচারের পারফরম্যান্স সম্পর্কে উদ্বিগ্ন হন তবে একটি ভোরোনাই টেসলেশন হ'ল একটি ধারণাগত সাধারণ পাত্রে তবে এটি ক্রমশই পারফরম্যান্সকে উন্নত করবে এবং কেডি-ট্রিগুলির চেয়ে আরও ভাল আঁকবে।

কেএনএন প্রশিক্ষণ ডেটা অব্যাহত রাখার পক্ষে এটি সবচেয়ে সাধারণ উপায় নয়, যদিও এই উদ্দেশ্যে ভিটি প্রয়োগ এবং তত্ক্ষণাত পারফরম্যান্সের সুবিধাগুলি যথাযথভাবে ডকুমেন্টেড রয়েছে (দেখুন এই মাইক্রোসফ্ট গবেষণা প্রতিবেদনটি দেখুন )। এর ব্যবহারিক তাত্পর্যটি হ'ল, যদি আপনি 'মূলধারার' ভাষা ব্যবহার করেন (যেমন, টিআইওবি সূচীতে ) তবে আপনার ভিটি সঞ্চালনের জন্য একটি গ্রন্থাগার খুঁজে পাওয়া উচিত। আমি পাইথন এবং আরে জানি, প্রতিটি ভাষার জন্য একাধিক বিকল্প রয়েছে (যেমন, সিআরএএন- তে উপলব্ধ আর এর জন্য ভোরোনাই প্যাকেজ )
কেএনএন-এর জন্য ভিটি ব্যবহার করে এটি ::
আপনার ডেটা থেকে, এলোমেলোভাবে ডাব্লু পয়েন্ট নির্বাচন করুন - এগুলি আপনার ভোরোনাই কেন্দ্র। একটি ভোরোনাই সেল প্রতিটি কেন্দ্রের নিকটবর্তী সমস্ত প্রতিবেশী পয়েন্টগুলিকে আবদ্ধ করে। কল্পনা করুন আপনি যদি প্রতিটি ভোরোনাই কেন্দ্রে আলাদা আলাদা রঙ বরাদ্দ করেন, যাতে প্রদত্ত কেন্দ্রের জন্য নির্ধারিত প্রতিটি বিন্দু সেই রঙটি আঁকতে পারে। যতক্ষণ না আপনার পর্যাপ্ত ঘনত্ব থাকে, এই কাজটি প্রতিটি ভোরোনাই কেন্দ্রের সীমানাটি সুন্দরভাবে প্রদর্শন করবে (দুটি সীমা পৃথককারী সীমানা হিসাবে)।
ভোরোনাই কেন্দ্রগুলি কীভাবে নির্বাচন করবেন? আমি দুটি orthogonal নির্দেশিকা ব্যবহার করি। ডাব্লু পয়েন্টগুলি এলোমেলোভাবে নির্বাচনের পরে, আপনার প্রশিক্ষণের ডেটার জন্য ভিটি গণনা করুন। পরবর্তী প্রতিটি ভোরোনাই কেন্দ্রে নির্ধারিত ডেটা পয়েন্টের সংখ্যাটি পরীক্ষা করে দেখুন - এই মানগুলি একইরকম হওয়া উচিত (আপনার ডেটা স্পেস জুড়ে ইউনিফর্ম পয়েন্টের ঘনত্ব দেওয়া)। দুটি মাত্রায়, এটি একই আকারের টাইলগুলির সাথে একটি ভিটি সৃষ্টি করবে hat এটিই প্রথম নিয়ম, এখানে দ্বিতীয়। পুনরাবৃত্তির মাধ্যমে ডাব্লু নির্বাচন করুন - আপনার কেএনএন অ্যালগরিদমকে ডাব্লু দিয়ে একটি চলক প্যারামিটার হিসাবে চালান, এবং কর্মক্ষমতা পরিমাপ করুন (ভিটি-কে জিজ্ঞাসাবাদ করে পূর্বাভাস ফেরানোর জন্য প্রয়োজনীয় সময়)।
সুতরাং কল্পনা করুন আপনার দশ মিলিয়ন ডেটা পয়েন্ট রয়েছে ..... পয়েন্টগুলি যদি সাধারণ 2 ডি ডেটা কাঠামোতে বা কেডি-ট্রিতে অবিরত থাকে তবে আপনি গড়ে কয়েক মিলিয়ন দূরত্ব গণনা সম্পাদন করবেন প্রতিটিরনতুন ডেটা পয়েন্ট যার প্রতিক্রিয়া পরিবর্তনশীল আপনি পূর্বাভাস দিতে চান। অবশ্যই, সেই গণনাগুলি একটি একক ডেটা সেটে সঞ্চালিত হয়। একটি ভি / টি দিয়ে, নিকটতম প্রতিবেশী অনুসন্ধান একের পর এক দুটি ধাপে সঞ্চালিত হয়, দুটি পৃথক জনসংখ্যার উপাত্তের বিরুদ্ধে - প্রথমে ভোরোনাই কেন্দ্রগুলির বিরুদ্ধে, তারপরে নিকটতম কেন্দ্রটি পাওয়া গেলে, কোষের সাথে সম্পর্কিত পয়েন্টগুলি খুঁজে পাওয়া যায় সেই কেন্দ্রটি প্রকৃত নিকটতম প্রতিবেশী (ক্রমাগত দূরত্ব গণনার দ্বারা) সন্ধান করতে অনুসন্ধান করা হয়, একত্রিত, এই দুটি চেহারা আপ একক ব্রুট-ফোর্স লুক-আপের চেয়ে অনেক দ্রুত। এটি দেখতে সহজ: 1M ডেটা পয়েন্টগুলির জন্য, ধরুন আপনি আপনার ডেটার স্পেসটি পরীক্ষা করার জন্য 250 ভোরোনাই কেন্দ্র নির্বাচন করেছেন। গড়ে প্রতিটি ভোরোনাই কোষে 4,000 ডেটা পয়েন্ট থাকবে। সুতরাং গড়ে 500,000 দূরত্ব গণনা (ব্রুট ফোর্স) সঞ্চালনের পরিবর্তে, আপনি গড়ে মাত্র 125 + 2000 এর চেয়ে কম পারফর্ম করেন।
তৃতীয়। ফলাফল গণনা করা (পূর্বাভাসের প্রতিক্রিয়া ভেরিয়েবল)
কেএনএন প্রশিক্ষণ ডেটার সেট থেকে পূর্বাভাসিত মান গণনা করার জন্য দুটি পদক্ষেপ রয়েছে। প্রথমটি এন, বা এই গণনার জন্য ব্যবহার করার জন্য নিকটতম প্রতিবেশীর সংখ্যা চিহ্নিত করছে । দ্বিতীয়টি হ'ল পূর্বাভাসিত মানটিতে তাদের অবদানকে কীভাবে ওজন করা যায়।
প্রথম উপাদান ডাব্লু / আর / টি, আপনি একটি অপ্টিমাইজেশান সমস্যা সমাধানের মাধ্যমে এন এর সেরা মান নির্ধারণ করতে পারেন (কমপক্ষে স্কোয়ার অপ্টিমাইজেশানের সাথে খুব অনুরূপ)। এটাই তত্ত্ব; অনুশীলনে, বেশিরভাগ লোকেরা কেবল n = 3 ব্যবহার করেন। যে কোনও ইভেন্টে, n = 1, n = 2, n = 3 ইত্যাদির জন্য পরীক্ষার উদাহরণগুলির একটি সেট (পূর্বাভাসিত মানগুলি গণনা করার জন্য) এর উপরে আপনার কেএনএন অ্যালগরিদম চালানো এবং এন এর ক্রিয়া হিসাবে ত্রুটিটিকে প্লট করা সহজ। আপনি যদি শুরু করতে n এর জন্য একটি জলদি মান চান তবে আবারও n = 3 ব্যবহার করুন।
দ্বিতীয় উপাদানটি হ'ল প্রতিবেশীর প্রত্যেকের অবদানকে কীভাবে ওজন করা যায় (ধরে নেওয়া n> 1)।
সবচেয়ে সহজ ওজন কৌশল প্রতিটি প্রতিবেশীকে কেবল একটি ওজন সহগ দ্বারা গুণিত করে যা কেবল 1 / (ডিস্ট * কে) হয়, বা সেই প্রতিবেশী থেকে পরীক্ষার দুরত্বের বিপরীতটি প্রায়শই কিছু অনুভূতভাবে উত্পন্ন ধ্রুবক, কে I দ্বারা গুণিত হয় I এই কৌশলটির অনুরাগী না কারণ এটি প্রায়শই নিকটতম প্রতিবেশীদের অতিরিক্ত ওজন করে (এবং একযোগে আরও বেশি দূরবর্তী ওজনের); এর তাত্পর্যটি হ'ল প্রদত্ত ভবিষ্যদ্বাণীটি সম্পূর্ণরূপে একক প্রতিবেশীর উপর নির্ভরশীল হতে পারে, যার ফলে শব্দে অ্যালগরিদমের সংবেদনশীলতা বৃদ্ধি পায়।
একটি অবশ্যই আরও ভাল ওজন ফাংশন, যা এই সীমাবদ্ধতাটি যথেষ্ট পরিমাণে এড়িয়ে চলে তা হ'ল গাউসিয়ান ফাংশন , যা পাইথনটিতে এই রকম দেখাচ্ছে:
def weight_gauss(dist, sig=2.0) :
return math.e**(-dist**2/(2*sig**2))
আপনার কেএনএন কোড ব্যবহার করে পূর্বাভাসিত মান গণনা করতে, আপনি নিকটতম প্রতিবেশীদের ডেটা পয়েন্টের শনাক্ত করতে পারবেন যার প্রতিক্রিয়া ভেরিয়েবলটি আপনি ভবিষ্যদ্বাণী করতে চান ('পরীক্ষার উদাহরণ'), তারপরে প্রতিটি এন এর প্রতিবেশীর জন্য একবার ওয়েট_গাউস ফাংশনটি কল করুন প্রতিটি প্রতিবেশীর মধ্যবর্তী দূরত্বে পরীক্ষার বিন্দু T এই ফাংশনটি প্রতি প্রতিবেশীর জন্য ওজন ফিরিয়ে দেবে, যা পরে ওজনযুক্ত গড় গণিতে সেই প্রতিবেশীর সহগ হিসাবে ব্যবহৃত হয়।