কারও কি টি-এসকিউএল-তে লেখা থিল-সেন রিগ্রেশন ফাংশন রয়েছে?
আমি পার্ল লিখিত একটি পেয়েছি , কিন্তু আমি এটি এসকিউএল এ পুনরায় পুনর্নির্মাণ করতে সক্ষম নই।
কারও কি টি-এসকিউএল-তে লেখা থিল-সেন রিগ্রেশন ফাংশন রয়েছে?
আমি পার্ল লিখিত একটি পেয়েছি , কিন্তু আমি এটি এসকিউএল এ পুনরায় পুনর্নির্মাণ করতে সক্ষম নই।
উত্তর:
আমি যখন মিথ্যা বলছিলাম তখন আমি এসকিউএল এ পুনরায় পুনর্নির্মাণ করতে পারছি না। আমি খুব অলস ছিল। ব্যবহারের উদাহরণ সহ কোড এখানে।
কোডটি থিজেন পার্ল লাইব্রেরির উপর ভিত্তি করে কুইকমিডিয়ান ব্যবহার করে । আসুন পদ্ধতিতে আমাদের ডেটা সহজেই পাস করার জন্য একটি নতুন টেবিল প্রকারটি সংজ্ঞায়িত করা যাক।
CREATE TYPE dbo.TheilSenInputDataTableType AS TABLE
(
ID INT IDENTITY(1,1),
x REAL,
y REAL
)
আইডি কলামটি নোট করুন, যা এখানে গুরুত্বপূর্ণ কারণ আমাদের সমাধান থিলসেন.পিএম-এ পাওয়া অভ্যন্তরীণ লুপটির সঠিক ব্যাখ্যা অর্জন করতে ক্রস অ্যাপ্লিকেশন স্টেটমেন্ট ব্যবহার করে।
my ($x1,$x2,$y1,$y2);
foreach my $i(0 .. $n-2){
$y1 = $y->[$i];
$x1 = $x->[$i];
foreach my $j($i+1 .. $n-1){
$y2 = $y->[$j];
$x2 = $x->[$j];
আসল ধরণের মানগুলির একটি অ্যারে সঞ্চয় করার জন্য আমাদের একটি নতুন ডেটা টাইপও প্রয়োজন।
CREATE TYPE [dbo].[RealArray] AS TABLE(
[val] [real] NULL
)
প্রদত্ত অ্যারেটির জন্য মিডিয়ান ফিরিয়ে দেওয়ার জন্য এখানে f_QuickMedian ফাংশন is এটির কৃতিত্ব ইটজিক বেন-গানের কাছে যায় ।
CREATE FUNCTION [dbo].[f_QuickMedian](@RealArray RealArray READONLY)
RETURNS REAL
AS
BEGIN
DECLARE @Median REAL;
DECLARE @QMedian REAL;
SELECT @Median = AVG(1.0 * val)
FROM
(
SELECT o.val, rn = ROW_NUMBER() OVER (ORDER BY o.val), c.c
FROM @RealArray AS o
CROSS JOIN (SELECT c = COUNT(*) FROM @RealArray) AS c
) AS x
WHERE rn IN ((c + 1)/2, (c + 2)/2);
SELECT TOP 1 @QMedian = val FROM @RealArray
ORDER BY ABS(val - @Median) ASC, val DESC
RETURN @QMedian
END
এবং পিটিহিলসেন অনুমানকারী :
CREATE PROCEDURE [dbo].[p_TheilSen](
@TheilSenInput TheilSenInputDataTableType READONLY
, @m Real OUTPUT
, @c Real OUTPUT
)
AS
BEGIN
DECLARE
@m_arr RealArray
, @c_arr RealArray;
INSERT INTO @m_arr
SELECT m
FROM
(
SELECT
t1.x as x1
, t1.y as y1
, t2o.x as x2
, t2o.y as y2
, t2o.y-t1.y as [y2 - y1]
, t2o.x-t1.x as [x2 - x1]
, CASE WHEN (t2o.x <> t1.x) THEN CAST((t2o.y-t1.y) AS Real)/(t2o.x-t1.x) ELSE NULL END AS [($y2-$y1)/($x2-$x1)]
, CASE WHEN t1.y = t2o.y THEN 0
ELSE
CASE WHEN t1.x = t2o.x THEN NULL
ELSE
-- push @M, ($y2-$y1)/($x2-$x1);
CAST((t2o.y-t1.y) AS Real)/(t2o.x-t1.x)
END
END as m
FROM @TheilSenInput t1
CROSS APPLY
(
SELECT t2.x, t2.y
FROM @TheilSenInput t2
WHERE t2.ID > t1.ID
) t2o
) t
WHERE m IS NOT NULL
SELECT @m = dbo.f_QuickMedian(@m_arr)
INSERT INTO @c_arr
SELECT y - (@m * x)
FROM @TheilSenInput
SELECT @c = dbo.f_QuickMedian(@c_arr)
END
উদাহরণ:
DECLARE
@in TheilSenInputDataTableType
, @m Real
, @c Real
INSERT INTO @in(x,y) VALUES (10.79,118.99)
INSERT INTO @in(x,y) VALUES (10.8,120.76)
INSERT INTO @in(x,y) VALUES (10.86,122.71)
INSERT INTO @in(x,y) VALUES (10.93,125.48)
INSERT INTO @in(x,y) VALUES (10.99,127.31)
INSERT INTO @in(x,y) VALUES (10.96,130.06)
INSERT INTO @in(x,y) VALUES (10.98,132.41)
INSERT INTO @in(x,y) VALUES (11.03,135.89)
INSERT INTO @in(x,y) VALUES (11.08,139.02)
INSERT INTO @in(x,y) VALUES (11.1,140.25)
INSERT INTO @in(x,y) VALUES (11.19,145.61)
INSERT INTO @in(x,y) VALUES (11.25,153.45)
INSERT INTO @in(x,y) VALUES (11.4,158.03)
INSERT INTO @in(x,y) VALUES (11.61,162.72)
INSERT INTO @in(x,y) VALUES (11.69,167.67)
INSERT INTO @in(x,y) VALUES (11.91,172.86)
INSERT INTO @in(x,y) VALUES (12.07,177.52)
INSERT INTO @in(x,y) VALUES (12.32,182.09)
EXEC p_TheilSen @in, @m = @m OUTPUT, @c = @c OUTPUT
SELECT @m
SELECT @c
রিটার্নস:
m = 52.7079
c = -448.4853
কেবল তুলনার জন্য, পার্ল সংস্করণ একই ডেটা সেটের জন্য নিম্নলিখিত মানগুলি প্রদান করে:
m = 52.7078651685394
c = -448.484943820225
ফাইলসিস্টেমের জন্য ডেইসটোফিল মেট্রিক গণনা করার জন্য আমি থিলসেন অনুমানকারী ব্যবহার করি। উপভোগ করুন!
এটি সম্ভবত এসকিউএলসিআরআর-তে কিছু করার জন্য ভাল ফিট হবে, নিম্নলিখিত প্রশ্ন / উত্তরের (ডিবিএ.এসইতেও এখানে) অনুরূপ:
দীর্ঘতম কমন সাবস্ট্রিং সমস্যার কোনও এসকিউএল সার্ভার বাস্তবায়ন রয়েছে?
আমার পরে যখন সময় হবে তখন আমি দেখতে পাব এটি কতটা সম্ভব হবে।
আমি টি-এসকিউএল, ওরাকল এবং সাধারণভাবে সার্ভারগুলির জন্যও পরীক্ষা করেছিলাম (খাঁটি এসকিউএলটিতে লেখা জটিল নয়)।
তবে, আপনি এটি (পাইথনের জন্য একটি বৈজ্ঞানিক / পরিসংখ্যান প্যাকেজ) আগ্রহী হতে পারে । অ্যালগরিদম সেখানে এবং পাইথনেও প্রয়োগ করা হয়। পাইথন এমন একটি ভাষা যা পার্লের বিপরীতে মানুষের বুঝতে সক্ষম হওয়ার কমপক্ষে কিছু সুযোগ রয়েছে।
আপনার প্রশ্নটি আমাকে উত্সাহিত করেছিল এবং আমি চারপাশে খনন করেছি। এখানে সি এবং সি ++ গ্রন্থাগার রয়েছে যা এই অ্যালগরিদম ধারণ করে - এবং এটি কয়েকটি আর প্যাকেজগুলিতে পাওয়া যায়। এবং @ শ্রুতজকির পোস্টটিও আকর্ষণীয় দেখাচ্ছে।
একটি আকর্ষণীয় প্রশ্ন বিটিডব্লিউয়ের জন্য +1 - এবং ফোরামে স্বাগতম :-)