机器学习(二)之监督学习

前言: 

上一节大概讲解了几种学习方式,下面几张就具体来讲讲监督学习的几种算法。

以下示例中\beta\omega都是权重的意思!!!

注:本文如有错误之处,还请读者指出,欢迎评论区探讨!

1.回归

1.1 线性模型(Linear Models)

1.1.1 普通最小二乘法(Ordinary Least Squares)

概念:

残差平和和最小

推导:

由于懒得打公式,我们直接引用别人的(图片来源

(1)先给出一个线性方程组

(2)改写成矩阵形式

(3)转化为一般形式

一般这个解都无精确解,只有最佳近似解,即超定方程。

(4)求偏导求\displaystyle \beta(一般来说,这个不需要我们手动求,调包就可以了,嘿嘿,调包侠)

 (5)最小二乘公式

\xi =min\left \| x\beta -y \right \|_{2}^{2}

 因为是超定方程,有许多近似解,但是残差平方和最小的通常只有一个,我们就规定这个就是最优近似解。

示例:
import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets, linear_model
from sklearn.metrics import mean_squared_error, r2_score

# diabetas_X有442条样本,10个属性
diabetas_X, diabetas_Y = datasets.load_diabetes(return_X_y=True)
# 重新选取数据集,选取全部样本和前两个属性,并增加一维
diabetas_X = diabetas_X[:, np.newaxis, 2]
# 创建训练集和测试集
diabetas_X_train = diabetas_X[:-20]
diabetas_X_test = diabetas_X[-20:]
# 创建训练标签和真实的测试标签
diabetas_Y_train = diabetas_Y[:-20]
diabetas_Y_test = diabetas_Y[-20:]
# 使用线性回归的方法进行预测
regr = linear_model.LinearRegression()
# 拟合数据
regr.fit(diabetas_X_train, diabetas_Y_train)
# 预测测试集
diabetas_Y_pred = regr.predict(diabetas_X_test)
print("Coefficients:\n", regr.coef_)  # 回归系数
print("Mean square error:%.2f" % mean_squared_error(diabetas_Y_test, diabetas_Y_pred))  # 平均平方误差
print("Coefficient of determination : %.2f" % r2_score(diabetas_Y_test, diabetas_Y_pred))  # 决定系数

plt.scatter(diabetas_X_test, diabetas_Y_test, color="black")  # 点
plt.plot(diabetas_X_test, diabetas_Y_pred, color="red", linewidth=3)  # 线
# 不显示x和y轴
plt.xticks(())
plt.yticks(())
plt.show()

 结果:

Coefficients:
 [938.23786125]
Mean square error:2548.07
Coefficient of determination : 0.47

拓展:

(1)非负最小二乘法(Non-Negative Least Squares):可将所有的系数约束为非负数,在现实中应用很多,如商品价格

(2)普通最小二乘复杂度(Ordinary Least Squares Complexity):

1.1.2 岭回归和岭分类(Ridge regression and classification)

该方法是普通最小二乘的一个变体。

岭分类的本质是将分类问题转化为回归问题,然后调用岭回归去解决。在此我们只讨论岭回归。

引入:

在使用线性模型拟合回归函数时,最终目的是想要求出\omega的值,即最优近似解,更加直观的看到每个参数的权重大小,即重要性大小(权重大的,更重要),之后能够根据权重进行预测。

但是,当我们的参数多重共线的时候(即参数之间能够相互表示)的时候,那y的值就很难根据不同的参数设计不同 的权重了。

不好理解是不是,上图!(图源

这张图很清楚,举得也是一个极端的例子,这两个参数之前存在着精确的相关关系,即x_{1}=2x_{2},导致有多种\omega满足这个式子。一般来说,参数不会有这么精确地相关性,但是也足够迷惑了。

 这个方法的目的是想把方差较小的参数投影到方差大的维度上,减少线性相关性,更好的拟合函数,进行预测。

概念:

在最小二乘的基础上加了一个惩罚项。

这个\alpha为惩罚项的系数,认为控制,范围为\alpha \geqslant 0

推导:

这推导过程使用了大量的线性代数,有奇异值分解,PCA等。

先用语言来描述一下,这个过程。我们先求出这个线性模型的特征值和特征向量,然后进行奇异值分解(求出对角矩阵,这个对角矩阵就是我们的构成\alpha的重要部分)和特征值分解(主成分分析PCA),找出主成分方向的第一主成分,进行投影,再垂直于第一主成分的面上找方差最大的第二主成分,进行投影,一直重复,直到n维结束。然后预测值就会根据\alpha值和新的坐标来重新预测

语言描述模糊?不理解?下面来图解(图片引用,这个博主还有详细的公式注解讲的非常棒):

这样就实现了岭回归的功能。

示例:
import numpy as np
import matplotlib.pyplot as plt
from sklearn import linear_model

# 创建一个 Ridge 回归模型
reg = linear_model.Ridge(alpha=0.5)

# 训练数据
X_train = np.array([[0, 0], [0, 0], [1, 1]])
y_train = np.array([0, 0.1, 1])

# 拟合模型
reg.fit(X_train, y_train)

# 获取回归系数和截距
coef = reg.coef_
intercept = reg.intercept_

# 绘制数据点
plt.scatter(X_train[:, 0], y_train, color='blue', label='Data Points')

# 绘制模型拟合的直线
x_line = np.linspace(0, 1, 100)
y_line = coef[0] * x_line + coef[1] * x_line + intercept
plt.plot(x_line, y_line, color='red', linewidth=2, label='Regression Line')

# 添加标签和图例
plt.xlabel('Feature 1')
plt.ylabel('Target')
plt.title('Linear Regression with Ridge Regularization')
plt.legend()

# 显示图形
plt.show()

 这是岭回归的结果(鲁棒性较好),比下面普通最小二乘(有点过于拟合了)的效果要好。

拓展:

\alpha越大(越靠左),惩罚越大,权重越趋近于0。

 复杂度和普通最小二乘一样。

相关推荐

  1. 机器学习-监督学习

    2024-04-21 18:48:04       27 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-21 18:48:04       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-21 18:48:04       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-21 18:48:04       87 阅读
  4. Python语言-面向对象

    2024-04-21 18:48:04       96 阅读

热门阅读

  1. 【linux】centos7 开机 进单用户模式修改root密码

    2024-04-21 18:48:04       33 阅读
  2. r-tree 总结

    2024-04-21 18:48:04       41 阅读
  3. R语言数据分析案例

    2024-04-21 18:48:04       45 阅读
  4. 第3章 决策树

    2024-04-21 18:48:04       33 阅读
  5. PHP数电票查验、发票OCR查验接口、发票管理

    2024-04-21 18:48:04       42 阅读
  6. 洛谷 P3702 [SDOI2017] 序列计数 题解代码 动态规划

    2024-04-21 18:48:04       41 阅读
  7. QT Sqlite 内存模式 简单读写

    2024-04-21 18:48:04       36 阅读
  8. pdf在线免费转word网站推荐,纯免费、不注册

    2024-04-21 18:48:04       39 阅读
  9. c++计算DNA序列信息熵代码

    2024-04-21 18:48:04       34 阅读
  10. MYSQL 二、SQL语句总结

    2024-04-21 18:48:04       36 阅读
  11. 【Redis(1)】Redis数据类型及使用场景

    2024-04-21 18:48:04       37 阅读
  12. Python语言零基础入门——循环

    2024-04-21 18:48:04       38 阅读