<jupyter_start><jupyter_text>선형회귀- 회귀분석의 목적    - 독립변수로 종속변수를 예측하는것    - 종속변수는 수치형 데이터<jupyter_code># 샘플 데이터
datas = np.array([[1, 3], [2, 5], [3, 7]])
datas
# 그래프
plt.scatter(datas[:, 0], datas[:, 1])
plt.xticks(range(0, 5))
plt.yticks(range(0, 10))
plt.grid(True)
plt.show()<jupyter_output><empty_output><jupyter_text>방정식- 샘플 데이터를 직선 방정식으로 표현    - 일반적인 우리가 배운 수학에서는 방정식으로 해결    - $y = ax + b$         - 데이터 : [1, 3], [2, 5], [3, 7]        - 계산과정            - $3 = 1a + b$            - $5 = 2a + b$            - $(3 = 1a + b) - (5 = 2a + b) => (-2 = -1a)$ -> a = 2            - $3 = a(a=2) + b$ -> b = 1        - 추세선 : $y = 2x + 1$   선형대수- 컴퓨터는 위의 방정식을 선형대수로 계산- 코드도 선형대수로 변환해서 작성 $$\begin{bmatrix}1 & 1\\2 & 1\\\end{bmatrix}\begin{bmatrix}a\\b\\\end{bmatrix}= \begin{bmatrix}3\\5\\\end{bmatrix}$$ $$\begin{bmatrix}a\\b\\\end{bmatrix}= \begin{bmatrix}1 & 1\\2 & 1\\\end{bmatrix}^{-1}\begin{bmatrix}3\\5\\\end{bmatrix}$$ - 역행렬 $$\begin{bmatrix}a & b\\c & d\\\end{bmatrix}^{-1}=\frac{1}{ad-bc}\begin{bmatrix}d & -b\\-c & a\\\end{bmatrix}$$<jupyter_code>def inverse_matrix(a, b, c, d):
    pnum = 1 / (a * d - b * c)
    tmp_a = a
    a, d = d, tmp_a
    b, c = -b, -c
    return a * pnum, b * pnum, c * pnum, d * pnum<jupyter_output><empty_output><jupyter_text>- 역행렬 계산 $$\begin{bmatrix}a\\b\\\end{bmatrix}= -1\begin{bmatrix}1 & -1\\-2 & 1\\\end{bmatrix}\begin{bmatrix}3\\5\\\end{bmatrix}$$ $$\begin{bmatrix}a\\b\\\end{bmatrix}= \begin{bmatrix}-1 & 1\\2 & -1\\\end{bmatrix}\begin{bmatrix}3\\5\\\end{bmatrix}$$<jupyter_code># 역행렬로 회귀계수 구하는 함수
def dot(a, b, c, d, y0, y1):
    print(a, b, c, d, y0, y1)
    num1 = a * y0 + b * y1
    num2 = c * y0 + d * y1
    return num1, num2<jupyter_output><empty_output><jupyter_text>- 최종 a(기울기), b(절편)값 계산 $$ a = (-1 \times 3) + (1 \times 5) $$$$ b = (-2 \times 3) + (-1 \times 5) $$<jupyter_code>datas
# 회귀계수
m1 = (1, 1, 2, 1)
y = (3, 5)
im = inverse_matrix(*m1)
dot(*im, *y)
# 추세선 함수
def pred_func(x):
    return 2 * x + 1
# 예측값
pred_y = [pred_func(data) for data in range(0, 5)]
print(list(range(0, 5)), pred_y)
# 그래프
plt.scatter(datas[:, 0], datas[:, 1])
plt.plot(range(0, 5), pred_y, "r-")
plt.xticks(range(0, 5))
plt.yticks(range(0, 10))
plt.grid(True)
plt.show()<jupyter_output><empty_output><jupyter_text>패키지 사용<jupyter_code>x = np.reshape(datas[:, 0], (-1, 1))
y = np.reshape(datas[:, 1], (-1, 1))
from sklearn.linear_model import LinearRegression
model = LinearRegression().fit(x, y)
# 절편, 기울기
model.intercept_, model.coef_<jupyter_output><empty_output><jupyter_text>예시<jupyter_code># 2016 - 2017 프리미어 리그 데이터
df = pd.read_csv("datas/premierleague.csv")
df.head(2)
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_error
plt.scatter(df["gf"], df["points"])
plt.show()
x_train, x_test, y_train, y_test = train_test_split(df[["gf"]], df[["points"]], test_size=0.2, random_state=0)
model = LinearRegression().fit(x_train, y_train)
model.score(x_test, y_test)
pred_y = model.predict(df[["gf"]])
x = df["gf"].min(), df["gf"].max()
y = int(pred_y.min()), int(pred_y.max())
x, y
plt.scatter(df["gf"], df["points"])

plt.plot(x, y, "r-")

plt.show()
# 절편, 기울기 : 기본 11.5점, 1골 넣을때마다 0.8점씩 승점 증가
model.intercept_, model.coef_
# 득점이 80점이면 승점은 76점
goal = 80
np.round(model.predict([[goal]]))<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.219300866447565, 'fraction_numerical': 0.04093217806991335, 'mean_word_length': 3.6052269601100413, 'pattern_counts': {'":': 0, '<': 25, '<?xml version=': 0, '>': 28, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 3, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '6', 'dir': 'jupyter-structured-clean-dedup', 'id': '386526', 'license': 'MIT', 'n_tokens_mistral': 1793, 'n_tokens_neox': 1839, 'n_words': 327, 'path': 'intro/02_sample_regression.ipynb', 'repo_name': 'yeonghwanchoi/TIL', 'size': '3347'}