标签:含义 时长 att __name__ 关注 复制 购物 大小 split
目录
代码中涉及的数学公式可以自己下载 Typora 这款软件后,把内容复制到.md文件内通过 Typora 打开
本章内容
前面的章节给大家介绍了监督学习的分类部分,接下来几章将会带领同学们翱翔浩瀚的回归海洋,注意此回归不是 Logistic 回归(Logistic 回归之所以取名为这是因为历史遗留问题)。具体是什么,那就开始让我们来揭秘吧!
注意: 分类的目标变量是标称型数据;回归的目标变量是连续性数据。
# coding: 'utf-8'
import os
import numpy as np
import matplotlib.pyplot as plt
from path_settings import machine_learning_PATH
data_set_path = os.path.join(machine_learning_PATH, '第八章/data-set')
ex0_path = os.path.join(data_set_path, 'ex0.txt')
ex1_path = os.path.join(data_set_path, 'ex1.txt')
abalone_path = os.path.join(data_set_path, 'abalone.txt')
def load_data_set(filename):
# 文本第一行值全为0的解释:简单说是因为两个矩阵相乘一个矩阵的行和另一个矩阵的列得相等,具体可查资料
num_feat = len(open(filename).readline().split('\t')) - 1
data_mat = []
label_mat = []
fr = open(filename)
for line in fr.readlines():
line_arr = []
cur_line = line.strip().split('\t')
for i in range(num_feat):
line_arr.append(float(cur_line[i]))
data_mat.append(line_arr)
label_mat.append(float(cur_line[-1]))
return data_mat, label_mat
def stand_regres(x_arr, y_arr):
x_mat = np.mat(x_arr)
y_mat = np.mat(y_arr)
x_tx = x_mat.T * x_mat
# 判断矩阵是否为奇异矩阵,即矩阵是否有逆矩阵
if np.linalg.det(x_tx) == 0:
print("奇异矩阵没有逆矩阵")
return
ws = x_tx.I * (x_mat.T * y_mat.T)
# 求解未知矩阵
# ws = np.linalg.solve(x_tx,x_mat.T*y_mat.T)
return x_mat, y_mat, ws
def test_stand_regres():
x_arr, y_arr = load_data_set(ex0_path)
_, _, ws = stand_regres(x_arr, y_arr)
print(ws)
if __name__ == '__main__':
test_stand_regres()
def plot_stand_regres(x_mat, y_mat, ws):
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(x_mat[:, 1].flatten().A[0], y_mat.T[:, 0].flatten().A[0])
x_copy = x_mat.copy()
x_copy.sort(0)
y_hat = x_copy * ws
ax.plot(x_copy[:, 1], y_hat)
plt.show()
def test_plot_stand_regres():
x_arr, y_arr = load_data_set(ex0_path)
x_mat, y_mat, ws = stand_regres(x_arr, y_arr)
plot_stand_regres(x_mat, y_mat, ws)
# 判断拟合效果
print(np.corrcoef((x_mat * ws).T, y_mat))
'''
[[1. 0.98647356]
[0.98647356 1. ]]
'''
if __name__ == '__main__':
# test_stand_regres()
test_plot_stand_regres()
局部加权线性回归求回归系数公式:$\hat{w}=(X^TWX)^{-1}X^TWy$
点 x 与 x(i)越近,w(i,i)将会越大,参数 k 决定了对附近的点赋予多大的权重。
def lwlr(test_point, x_arr, y_arr, k=1):
"""给样本点增加权重,参数 k 控制衰减的速度"""
x_mat = np.mat(x_arr)
y_mat = np.mat(y_arr)
m = np.shape(x_mat)[0]
# 创建对角权重矩阵。该矩阵对角线元素全为1,其余元素全为0
weights = np.mat(np.eye(m))
for j in range(m):
diff_mat = test_point - x_mat[j, :]
weights[j, j] = np.exp(diff_mat * diff_mat.T / (-2 * k ** 2))
x_tx = x_mat.T * (weights * x_mat)
if np.linalg.det(x_tx) == 0:
print("奇异矩阵没有逆矩阵")
return
ws = x_tx.I * (x_mat.T * (weights * y_mat.T))
return test_point * ws
def lwlr_test(test_arr, x_arr, y_arr, k=1):
"""使数据集中每个点调用 lwlr 方法"""
m = np.shape(test_arr)[0]
y_hat = np.zeros(m)
for i in range(m):
y_hat[i] = lwlr(test_arr[i], x_arr, y_arr, k)
return y_hat
def test_lwlr_test():
x_arr, y_arr = load_data_set(ex0_path)
y_hat = lwlr_test(x_arr, x_arr, y_arr, 0.003)
print(y_hat)
def plot_lwlr(x_sort, y_hat, str_ind, x_mat, y_mat):
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x_sort[:, 1], y_hat[str_ind])
ax.scatter(x_mat[:, 1].flatten().A[0], y_mat.T[:, 0].flatten().A[0], s=2, c='red')
plt.show()
def test_plot_lwlr():
x_arr, y_arr = load_data_set(ex0_path)
x_mat = np.mat(x_arr)
y_mat = np.mat(y_arr)
y_hat = lwlr_test(x_arr, x_arr, y_arr, 0.01)
str_ind = x_mat[:, 1].argsort(0)
x_sort = x_mat[str_ind][:, 0, :]
plot_lwlr(x_sort, y_hat, str_ind, x_mat, y_mat)
if __name__ == '__main__':
# test_stand_regres()
# test_plot_stand_regres()
# test_lwlr_test()
test_plot_lwlr()
==尊重原创==
==可以伸出你的小手点个关注,谢谢!==
博客园地址:https://www.cnblogs.com/chenyoude/
github 地址:https://github.com/nickcyd/machine_learning
微信:a1171958281
标签:含义 时长 att __name__ 关注 复制 购物 大小 split
原文地址:https://www.cnblogs.com/chenyoude/p/10228386.html