ডেটা দুটি ট্রেন্ড আছে; কিভাবে স্বাধীন ট্রেন্ডলাইন নিষ্কাশন?


34

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

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

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


6
আমি এখনও অবধি সেরা উত্তর গ্রাফ কাগজে এটি মুদ্রণ এবং একটি পেন্সিল এবং শাসক এবং ক্যালকুলেটর ব্যবহার করা ...
jbbiomed

হতে পারে আপনি জোড়-ভিত্তিক opালগুলি গণনা করতে পারেন এবং এগুলিকে দুটি "opeাল-ক্লাস্টার" এ গ্রুপ করতে পারেন। তবে আপনার যদি দুটি সমান্তরাল প্রবণতা থাকে তবে এটি ব্যর্থ হবে।
থমাস জংবলুট

1
এটির সাথে আমার কোনও ব্যক্তিগত অভিজ্ঞতা নেই তবে আমি মনে করি স্ট্যাটাস মডেলগুলি পরীক্ষা করে দেখার মতো হবে। পরিসংখ্যানগতভাবে, গোষ্ঠীর সাথে ইন্টারঅ্যাকশন সহ একটি লিনিয়ার রিগ্রেশন পর্যাপ্ত হবে (আপনি যদি না বলে থাকেন যে আপনার গ্রুপটি ডেটা নেই, যে ক্ষেত্রে এটি খানিকটা চুলের ...)
ম্যাট পার্কার

1
দুর্ভাগ্যক্রমে এটি ডেটা নয় বরং ব্যবহারের ডেটা এবং স্পষ্টতই দুটি পৃথক সিস্টেমের ব্যবহার একই ডেটা সেটে মিশে যায়। আমি দুটি ব্যবহারের ধরণগুলি বর্ণনা করতে সক্ষম হতে চাই, তবে আমি ফিরে যেতে পারি না এবং ডেটা পুনরায় সংগ্রহ করতে পারি না কারণ এটি ক্লায়েন্টের দ্বারা সংগৃহীত প্রায় 6 বছরের মূল্যবান তথ্য উপস্থাপন করে।
jbbiomed

2
কেবলমাত্র নিশ্চিত করার জন্য: আপনার ক্লায়েন্টের কোনও অতিরিক্ত ডেটা নেই যা নির্দেশ করে যে কোন জনসংখ্যা থেকে কোন পরিমাপ আসে? এটি আপনার বা আপনার ক্লায়েন্টের কাছে থাকা বা সন্ধান করতে পারে এমন 100% ডেটা। এছাড়াও, 2012 দেখে মনে হচ্ছে আপনার ডেটা সংগ্রহ আলাদা হয়ে গেছে বা আপনার সিস্টেমগুলির মধ্যে একটি বা উভয়ই মেঝেতে পড়েছে fell ট্র্যাড লাইন যে বিন্দুতে অনেক বেশি তা আমাকে বিস্মিত করে।
ওয়েইন

উত্তর:


30

আপনার সমস্যা সমাধানের জন্য, একটি ভাল পদ্ধতির সম্ভাব্য মডেল সংজ্ঞা দেওয়া যা আপনার ডেটাসেট সম্পর্কে অনুমানের সাথে মেলে। আপনার ক্ষেত্রে, আপনি সম্ভবত লিনিয়ার রিগ্রেশন মডেলগুলির মিশ্রণ চান। আপনি বিভিন্ন মিশ্রণ উপাদানগুলির সাথে বিভিন্ন ডেটা পয়েন্ট যুক্ত করে গাউসীয় মিশ্রণ মডেলের অনুরূপ একটি "মিশ্রণের সংমিশ্রণ" মডেল তৈরি করতে পারেন।

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

import numpy as np
import matplotlib.pyplot as plt 
import scipy.linalg as lin

#generate some random data
N=100
x=np.random.rand(N,2)
x[:,1]=1

w=np.random.rand(2,2)
y=np.zeros(N)

n=int(np.random.rand()*N)
y[:n]=np.dot(x[:n,:],w[0,:])+np.random.normal(size=n)*.01
y[n:]=np.dot(x[n:,:],w[1,:])+np.random.normal(size=N-n)*.01


rx=np.ones( (100,2) )
r=np.arange(0,1,.01)
rx[:,0]=r

#plot the random dataset
plt.plot(x[:,0],y,'.b')
plt.plot(r,np.dot(rx,w[0,:]),':k',linewidth=2)
plt.plot(r,np.dot(rx,w[1,:]),':k',linewidth=2)

# regularization parameter for the regression weights
lam=.01

def em():
    # mixture weights
    rpi=np.zeros( (2) )+.5

    # expected mixture weights for each data point
    pi=np.zeros( (len(x),2) )+.5

    #the regression weights
    w1=np.random.rand(2)
    w2=np.random.rand(2)

    #precision term for the probability of the data under the regression function 
    eta=100

    for _ in xrange(100):
        if 0:
            plt.plot(r,np.dot(rx,w1),'-r',alpha=.5)
            plt.plot(r,np.dot(rx,w2),'-g',alpha=.5)

        #compute lhood for each data point
        err1=y-np.dot(x,w1)
        err2=y-np.dot(x,w2)
        prbs=np.zeros( (len(y),2) )
        prbs[:,0]=-.5*eta*err1**2
        prbs[:,1]=-.5*eta*err2**2

        #compute expected mixture weights
        pi=np.tile(rpi,(len(x),1))*np.exp(prbs)
        pi/=np.tile(np.sum(pi,1),(2,1)).T

        #max with respect to the mixture probabilities
        rpi=np.sum(pi,0)
        rpi/=np.sum(rpi)

        #max with respect to the regression weights
        pi1x=np.tile(pi[:,0],(2,1)).T*x
        xp1=np.dot(pi1x.T,x)+np.eye(2)*lam/eta
        yp1=np.dot(pi1x.T,y)
        w1=lin.solve(xp1,yp1)

        pi2x=np.tile(pi[:,1],(2,1)).T*x
        xp2=np.dot(pi2x.T,x)+np.eye(2)*lam/eta
        yp2=np.dot(pi[:,1]*y,x)
        w2=lin.solve(xp2,yp2)

        #max wrt the precision term
        eta=np.sum(pi)/np.sum(-prbs/eta*pi)

        #objective function - unstable as the pi's become concentrated on a single component
        obj=np.sum(prbs*pi)-np.sum(pi[pi>1e-50]*np.log(pi[pi>1e-50]))+np.sum(pi*np.log(np.tile(rpi,(len(x),1))))+np.log(eta)*np.sum(pi)
        print obj,eta,rpi,w1,w2

        try:
            if np.isnan(obj): break
            if np.abs(obj-oldobj)<1e-2: break
        except:
            pass

        oldobj=obj

    return w1,w2


#run the em algorithm and plot the solution
rw1,rw2=em()
plt.plot(r,np.dot(rx,rw1),'-r')
plt.plot(r,np.dot(rx,rw2),'-g')

plt.show()

25

এই থ্রেডের অন্য কোথাও, ব্যবহারকারী 1149913 একটি শক্তিশালী পদ্ধতির (ইএম অনুমান) জন্য দুর্দান্ত পরামর্শ (একটি সম্ভাব্য মডেল সংজ্ঞায়িত) এবং কোড সরবরাহ করে। দুটি বিষয় বিবেচনা করা বাকি:

  1. সম্ভাব্য মডেল থেকে প্রস্থানগুলি কীভাবে মোকাবেলা করতে হবে (যা ২০১১-২০১২ এর ডেটাতে খুব স্পষ্ট এবং কম-opালু পয়েন্টগুলির অপ্রকাশে কিছুটা প্রকট)।

  2. EM অ্যালগরিদম (বা অন্য কোনও অ্যালগোরিদম) এর জন্য শুরু করার মানগুলি কীভাবে চিহ্নিত করা যায়।

# 2 ঠিকানার জন্য, একটি হফ ট্রান্সফর্ম ব্যবহার বিবেচনা করুন । এটি একটি বৈশিষ্ট্য-সনাক্তকরণ অ্যালগরিদম যা বৈশিষ্ট্যগুলির রৈখিক প্রসারগুলি সন্ধানের জন্য দক্ষতার সাথে রেডন ট্রান্সফর্ম হিসাবে গণনা করা যায় ।

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

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

img = Import["http://i.stack.imgur.com/SkEm3.png"]
i = ColorNegate[Binarize[img]]
crop2 = ImageCrop[ImageCrop[i, {694, 531}, {Left, Bottom}], {565, 467}, {Right, Top}]

(এটি এবং বাকী কোডটি ম্যাথামেটিকায় রয়েছে ))

ফসলযুক্ত চিত্র

এই চিত্রের প্রতিটি বিন্দুর সাথে হফ ট্রান্সফর্মে সংক্ষিপ্ত রেখাচিত্রের সাথে মিল রয়েছে, এখানে দৃশ্যমান। তারা সাইন ওয়েভ:

hough2 = Radon[crop2, Method -> "Hough"]  // ImageAdjust

শক্ত রূপান্তর

এটি দৃষ্টিগোচরভাবে সেই ভাবটি প্রকাশ করে যাতে প্রশ্নটি একটি লাইন ক্লাস্টারিং সমস্যা: হফ রূপান্তর এটি এটিকে হ্রাস করে পয়েন্ট ক্লাস্টারিং সমস্যায় , যার কাছে আমরা আমাদের পছন্দ মতো কোনও ক্লাস্টারিং পদ্ধতি প্রয়োগ করতে পারি।

এই ক্ষেত্রে, ক্লাস্টারিং এতটাই পরিষ্কার যে হফ ট্রান্সফর্মের সাধারণ পোস্ট প্রসেসিং যথেষ্ট। রূপান্তরটিতে সর্বাধিক তীব্রতার অবস্থানগুলি সনাক্ত করতে, আমি বিপরীতে বৃদ্ধি পেয়েছি এবং প্রায় 1% ব্যাসার্ধের মধ্যে রূপান্তরটি ঝাপসা করেছি: এটি মূল চিত্রের প্লট পয়েন্টগুলির ব্যাসগুলির সাথে তুলনীয়।

blur = ImageAdjust[Blur[ImageAdjust[hough2, {1, 0}], 8]]

অস্পষ্ট রূপান্তর

ফলাফলটি থ্রোসোল্ডিং করে এটিকে দুটি ছোট ব্লবগুলিতে সংকুচিত করেছিল যার সেন্ট্রয়েডগুলি যুক্তিসঙ্গতভাবে সর্বশ্রেষ্ঠ তীব্রতার পয়েন্টগুলি চিহ্নিত করে: এইগুলি লাগানো রেখাগুলির অনুমান করে।

comp = MorphologicalComponents[blur, 0.777]) // Colorize

0,777

থ্রেশোল্ডেড বাইনারিযুক্ত রূপান্তর

চিত্রের বাম দিকটি 0 ডিগ্রি (অনুভূমিক) এর দিকের সাথে মিলে যায় এবং আমরা বাম থেকে ডানদিকে যেমন দেখতে পাই, সেই কোণটি লাইনরেটিকভাবে 180 ডিগ্রি পর্যন্ত বৃদ্ধি পায়। ইন্টারপোলটিং, আমি গণনা করি যে দুটি ব্লবটি যথাক্রমে 19 এবং 57.1 ডিগ্রি কেন্দ্রিক। আমরা ব্লবগুলির উল্লম্ব অবস্থানগুলি থেকে বিরতিগুলিও পড়তে পারি। এই তথ্যটি প্রাথমিক ফিটগুলি দেয়:

width = ImageDimensions[blur][[1]];
slopes =  Module[{x, y, z}, ComponentMeasurements[comp, "Centroid"] /. 
          Rule[x_, {y_, z_}] :>  Round[((y - 1/2)/(width - 1))  180., 0.1]
  ]

{19., 57.1}

অনুরূপ ফ্যাশনে কেউ এই fitsালগুলির সাথে সম্পর্কিত ইন্টারসেপ্টগুলি গণনা করতে পারে, এই ফিটগুলি দেয়:

লাগানো লাইন

(লাল রেখাটি আগের ছবিটির ক্ষুদ্র গোলাপী বিন্দুর সাথে মিলে যায় এবং নীল রেখাটি বৃহত্তর অ্যাকোয়া ব্লবের সাথে মিলে যায়))

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

এই মুহুর্তে ইএম অ্যালগরিদমের জন্য বা কোনও সম্ভাবনা মিনিমাইজারের (যা ভাল অনুমান দেওয়া হয়, দ্রুত রূপান্তরিত হবে) এর জন্য প্রাথমিক মান হিসাবে এই অনুমানগুলি সরবরাহ করতে পারে। তবে এর থেকে ভাল, শক্তিশালী রিগ্রেশন প্রাক্কলনকারী ব্যবহার করা যেমন পুনরাবৃত্তভাবে কমপক্ষে স্কোয়ারগুলি পুনরায় দেখা যায় । এটি প্রতিটি পয়েন্টে একটি রিগ্রেশন ওজন সরবরাহ করতে সক্ষম । নিম্ন ওজন নির্দেশ করে যে বিন্দু একটি লাইনের সাথে "অন্তর্গত" নয়। প্রতিটি ওজনকে তার যথাযথ লাইনে নির্ধারিত করার জন্য, এই ওজনগুলি অনুসন্ধান করুন। তারপরে, পয়েন্টগুলি শ্রেণিবদ্ধ করে, আপনি পয়েন্টের দুটি গ্রুপে পৃথকভাবে সাধারণ ন্যূনতম স্কোয়ার (বা অন্য কোনও রিগ্রেশন পদ্ধতি) ব্যবহার করতে পারেন।


1
ছবিগুলি এক হাজার শব্দ বলে এবং আপনার কাছে ৫ টি রয়েছে যা কেবলমাত্র এই প্রশ্নের উদ্দেশ্যে তৈরি করা একটি দ্রুত গ্রাফ থেকে এটি অবিশ্বাস্য কাজ! যশ!
jbbiomed

2
কোনও চিত্রের সরল রেখাগুলি সনাক্ত করতে কম্পিউটার ভিশন ক্ষেত্রে প্রচুর পরিমাণে রূপান্তর ব্যবহৃত হয়। কেন এটি পরিসংখ্যানে ব্যবহার করা উচিত নয়? ;)
লুকাস রেইস

এক্সY

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

@ রয়্যালটিস কোড স্নিপেটগুলির মধ্যে একটিতে ফিক্সের প্রয়োজনীয়তা নির্দেশ করার জন্য আপনাকে ধন্যবাদ। আমি যখন আপনার প্রস্তাবিত পরিবর্তনটি পেয়েছি তখন এটি বাতিল হয়ে গিয়েছিল (সঠিকভাবে, কারণ এটি বেশ সঠিক ছিল না, তবে কখনও মনে করবেন না: আপনি এখানে লক্ষ্য রেখেছিলেন যে কোনও ত্রুটি হয়েছিল) grateful আমি রেফারেন্সটি সরিয়ে এটি স্থির করেছি rotationযা মূলত শূন্যে সেট করা হয়েছিল এবং তাই কোনও পার্থক্য রাখেনি।
whuber

15

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

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

ডেটা অ্যাসোসিয়েশন সমস্যা - ক্যান্ডি ডেটা সেট

আমার সহ-লেখক এবং আমি এটিকে একটি "ডেটা অ্যাসোসিয়েশন" সমস্যা হিসাবে চিহ্নিত করেছি। আপনি যখন এটি সমাধান করার চেষ্টা করছেন, তখন সম্ভাব্য ডেটা সংমিশ্রণের ঘনিষ্ঠ পরিমাণের কারণে মূল সমস্যাটি সাধারণত সংহত হয়।

আমাদের কাছে একটি প্রকাশনা রয়েছে " ডেটা অ্যাসোসিয়েশন সমস্যার জন্য ওভারল্যাপিং মিশ্রস অফ গাউসির প্রক্রিয়াগুলি " যেখানে আমরা এনক্রিভের সাধারণ সমস্যার সাথে পুনরাবৃত্ত কৌশলটি ব্যবহার করেছি, খুব ভাল ফলাফল দিয়েছি। আপনি কাগজে লিঙ্কযুক্ত মাতলাব কোড পেতে পারেন।

[আপডেট] জিএমক্লাস্ট লাইব্রেরিতে ওএমজিপি কৌশলটির একটি পাইথন বাস্তবায়ন পাওয়া যাবে

আমার আরও একটি কাগজ রয়েছে যেখানে আমরা উত্তল অপ্টিমাইজেশান সমস্যাটি পেতে সমস্যাটি শিথিল করেছি, তবে এটি এখনও প্রকাশের জন্য গৃহীত হয়নি। এটি 2 কার্ভের জন্য নির্দিষ্ট, তাই এটি আপনার ডেটাতে পুরোপুরি কাজ করবে। আপনি আগ্রহী হলে আমাকে জানতে দিন।


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

1
কাগজটি সত্যই গ্রহণ করা হয়েছে, মাত্র কয়েক মাস আগে। আপনি এটি gtas.unican.es/pub/378 এখানে ডাউনলোড করতে পারেন । এটি আসলে বেশ বিরল সমস্যা (যা এর জনপ্রিয়তার অভাবকে ব্যাখ্যা করতে পারে) তবে আমরা এখনও কিছু আকর্ষণীয় অ্যাপ্লিকেশন খুঁজে পেতে পেরেছি। পছন্দ হলে কাগজের শেষে পরীক্ষা-নিরীক্ষা করে দেখুন।
স্টিভেন

2

ব্যবহারকারীর ১১৪৯৯১ এর একটি দুর্দান্ত উত্তর (+১) রয়েছে তবে এটি আমার কাছে মনে হয় যে আপনার ডেটা সংগ্রহটি ২০১১ সালের শেষের দিকে বিচ্ছিন্ন হয়ে পড়েছে, সুতরাং আপনাকে আপনার ডেটার অংশটি কেটে ফেলতে হবে এবং তারপরেও কিছু বার বিভিন্ন এলোমেলোভাবে চালানো উচিত still আপনি কী পান তা দেখতে সহগের শুরু করা।

জিনিসগুলি করার সহজ সরল উপায় হ'ল আপনার ডেটা চোখের মাধ্যমে দুটি সেটে আলাদা করা, তারপরে আপনি যে লিনিয়ার মডেল প্রযুক্তি ব্যবহার করছেন তা ব্যবহার করুন। আর এ, এটি lmফাংশন হবে।

অথবা চোখে দুটি লাইন মাপসই। আর-তে আপনি এটি করতে ব্যবহার ablineকরবেন।

ডেটার ঝাঁকুনি রয়েছে, বিদেশী রয়েছে এবং শেষের দিকে বিচ্ছিন্ন হয়ে পড়েছে, তবুও চোখের দু'টি মোটামুটি সুস্পষ্ট লাইন রয়েছে, সুতরাং আমি নিশ্চিত যে একটি অভিনব পদ্ধতি এটির জন্য উপযুক্ত কিনা not

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.