एक स्ट्रिंग पर रैखिक प्रतिगमन


25

यह चुनौती थोड़ी मुश्किल है, बल्कि सरल है, एक स्ट्रिंग दी गई है s:

meta.codegolf.stackexchange.com

एक xसमन्वय के रूप में स्ट्रिंग में वर्ण की स्थिति और एक समन्वय के रूप में एससीआई मूल्य का उपयोग करें 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

इसके बाद, आपको उस रेखा के ढलान और y- अवरोधन दोनों की गणना करनी चाहिए, जिसे आपने रैखिक प्रतिगमन का उपयोग करके प्राप्त किया है , यहाँ प्लॉट के ऊपर सेट है:

भूखंड

जिसके परिणामस्वरूप (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
ढलान और y- अवरोधन की गणना करने के लिए क्या आपके पास कोई लिंक / सूत्र है?
रॉड

16
प्रिय अस्पष्ट मतदाता: जबकि मैं सहमत हूं कि सूत्र का होना अच्छा है, यह आवश्यक नहीं है। रैखिक प्रतिगमन गणितीय दुनिया में एक अच्छी तरह से परिभाषित चीज है, और ओपी पाठक के लिए समीकरण ढूंढना छोड़ सकता है।
नाथन मेरिल 18


2
क्या सबसे फिट लाइन के वास्तविक समीकरण को वापस करना ठीक है, जैसे कि 0.014516129032258x + 99.266129032258?
ग्रेग मार्टिन

2
इस चुनौती के शीर्षक ने इस अद्भुत गीत को शेष दिन के लिए मेरे सिर पर रख दिया है
लुइस मेंडो

जवाबों:


2

MATL , 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

पैरामीटर अवरोधन और ढलान खोजने के लिए हम निम्नलिखित समीकरण बना सकते हैं:

s = [intercept slope] * [1 X]

इसलिए

[intercept slope] = s/[1 x]

!!sस्ट्रिंग के समान लंबाई वाले लोगों के वेक्टर को एक स्ट्रिंग में परिवर्तित करता है।
लोगों के वेक्टर का उपयोग अवरोधन के अनुमान के लिए किया जाता है।
1:nnz(s)के रूप में प्रयुक्त स्ट्रिंग के तत्वों की संख्या से मानों की सीमा है 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

Ols का पहला तर्क 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)

अन्य उदाहरण की तरह, यह एक्स के संदर्भ में, सबसे अच्छी फिट लाइन के समीकरण को आउटपुट करता है। इसके अलावा, Str2 में आपको इस स्ट्रिंग की आवश्यकता है, जो TI-Basic में 141 बाइट्स है:

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

इसका कारण यह कार्यक्रम का हिस्सा नहीं हो सकता है क्योंकि TI-Basic में दो वर्णों को स्वचालित रूप से एक स्ट्रिंग में नहीं जोड़ा जा सकता है। एक STO->तीर है, लेकिन यह एक समस्या नहीं है क्योंकि यह एएससीआईआई का हिस्सा नहीं है। अन्य स्ट्रिंग शाब्दिक ( ") है, जिसे केवल Y=समीकरण में टाइप करके और उपयोग करके कड़ा किया जा सकता है Equ>String(


मैं गंभीरता से सोच रहा था कि क्या कोई इस के लिए अपने पुराने कैलकुलेटर का भंडाफोड़ करेगा :)। जब मैंने यह सोचा था तो मेरे मन में टीआई -83 था।
मैजिक ऑक्टोपस Urn

@carusocomputing अरे, अच्छा! मुझे TI-Basic प्रोग्रामिंग लैंग्वेज बहुत पसंद है और मैं इसे अपने कई कोड गोल्फ के लिए उपयोग करता हूं। अगर केवल इसने ASCII का समर्थन किया ...
टिमटेक

दो टिप्पणियाँ: 1, आप "इसे एक कार्यक्रम में उपयोगकर्ता इनपुट के रूप में भी इसके लिए संकेत देकर कठोर कर सकते हैं , जो यहां आपकी मदद नहीं करता है, लेकिन मैं सिर्फ उस तथ्य को इंगित करना चाहता था। 2, मैं कैलकुलेटर पर मौजूद उन पात्रों में से कुछ को नहीं पहचानता। मैं गलत हो सकता हूं, लेकिन उदाहरण के लिए, आप कहां से @और ~क्या प्राप्त करते हैं ? साथ ही #, $है, और &
पैट्रिक रॉबर्ट्स

टिप्पणी के लिए धन्यवाद, @PatrickRoberts। वे दो-बाइट टोकन हैं जो 0xBB से शुरू होते हैं। Tibasicdev.wikidot.com/misc विविध-tokens के
23

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को काम करने के लिए पूर्व-परिभाषित किया जाना है।
बिलीवोब

@rturnbull मुझे एक वैरिएबल लंबाई मिलती है जो उस पर अलग त्रुटि है। हमें दिया जाता है sइसलिए x=1:nchar(s);lm(charToRaw(s)~x)$coकुछ बाइट्स बचाता है। मैं यह भी नहीं जानता कि क्या $coतकनीकी रूप से आवश्यक है, क्योंकि आप अभी भी इसके बिना इंटरसेप्ट + गुणांक प्राप्त करते हैं
क्रिस

@ क्रिस यकीन है कि एक व्यवहार्य जवाब नहीं है। स्टड से या फ़ंक्शन तर्क के रूप में कुछ इनपुट होना चाहिए।
बिलीवोब

काफी हद तक, सवाल का सिर्फ मेरा पढ़ना - यह अजगर + सप्तक के जवाब की तुलना में अधिक उचित देता है
क्रिस

5

पायथन, 82 80 बाइट्स

-2 बाइट्स @Mego को धन्यवाद

का उपयोग कर scipy:

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

Lambdas की अनुमति है, तो आप छोड़ सकते हैं f=
मेघो

@DigitalTrauma numpy.linalg.lstsqस्पष्ट रूप से तर्कों में भिन्न है scipy.stats.linregressऔर अधिक जटिल है।
२१

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 स्ट्रिंग धर्मान्तरित; वास्तव में, यह UTF-8 के लिए अधिक सामान्य रूप से डिफॉल्ट करता है। (किंडा दुखी, इस संदर्भ में, कि एक फ़ंक्शन नाम में कोड लंबाई का 48% से अधिक शामिल है ....) और Fit[...,{1,x},x]रेखीय प्रतिगमन कंप्यूटिंग के लिए अंतर्निहित है।


1
1-अनुक्रमित लाइन के उदाहरण के लिए धन्यवाद, आपको इसकी वजह से गणना नहीं करनी है।
मैजिक ऑक्टोपस Urn

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

जावास्क्रिप्ट (ईएस 6), 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.Charnimi को fromEnum धन्यवाद द्वारा।


1
आप बदल सकते हैं ordके साथ fromEnumऔर से छुटकारा पाने के import Data.Char
नीम

1

एसएएस मैक्रो भाषा, 180 बाइट्स

1-आधारित अनुक्रमण का उपयोग करता है। जब समाधान केवल ढलान और अवरोधन होता है तो समाधान बहुत सुंदर हो जाता है।

%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 बाइट्स

कोई बिल्ट-इन नहीं, Perceptron लेख में वर्णित पुनरावृत्ति एल्गोरिथ्म का उपयोग करता है । हो सकता है कि अन्य इनपुट्स पर अभिसरण न हो, उस स्थिति में सीखने की दर कम 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 मान बाइट्स में कनवर्ट द्वारा पाए जाते हैं ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.