একটি স্ট্রিং উপর লিনিয়ার রিগ্রেশন


25

এই চ্যালেঞ্জটি একটি সামান্য কৌশলযুক্ত, তবে সাধারণ, একটি স্ট্রিং দেওয়া s:

meta.codegolf.stackexchange.com

xস্ট্রেনে স্থানাঙ্ক হিসাবে অক্ষরের অবস্থান এবং স্থানাঙ্ক হিসাবে ascii মান ব্যবহার করুন y। উপরের স্ট্রিংয়ের জন্য, স্থানাঙ্কের ফলস্বরূপ সেটগুলি হ'ল:

0, 109
1, 101
2, 116
3, 97
4, 46
5, 99
6, 111
7, 100
8, 101
9, 103
10,111
11,108
12,102
13,46
14,115
15,116
16,97
17,99
18,107
19,101
20,120
21,99
22,104
23,97
24,110
25,103
26,101
27,46
28,99
29,111
30,109

এর পরে, আপনি লিনিয়ার রিগ্রেশন ব্যবহার করে যে সেটটি সংগ্রহ করেছেন সেটির sl াল এবং ওয়াই-ইন্টারসেপ্ট উভয়ই গণনা করতে হবে , উপরের সেটটি এখানে প্লট করা হয়েছে:

চক্রান্ত

যার ফলাফল (0-সূচকযুক্ত) এর সর্বোত্তম ফিট লাইনের ফলাফল:

y = 0.014516129032258x + 99.266129032258

এখানে 1-ইনডেক্সেড সেরা-ফিট লাইন:

y = 0.014516129032258x + 99.251612903226

সুতরাং আপনার প্রোগ্রামটি ফিরে আসবে:

f("meta.codegolf.stackexchange.com") = [0.014516129032258, 99.266129032258]

বা (অন্য যে কোনও সংবেদনশীল ফর্ম্যাট):

f("meta.codegolf.stackexchange.com") = "0.014516129032258x + 99.266129032258"

বা (অন্য যে কোনও সংবেদনশীল ফর্ম্যাট):

f("meta.codegolf.stackexchange.com") = "0.014516129032258\n99.266129032258"

বা (অন্য যে কোনও সংবেদনশীল ফর্ম্যাট):

f("meta.codegolf.stackexchange.com") = "0.014516129032258 99.266129032258"

এটি সুস্পষ্ট না হলে কেন এটি সেই ফর্ম্যাটে ফিরে আসবে তা কেবল ব্যাখ্যা করুন।


কিছু স্পষ্ট করার নিয়ম:

- Strings are 0-indexed or 1 indexed both are acceptable.
- Output may be on new lines, as a tuple, as an array or any other format.
- Precision of the output is arbitrary but should be enough to verify validity (min 5).

এটি সর্বনিম্ন বাইট-কাউন্ট জেতা।


3
Opeাল এবং y- ইন্টারসেপ্ট গণনা করার জন্য আপনার কাছে কোনও লিঙ্ক / সূত্র আছে?
রড

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


2
সেরা-ফিট লাইনের প্রকৃত সমীকরণ যেমন ফিরিয়ে দেওয়া ঠিক হবে 0.014516129032258x + 99.266129032258?
গ্রেগ মার্টিন

2
এই চ্যালেঞ্জের শিরোনাম এই দুর্দান্ত গানটি সারা দিনের জন্য আমার মাথায় ফেলেছে
লুইস মেন্ডো

উত্তর:


2

এমএটিএল , 8 বাইট

n:G3$1ZQ

1-ভিত্তিক স্ট্রিং সূচক ব্যবহার করা হয়।

এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা

n:     % Input string implicitly. Push [1 2 ... n] where n is string length.
       % These are the x values
G      % Push the input string. A string is an array of chars, which is
       % equivalent to an array of ASCII codes. These are the y values
3$     % The next function will use 3 inputs
1      % Push 1
ZQ     % Fit polynomial of degree 1 to those x, y data. The result is an
       % array with the polynomial coefficients. Implicitly display

7

অক্টাভা, 29 26 24 20 বাইট

@(s)s/[!!s;1:nnz(s)]

অনলাইনে চেষ্টা করে দেখুন!

আমরা মডেল আছে

y= intercept *x^0 + slope * x
 = intercept * 1  + slope * x

এখানে yস্ট্রিংয়ের ASCII মানs

পরামিতিগুলি বিরতি এবং opeালু সন্ধানের জন্য আমরা নিম্নলিখিত সমীকরণটি গঠন করতে পারি:

s = [intercept slope] * [1 X]

সুতরাং

[intercept slope] = s/[1 x]

!!sস্ট্রিংয়ের সাথে একই দৈর্ঘ্যের একটি স্ট্রিংকে একটি ভেক্টরে রূপান্তর করে।
যার ভেক্টর ইন্টারসেপ্টের অনুমানের জন্য ব্যবহৃত হয়।
1:nnz(s)হিসাবে ব্যবহৃত স্ট্রিংয়ের উপাদানগুলির সংখ্যা 1 থেকে শুরু করে x

পূর্ববর্তী উত্তর

@(s)ols(s'+0,[!!s;1:nnz(s)]')

পরীক্ষার জন্য নিম্নলিখিত কোডটি অষ্টাভে অনলাইনে পেস্ট করুন

(@(s)ols(s'+0,[!!s;1:nnz(s)]'))('meta.codegolf.stackexchange.com')

একটি ফাংশন যা স্ট্রিংটিকে ইনপুট হিসাবে গ্রহণ করে এবং মডেলের সাধারণ সর্বনিম্ন স্কোয়ার অনুমান প্রয়োগ করে y = x*b + e

OL এর প্রথম যুক্তিটি হ'ল এর yজন্য আমরা স্ট্রিংটি স্থানান্তর করি sএবং এর ASCII কোড পেতে 0 নম্বর যুক্ত করি।


/, ভালো বুদ্ধি!
লুইস মেন্ডো

6

টিআই-বেসিক, 51 (+ 141) বাইট

স্ট্রিংগুলি টিআই-বেসিকগুলিতে 1-ভিত্তিক।

Input Str1
seq(I,I,1,length(Str1->L1
32+seq(inString(Str2,sub(Str1,I,1)),I,1,length(Str1->L2
LinReg(ax+b)

অন্যান্য উদাহরণের মতো, এটি এক্সের ক্ষেত্রেও সেরা ফিট রেখার সমীকরণকে বহন করে uts

! "# $% & '() * + - / 0123456789;।? <=> @ ABCDEFGHIJKLMNOPQRSTUVWXYZ [] ^: _abcdefghijklmnopqrstuvwxyz{|}~

এটি প্রোগ্রামের অংশ হতে পারে না তার কারণ টিআই-বেসিকের দুটি অক্ষর স্বয়ংক্রিয়ভাবে একটি স্ট্রিংয়ে যোগ করা যায় না। একটি STO->তীর, তবে এটি কোনও সমস্যা নয় কারণ এটি ASCII এর অংশ নয়। অন্যটি স্ট্রিং আক্ষরিক ( "), যা কেবল কোনও Y=সমীকরণ টাইপ করে এবং ব্যবহার করে স্ট্রিংফাই করা যেতে পারে Equ>String(


আমি গুরুত্ব সহকারে ভাবছিলাম যে এর জন্য যদি কেউ তাদের পুরানো ক্যালকুলেটরগুলি আবদ্ধ করে। আমার যখন মনে হয়েছে তখন আমার পুরানো টিআই -৩ 83 মনে ছিল।
ম্যাজিক অক্টোপাস উরান

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

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

মন্তব্যের জন্য ধন্যবাদ, @ পেট্রিকরোবার্টস। সেগুলি 0xBB দিয়ে শুরু হওয়া দ্বি-বাইট টোকেন। টিবাসিকদেব.উইকিডোট
tokens

6

আর, 46 45 বাইট

x=1:nchar(y<-scan(,""));lm(utf8ToInt(y)~x)$co

স্টিডিনের কাছ থেকে এবং প্রদত্ত পরীক্ষার কেস রিটার্নের জন্য ইনপুট পড়ে (এক-সূচকযুক্ত):

(Intercept)           x 
99.25161290  0.01451613 

সামান্য খাটো (তবে অরক্ষিত, সম্ভবত সূত্রটি বিশ্লেষণে কিছু মূল্যায়নের সমস্যা):lm(utf8ToInt(y<-scan(,""))~1:nchar(y))$co
rturnbull

@ আর্টারনবুল আমি প্রথমে এটি চেষ্টা করেছিলাম তবে মনে হয় xভেরিয়েবলটি কাজ করার জন্য পূর্বনির্ধারিত হতে হবে lm
বিলিওব

@ আর্টারনবুল আমি একটি পরিবর্তনশীল দৈর্ঘ্য পেতে পৃথক ত্রুটি পেতে। আমাদের দেওয়া হয় sতাই x=1:nchar(s);lm(charToRaw(s)~x)$coকিছু বাইট সংরক্ষণ করে। $coপ্রযুক্তিগতভাবে প্রয়োজনীয় কিনা তাও আমি জানি না , যেহেতু আপনি এখনও এটি ছাড়াই ইন্টারসেপ্ট + সহগ পেয়েছেন
ক্রিস

@ ক্রিস সম্পূর্ণরূপে নিশ্চিত যে এটি একটি কার্যকর উত্তর নয়। স্টিডিন থেকে বা কোনও ফাংশন আর্গুমেন্ট হিসাবে কিছু ইনপুট থাকা উচিত।
বিলিওব

যথেষ্ট উপযুক্ত, কেবল আমার প্রশ্নের পড়া - এটি পাইথন + অষ্টক উত্তরগুলির সাথে আরও সুষ্ঠু তুলনা দেয়
ক্রিস

5

পাইথন, 82 80 বাইট

-২ বাইটস @ মেগোকে ধন্যবাদ

ব্যবহার scipy:

import scipy
lambda s:scipy.stats.linregress(range(len(s)),list(map(ord,s)))[:2]

নামহীন ল্যাম্বডাস অনুমোদিত, যাতে আপনি এটিকে ফেলে দিতে পারেন f=
মেগো

@ ডিজিটাল ট্রামুমার numpy.linalg.lstsqপক্ষে যুক্তিগুলির মধ্যে স্পষ্টতই আলাদা scipy.stats.linregressএবং এটি আরও জটিল।
dfernan

4

গণিত, 31 বাইট

Fit[ToCharacterCode@#,{1,x},x]&

নামহীন ফাংশন ইনপুট হিসাবে একটি স্ট্রিং গ্রহণ এবং প্রশ্নে সেরা-ফিট লাইনের প্রকৃত সমীকরণ ফিরে। উদাহরণস্বরূপ, f=Fit[ToCharacterCode@#,{1,x},x]&; f["meta.codegolf.stackexchange.com"]ফেরৎ 99.2516 + 0.0145161 x

ToCharacterCodeএকটি ASCII স্ট্রিংটিকে সংশ্লিষ্ট ASCII মানগুলির তালিকায় রূপান্তর করে; প্রকৃতপক্ষে, এটি সাধারণভাবে ইউটিএফ -8 এ ডিফল্ট হয়। (কিন্ডা দুঃখের বিষয়, এই প্রসঙ্গে, যে একটি ফাংশনের নাম কোডের দৈর্ঘ্যের 48% এর উপরে থাকে ....) এবং Fit[...,{1,x},x]লিনিয়ার রিগ্রেশন কম্পিউটিংয়ের জন্য অন্তর্নির্মিত।


1
1-ইনডেক্সড লাইনের উদাহরণের জন্য ধন্যবাদ, এটির কারণ হিসাবে আপনাকে হাহাহা করতে হবে না।
ম্যাজিক অক্টোপাস উরান

4

নোড.জেএস, 84 বাইট

ব্যবহার regression:

s=>require('regression')('linear',s.split``.map((c,i)=>[i,c.charCodeAt()])).equation

ডেমো

// polyfill, since this is clearly not Node.js
function require(module) {
  return window[module];
}
// test
["meta.codegolf.stackexchange.com"].forEach(function test(string) {
  console.log(string);
  console.log(this(string));
},
// submission
s=>require('regression')('linear',s.split``.map((c,i)=>[i,c.charCodeAt()])).equation
);
<script src="https://cdn.rawgit.com/Tom-Alexander/regression-js/master/src/regression.js"></script>


3

সেজ, 76 বাইট

var('m','c')
y(x)=m*x+c
f=lambda x:find_fit(zip(range(len(x)),map(ord,x)),y)

কোনও গল্ফিং সম্ভবত গল্ফ পাইথন উত্তর চেয়ে দীর্ঘ, কিন্তু হ্যাঁ ...



2

জাভাস্ক্রিপ্ট, 151 148 বাইট

s=>([a,b,c,d,e]=[].map.call(s,c=>c.charCodeAt()).reduce(([a,b,c,d,e],y,x)=>[a+1,b+x,c+x*x,d+y,e+x*y],[0,0,0,0,0]),[k=(e*a-b*d)/(c*a-b*b),(d-k*b)/a])

আরও পঠনযোগ্য:


আপনি বাইট 0থেকে অপসারণ করে c.charCodeAt(0)এবং আরও 2 টি বাইট k=...কমা গোষ্ঠীটি সরানো এবং এটিকে সরাসরি ফেরত অ্যারের প্রথম সূচীতে রেখে যেমন সংরক্ষণ করতে পারেন[k=...,(d-k*b)/a]
প্যাট্রিক রবার্টস

2

জাভাস্ক্রিপ্ট (ES6), 112 বাইট

s=>[m=(a=b=c=d=0,([...s].map((u,x)=>{a+=n=x,b+=y=u.charCodeAt(),c+=x*x,d+=x*y}),++n)*d-a*b)/(n*c-a*a),b/n-m*a/n]

F=s=>[m=(a=b=c=d=0,([...s].map((u,x)=>{a+=n=x,b+=y=u.charCodeAt(),c+=x*x,d+=x*y}),++n)*d-a*b)/(n*c-a*a),b/n-m*a/n]

const update = () => {
  console.clear();
  console.log(F(input.value));
};
input.oninput = update;
update();
#input {
  width: 100%;
  box-sizing: border-box;
}
<input id="input" type="text" value="meta.codegolf.stackexchange.com" length=99/>
<div id="output"></div>


2

হাস্কেল, 154 142 বাইট

import Statistics.LinearRegression
import Data.Vector
g x=linearRegression(generate(Prelude.length x)i)$i.fromEnum<$>fromList x
i=fromIntegral

আমদানি এবং দীর্ঘ ফাংশন নামগুলির কারণে এটি আমার পছন্দগুলির পক্ষে অনেক দীর্ঘ, তবে ভাল। গল্ফিংয়ের আমদানির ক্ষেত্রের বিষয়ে আমি বিশেষজ্ঞ না হলেও আমি গল্ফিংয়ের বাকি কোনও উপায়ের কথা ভাবতে পারি নি।

প্রতিস্থাপন করে 12 বাইট ছিটিয়ে এবং নিম থেকে ধন্যবাদ এনাম দ্বারা ordআমদানি করা Data.Char


1
আপনি এর ordসাথে প্রতিস্থাপন করতে পারেন fromEnumএবং এ থেকে মুক্তি পেতে পারেন import Data.Char
নিমি

1

এস এ এস ম্যাক্রো ল্যাঙ্গুয়েজ, 180 বাইট

1-ভিত্তিক সূচক ব্যবহার করে। সমাধানটি আউটপুট কেবল opeাল এবং আটকানো হয় তখন বেশ শব্দযুক্ত হয়ে উঠবে।

%macro t(a);data w;%do i=1 %to %length(&a);x=&i;y=%sysfunc(rank(%substr(&a,&i,1)));output;%end;run;proc reg outtest=m;model y=x/noprint;run;proc print data=m;var x intercept;%mend;

1

ক্লোজার, 160 বাইট

কোনও বিল্ট-ইনগুলি, পারসেপ্ট্রন নিবন্ধে বর্ণিত পুনরাবৃত্ত অ্যালগরিদম ব্যবহার করে না । অন্যান্য ইনপুটগুলিতে একত্রিত নাও হতে পারে, সেক্ষেত্রে শিক্ষার হার 2e-4হ্রাস করুন এবং পুনরাবৃত্তির সংখ্যা বাড়িয়ে তুলতে পারেন 1e5। নিশ্চিত নয় যে অ-পুনরাবৃত্ত অ্যালগরিদমটি প্রয়োগ করতে আরও কম হত।

#(nth(iterate(fn[p](let[A apply e(for[x(range(count %))](-(int(get % x))(*(p 1)x)(p 0)))](mapv(fn[p e](+(* e 2e-4)p))p[(A + e)(A +(map *(range)e))])))[0 0])1e5)

উদাহরণ:

(def f #( ... ))
(f "meta.codegolf.stackexchange.com")

[99.26612903225386 0.014516129032464659]

1

ম্যাপেল, 65 বাইট

Statistics:-LinearFit(b*x+a,[$(1..length(s))],convert(s,bytes),x)

ব্যবহার:

s := "meta.codegolf.stackexchange.com";
Statistics:-LinearFit(b*x+a,[$(1..length(s))],convert(s,bytes),x);

রিটার্নস:

99.2516129032259+0.0145161290322573*x

দ্রষ্টব্য: এটি ফ্যাটটির একটি বহিরাগত ডেটায় * x + b ফিট করার জন্য ফিট কমান্ডটি ব্যবহার করে । স্ট্রিংয়ের জন্য ASCII মানগুলি বাইটে রূপান্তর করে পাওয়া যায় ।

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