সঠিক বিন্দুটি বেছে নেওয়ার জন্য কোন অ্যালগরিদম প্রয়োগ করতে হবে


9

নীচের চিত্রটি উত্সের চারপাশে 7 পয়েন্ট দেখায়। এর মধ্যে একটি নিয়মাবলী এবং অভিজ্ঞতার উপর ভিত্তি করে একটি মানুষ দ্বারা নির্বাচিত হয়েছে এবং লাল বর্ণের (নীচের বাম চতুর্ভুজ এক) is

এখানে চিত্র বর্ণনা লিখুন

এখন আমাদের কাছে এই পয়েন্টগুলির সেটগুলির 1000 টিরও বেশি রয়েছে এবং প্রতিটি সেটের জন্য একজন মানুষ একটি বিন্দু নির্বাচন করেছেন। এই শর্তাদি সমস্ত সেটে প্রযোজ্য:

  • প্রতিটি সেটে প্রায় 3 - 10 পয়েন্ট থাকে
  • কোনও প্রবাসী নেই
  • পয়েন্টগুলির ইতিবাচক এবং নেতিবাচক মান থাকতে পারে
  • বিন্দু নির্বাচন করার সময় কোনও ভুল করা হয়নি

আমার প্রশ্ন হ'ল: এই সেটগুলি এবং মানুষের তৈরি নির্বাচনগুলি থেকে শিখার জন্য কোনও মেশিন লার্নিং অ্যালগরিদম রয়েছে কি না তাই এটি স্বয়ংক্রিয়ভাবে সিদ্ধান্ত নিতে পারে কোন নতুন পয়েন্ট যখন সেট করা হয় তখন কোন পয়েন্টটি নির্বাচন করতে হয়? এই নতুন সেটটি অবশ্যই প্রথম থেকে প্রথম 3 শর্ত পূরণ করে।

2 চূড়ান্ত মন্তব্য:

  • আমি যে উদাহরণটি দিয়েছি তা হল নির্বাচিতটির সাথে উত্সের আশেপাশে একটি বিমানের পয়েন্টগুলি সম্পর্কে ধারণা সমর্থন করার জন্য আমার দ্বারা এলোমেলোভাবে নির্মিত উদাহরণ। বাস্তব জীবনে আরও কাঠামো থাকতে পারে তবে আপাতত আমি কৌতূহলী এবং এই ক্ষেত্রে কী সম্ভব তা জানতে চাই।
  • বিভিন্নতা কি সম্ভব হবে? বলুন এটি প্রায় 2 টি নির্বাচিত পয়েন্ট বা আপনার পয়েন্টের পরিবর্তে প্রদত্ত ব্যাসার্ধের বৃত্ত রয়েছে।

2
কেবল উচ্চস্বরে ভাবছি, কার্নেল ট্রিক সাহায্য করতে পারে? নির্বাচিত পয়েন্টটি বরং অন্য জায়গাগুলির (যেমন উচ্চতর মাত্রা) বিভাজন হওয়ার সম্ভাবনা রয়েছে এমন সময়ে অন্যান্য পয়েন্টগুলির খুব কাছে বসে দেখায়, তবে সেখানে আপনি শ্রেণিবদ্ধকরণ করবেন! আমি বলব এটি ভাবনা মূল্যবান।
টুইনপেনগুইনস

1
@ মজিদমোর্তাজাভি ভালো লাগছে সত্যি কথা বলতে কী, মেশিন লার্নিং আমার কাছে নতুন ক্ষেত্র। কেবলমাত্র আমি জানি যে এখানে অনেক কিছুই সম্ভব তবে আমি কীভাবে এবং কী সম্পর্কে নির্বিকার। আপনার কার্নেল পরামর্শটি পড়তে চেষ্টা করবে।
Elmex80s

2
আপনি যদি প্রতিটি পয়েন্টে যেমন বৈশিষ্ট্যগুলি যুক্ত করেন যেমন অন্যান্য পয়েন্টগুলি থেকে দূরত্ব, অন্যান্য পয়েন্টগুলির সংখ্যা ইত্যাদি, আপনি সম্ভবত কে-নিকটবর্তী প্রতিবেশীদের মতো সাধারণ কিছু ব্যবহার করতে পারেন যা আপনি প্রশিক্ষিত করেছেন যে historicতিহাসিক বিন্দু (গুলি) এর সাথে সবচেয়ে বেশি মিল রয়েছে? আপনার নতুন পয়েন্ট (গুলি) এবং সেই শ্রেণিবদ্ধকরণটি ব্যবহার করুন। সিদ্ধান্ত নেওয়ার গাছ বা নিউরাল জাল এই ধরণের অ-রৈখিক সীমানার জন্য আরও ভাল ফিট হতে পারে।
ড্যান কার্টার

1
@ ড্যানকার্টারের মন্তব্য বন্ধ করে দেওয়া, এমএল অ্যালগরিদম কোনটি ব্যবহার করবেন তা জিজ্ঞাসা করা ভুল প্রশ্ন। আপনি ইঞ্জিনিয়ারিং করতে পারেন এমন বৈশিষ্ট্যগুলির কথা চিন্তা করুন এবং কোন পদ্ধতিটি ব্যবহার করবেন তা নির্ধারণ করুন (এখানে বহুবচন প্রয়োজনীয়; আপনার সমস্যাটি খুব ভালভাবে না বোঝা গেলে কখনও কখনও একটি পদ্ধতি ব্যবহার করা উচিত নয়)। চেষ্টা করার মতো আরও কয়েকটি সম্ভাব্য বৈশিষ্ট্য: সেন্ট্রয়েড থেকে দূরত্ব (উভয় পরম্পরাগত এবং গড় পয়েন্ট-সেন্ট্রয়েড দূরত্বের তুলনায়), উত্স থেকে দূরত্ব, মূল-থেকে-পয়েন্ট ভেক্টরটি একটি অক্ষ দিয়ে তৈরি করে।
পল

1
দুই বা ততোধিক পয়েন্টগুলি ইচ্ছামত একে অপরের নিকটবর্তী হতে পারে?
ইমরান

উত্তর:


6

এটি একটি আকর্ষণীয় সমস্যা! দুটি জিনিস এটিকে বিশেষ করে চ্যালেঞ্জিং করে তোলে:

  • আমাদের কীভাবে দুটি পয়েন্ট সেট তুলনা করা উচিত? মেশিন লার্নিংয়ে ধ্রুপদী সমস্যাগুলির একটি নির্দিষ্ট সংখ্যক বৈশিষ্ট্য রয়েছে এবং এই বৈশিষ্ট্যগুলি বিনিময়যোগ্য নয়: উদাহরণস্বরূপ, বৈশিষ্ট্যযুক্ত ageএবং পৃথক ব্যক্তিদের সাথে আমার ডেটা থাকতে পারে height(সেন্টিমিটারে)। প্রতিটি নমুনায় প্রত্যেকের জন্য একটি করে প্রবেশ রয়েছে এবং অবশ্যই এর (age, height) = (22, 180)মতো নয় (age, height) = (180, 22)। আপনার সমস্যার ক্ষেত্রেও সত্য নয়। একটি বিন্দুতে 3 থেকে 10 পয়েন্টের মধ্যে থাকে এবং দুটি বিন্দু সেটগুলির তুলনা করার সময় আমরা যে বিন্দুতে পয়েন্টগুলি প্রবেশ করি তাতে কোনও তাত্পর্য হওয়া উচিত নয়।
  • আমরা কীভাবে ভবিষ্যদ্বাণী করব? বলুন আমরা আমাদের প্রশিক্ষণ সেট থেকে পয়েন্ট সেট বাছাই করার একটি উপায় খুঁজে পেয়েছি যা উপরের আপনার পয়েন্ট সেটগুলির অনুরূপ। আমরা সমস্যার মুখোমুখি হই যে আমাদের ভবিষ্যদ্বাণীটি অবশ্যই আপনার ছবিতে points পয়েন্টের একটি হতে হবে; তবে এই পয়েন্টগুলির মধ্যে কোনওটি একই পয়েন্ট সেটে থাকতে পারে।

আমাকে একটি অ্যালগরিদমের রূপরেখা দিন যা উভয় চ্যালেঞ্জ নিয়ে কাজ করে। পূর্বাভাসের নির্ভুলতা খুব ভাল নয়; তবে আপনি কীভাবে এটি উন্নত করতে পারেন তার কোনও উপায় দেখতে পাবেন। এবং কমপক্ষে এটি কিছু ভবিষ্যদ্বাণী করে , তাই না?

1. নমুনা অনুকরণ

অ্যালগরিদম পরীক্ষা করতে সক্ষম হতে, আমি ফাংশন লিখেছি যা নমুনা এবং লেবেল উত্পন্ন করে।

উত্পাদনের নমুনা: প্রতিটি নমুনায় 3 থেকে 10 পয়েন্ট থাকে। পয়েন্ট সংখ্যা এলোমেলো, একটি অভিন্ন বিতরণ থেকে আঁকা। প্রতিটি পয়েন্ট ফর্ম হয় (x_coordinate, y_coordinate)। স্থানাঙ্কগুলি আবার এলোমেলো, একটি সাধারণ বিতরণ থেকে আঁকা।

import numpy as np
from random import randint

def create_samples(number_samples, min_points, max_points):

    def create_single_sample(min_points, max_points):
        n = randint(min_points, max_points)
        return np.array([np.random.normal(size=2) for _ in range(n)]) 

    return np.array([create_single_sample(min_points, max_points) for _ in range(number_samples)])

তৈরির লেবেল: খেলনার উদাহরণ হিসাবে, ধরে নেওয়া যাক যে পয়েন্টটি বেছে নেওয়ার নিয়মটি হল: সর্বদা নিকটতম বিন্দুটি বেছে নিন (0, 0), যেখানে 'নিকটতম' ইউক্যালিডিয়ান আদর্শের বিবেচনায় বোঝা উচিত।

def decision_function_minnorm(sample):
    norms = np.apply_along_axis(np.linalg.norm, axis=1, arr=sample)
    return sample[norms.argmin()]

def create_labels(samples, decision_function):
    return np.array([decision_function(sample) for sample in samples])

আমরা এখন আমাদের ট্রেন এবং পরীক্ষার সেটগুলি তৈরি করতে পারি:

n_train, n_test = 1000, 100
dec_fun = decision_function_minnorm

X_train = create_samples(number_samples=n_train, min_points=3, max_points=10)
X_test = create_samples(number_samples=n_test, min_points=3, max_points=10)
y_train = create_labels(X_train, dec_fun)
y_test = create_labels(X_test, dec_fun)

২.হসডর্ফ দূরত্বের মাধ্যমে পয়েন্ট সেটগুলির তুলনা করুন

আসুন প্রথম সমস্যাটি মোকাবেলা করুন: আমাদের কীভাবে বিভিন্ন পয়েন্ট সেটগুলির তুলনা করা উচিত? পয়েন্ট সেটে পয়েন্টের সংখ্যা পৃথক। এছাড়াও মনে রাখবেন যে আমরা পয়েন্টগুলি যে ক্রমে পয়েন্টগুলি লিখেছি তা বিবেচনা করা উচিত নয়: পয়েন্ট সেটটির [(0,0), (1,1), (2,2)]সাথে তুলনা করলে পয়েন্ট সেটের তুলনায় একই ফল পাওয়া উচিত [(2,2), (0,0), (1,1)]। আমার পদ্ধতিটি হসডরফের দূরত্বের মাধ্যমে পয়েন্ট সেটগুলির তুলনা করা :

def hausdorff(A, B):

    def dist_point_to_set(x, A):
        return min(np.linalg.norm(x - a) for a in A)

    def dist_set_to_set(A, B):
        return max(dist_point_set(a, B) for a in A)

    return max(dist_set_to_set(A, B), dist_set_to_set(B, A))

৩. কে-নিকটতম প্রতিবেশীদের মাধ্যমে ভবিষ্যদ্বাণী করা এবং গড়

আমাদের এখন পয়েন্ট সেটগুলির মধ্যে দূরত্বের ধারণা রয়েছে। এটি কে-নিকটতম প্রতিবেশীদের শ্রেণিবিন্যাস ব্যবহার করা সম্ভব করে তোলে: একটি পরীক্ষার পয়েন্ট সেট দেওয়া, আমরা kআমাদের প্রশিক্ষণের নমুনায় পয়েন্ট সেটগুলি পাই যা পরীক্ষার পয়েন্ট সেটটির সাথে সামান্যতম হাউসডর্ফ দূরত্বে থাকে এবং তাদের লেবেল প্রাপ্ত করে। এখন দ্বিতীয় সমস্যাটি আসে: আমরা কীভাবে এই kলেবেলগুলিকে পরীক্ষার পয়েন্ট সেটটির ভবিষ্যদ্বাণীতে পরিণত করব ? আমি সবচেয়ে সহজ পদ্ধতির গ্রহণ করেছি: লেবেলগুলি গড় করুন এবং টেস্ট পয়েন্ট সেটটিতে পয়েন্টটি পূর্বাভাস দিন যা গড়ের নিকটে থাকে।

def predict(x, num_neighbors):
    # Find num_neighbors closest points in X_train.
    distances_to_train = np.array([hausdorff(x, x_train) for x_train in X_train])
    neighbors_idx = np.argpartition(distances_to_train, -num_neighbors)[-num_neighbors:]

    # Get labels of the neighbors and calculate the average.
    targets_neighbors = y_train[neighbors_idx]
    targets_mean = sum(targets_neighbors) / num_neighbors

    # Find point in x that is closest to targets_mean and use it as prediction.
    distances_to_mean = np.array([np.linalg.norm(p - targets_mean) for p in x])
    closest_point = x[distances_to_mean.argmin()]

    return closest_point

4. পরীক্ষা

আমাদের অ্যালগরিদমের কর্মক্ষমতা পরীক্ষা করার জন্য সবকিছুই ঠিক আছে।

num_neighbors = 70
successes = 0
for i, x in enumerate(X_test):
    print('%d/%d' % (i+1, n_test))
    prediction = predict(x, num_neighbors)
    successes += np.array_equal(prediction, y_test[i])

প্রদত্ত সিদ্ধান্ত ফাংশনের জন্য এবং num_neighbors = 70আমরা 84% এর পূর্বাভাসের সঠিকতা পাই get এটি মারাত্মকভাবে ভাল নয় এবং এটি অবশ্যই আমাদের সিদ্ধান্তের কার্যক্রমে নির্দিষ্ট, যা পূর্বাভাস দেওয়া মোটামুটি সহজ বলে মনে হয়।

এটি দেখতে, একটি ভিন্ন সিদ্ধান্ত ফাংশন সংজ্ঞায়িত করুন:

decision_function_maxaverage(sample):
    avgs = (sample[:, 0] + sample[:, 1]) / 2
    return sample[norms.argmin()]

এই ফাংশনটি ব্যবহার dec_fun = decision_function_maxaverageকরে ভবিষ্যদ্বাণীটির নির্ভুলতা 45% এ নেমে আসে। এটি দেখায় যে আপনার লেবেলগুলি উত্পন্ন করে এমন সিদ্ধান্তের বিধি সম্পর্কে চিন্তা করা কতটা গুরুত্বপূর্ণ। লোকেরা কেন নির্দিষ্ট পয়েন্টগুলি বেছে নেয় আপনার যদি ধারণা থাকে তবে এটি আপনাকে সেরা অ্যালগরিদম খুঁজে পেতে সহায়তা করবে।

এই অ্যালগরিদমকে উন্নত করার কয়েকটি উপায়: (১) হাউসডর্ফ দূরত্বের পরিবর্তে আলাদা দূরত্বের ফাংশন ব্যবহার করুন, (২) কে-নিকটবর্তী প্রতিবেশীদের চেয়ে আরও পরিশীলিত কিছু ব্যবহার করুন, (৩) কীভাবে নির্বাচিত প্রশিক্ষণ লেবেলগুলিকে পূর্বাভাসে পরিণত করা যায় তা উন্নতি করুন।


3

এই সমস্যাটি সমাধানের জন্য আপনি নিউরাল নেটওয়ার্কগুলি ব্যবহার করতে পারেন এমন কয়েকটি উপায় এখানে রয়েছে:

একটি সরল ফিডফর্ডার নিউরাল নেটওয়ার্ক সহ:

  • (-1, -1) থেকে (1,1) উত্সের চারপাশে স্কোয়ারে ফিট করতে আপনার ডেটা স্কেল করুন
  • প্রতিটি পয়েন্ট এর x এবং y স্থানাঙ্কের সাথে দুটি ইনপুট, বা যদি 0,0 হয় তবে প্রতিনিধিত্ব করুন point দফা উপস্থিত নেই
  • প্রতিটি পয়েন্টের জন্য তৃতীয় সূচক ইনপুট যুক্ত করুন, এটি নির্দেশ করে যে পয়েন্টটি উপস্থিত রয়েছে কিনা
  • লুকানো স্তরগুলির সংখ্যা এবং আকার চয়ন করুন
  • আউটপুটে 10 মাপের একটি সফটম্যাক্স স্তর ব্যবহার করুন

সুতরাং প্রতিটি ইনপুট উদাহরণ 30 দৈর্ঘ্যের ভেক্টর হবে যেখানে শেষ 3 * (10-) মানগুলি যখন শূন্য হয় তখন সেটে উপস্থিত পয়েন্টগুলি এবং আউটপুটটি 10 ​​এর দৈর্ঘ্যের ভেক্টর যা 1 এর সমষ্টি হয়, বৃহত্তম মানটি পূর্বাভাসিত বিন্দুর সাথে মিলিত হয় কিনা (যার অবস্থান ইনপুটটিতে সেই অবস্থানের সাথে মিলে যায়)।

একটি কনভোলিউশনাল নিউরাল নেটওয়ার্ক সহ:

  • আপনার বিমানটিকে গ্রিডে ভাগ করুন এন এক্স এন স্কোয়ারগুলি এবং আপনার ইনপুটটিকে একটি হিসাবে উপস্থাপন করে এন এক্স এন ম্যাট্রিক্স যে যদি আছে বর্গাকার পয়েন্ট (আমি,) এবং 0অন্যথায়। আশা করি পয়েন্টগুলি ওভারল্যাপ হবে না, সুতরাং আপনার একটি ম্যাট্রিক্স রয়েছে1গুলি এবং 0গুলি।
  • আপনার ইনপুট ম্যাট্রিক্সে একটি সিএনএন প্রশিক্ষণ দিন। আপনার আউটপুট আকার আকারের একটি সফটম্যাক্স হওয়া উচিতএন*এন, যা সমতল ইনপুট আকারের সাথে সম্পর্কিত। সংশ্লিষ্ট আউটপুট স্থানাঙ্কগুলিতে সর্বাধিক মানযুক্ত পয়েন্টটি চয়ন করুন।

আপনার ডেটা সহজাতভাবে স্থানিক হওয়ায় সিএনএন আরও ভাল পারফর্ম করতে পারে। তবে আপনাকে সিদ্ধান্ত নিতে হবে যদি দুটি বা ততোধিক পয়েন্ট ওভারল্যাপ হয় তবে কী করবেন। সবচেয়ে সহজ সমাধানটি এলোমেলোভাবে একটি চয়ন করা, যা আপনার নির্দিষ্ট কাজের উপর নির্ভর করে ঠিক আছে।

একটি পুনরাবৃত্ত নিউরাল নেটওয়ার্ক সহ:

  • আকারযুক্ত (x, y) পয়েন্টের ভেরিয়েবল দৈর্ঘ্যের ক্রমগুলিতে ফিড দিন এবং একটি আকার 10 সফটম্যাক্স অনুমান esti

হ্যাঁ, এটি আরএনএনগুলির সাথে যতটা সহজ! এগুলি পরিবর্তনশীল দৈর্ঘ্যের ইনপুটগুলি ভালভাবে পরিচালনা করে তবে স্থানীয় স্থানটি ডেটা পরিচালনা করার জন্য তাদের এখনও সিএনএন এর সুবিধার অভাব রয়েছে।

আদেশ সহকারে:

যদি কোনও এফএনএন বা আরএনএন ব্যবহার করে থাকেন তবে আপনি কীভাবে আপনার ইনপুট ডেটা অর্ডার করবেন সে বিষয়টিও রয়েছে। যদি আপনার আসল ডেটাতে অন্তর্নিহিত অর্ডার না থাকে, তবে আমরা চাই না যে আমাদের নেটওয়ার্ক বিভিন্ন অর্ডারে এনকোড করা একই ডেটার জন্য বিভিন্ন পূর্বাভাস দেয়। এটি হ্যান্ডেল করার একটি উপায় হ'ল ডেটা বর্ধনের সাথে : প্রতিটি প্রশিক্ষণের উদাহরণকে কয়েকবার বিভিন্ন ইনপুট অর্ডার সহ নকল করুন, সুতরাং আশা করি আপনার নেটওয়ার্ক উপযুক্ত প্রতিসাম্যগুলি শিখতে পারে।

আপনার যদি কেবল একটি পদ্ধতির চেষ্টা করার সময় থাকে তবে আমি সিএনএন বেছে নেব। সিএনএনগুলি স্থানিক ডেটা দিয়ে ভাল করার জন্য ডিজাইন করা হয়েছে এবং ইনপুট অর্ডারগুলি নিয়ে কোনও সমস্যা নেই।


1
এটির সাথে সমস্যাটি হ'ল ভবিষ্যদ্বাণীটি অর্ডার-নির্ভর। পয়েন্ট সেটটি অ্যালগরিদমকে খাওয়ানো পয়েন্ট সেট (0,0), (1,1), (2,2)খাওয়ানোর চেয়ে আলাদা প্রভাব ফেলবে (1,1), (2,2), (0,0)
ইলিয়াস স্ট্রেলে

শুভ পয়েন্ট ইলিয়াস - আমি এটি হ্রাস করার জন্য একটি পরামর্শ দেব।
ইমরান

ইলিয়াস স্ট্রেহলে এটি উল্লেখ করা ভাল, আদেশ এই সমস্যার জন্য অপ্রাসঙ্গিক। আমাদের পয়েন্টগুলির একটি সেট রয়েছে (সমস্ত অনন্য, কোনও আদেশ নেই)।
Elmex80s
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.