线性回归
定义
利用数理统计中回归分析,来确定两种或两种以上变量间相
互依赖的定量关系的一种统计分析方法。
学习过程
例子
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
# 创建一些线性数据
np.random.seed(0)
X = np.random.rand(100, 1) * 10
y = 2 + 3 * X + np.random.rand(100, 1)
# 划分数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建并训练线性回归模型
model = LinearRegression()
model.fit(X_train, y_train)
# 在测试集上进行预测
y_pred = model.predict(X_test)
# 计算并打印均方误差和R^2得分
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f'Mean Squared Error: {mse}')
print(f'R^2 Score: {r2}')
# 绘制数据集和拟合线
plt.scatter(X_test, y_test, color='gray')
plt.plot(X_test, y_pred, color='red', linewidth=2)
plt.show()
运行结果
线性二分类
定义
线性分类器则透过特征的线性组合来做出分类决定,以达到
此种目的。简言之,样本通过直线(或超平面)可分
线性分类与线性回归的差别
输出意义不同:属于某类的概率<->回归具体值
参数意义不同:最佳分类直线<->最佳拟合直线
维度不同:前面的例子中,一个是一维的回归,一个是二维的分类
例子
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
from sklearn.datasets import make_classification
# 创建模拟的二分类数据集
X, y = make_classification(n_samples=100, n_features=2, n_informative=2, n_redundant=0, random_state=42)
# 划分数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建并训练逻辑回归模型
model = LogisticRegression()
model.fit(X_train, y_train)
# 在测试集上进行预测
y_pred = model.predict(X_test)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f'Accuracy: {accuracy}')
# 绘制数据集和决策边界
def plot_decision_boundary(X, y, model):
h = .02 # step size in the mesh
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, alpha=0.4)
plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired)
# 绘制决策边界和分类点
plot_decision_boundary(X, y, model)
plt.title("Logistic Regression Decision Boundary")
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.legend(["Class 0", "Class 1"])
plt.show()
运行结果
梯度下降法
定义
梯度下降法是一个一阶最优化算法。
要使用梯度下降法找到一个函数的局部极小值,必须向函数上当前点对应梯度(或者是近似梯度)的反方向的规定步长距离点进行迭代搜索。如果相反地向梯度正方向迭代进行搜索,则会接近函数的局部极大值点;这个过程被称为梯度上升法。
梯度下降法也被称为最速下降法。它的基本思想是通过不断迭代,使目标函数的值逐步趋近于最小值。这种方法的核心是利用目标函数的梯度信息,即函数在当前点的斜率,来指导下一步的移动方向和步长。
指数回归
例子
import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
# 定义指数函数
def exponential_func(x, a, b, c):
return a * np.exp(-b * x) + c
# 创建一些示例数据
x_data = np.linspace(0, 4, 50)
y_data = 3 * np.exp(-0.5 * x_data) + 2
# 添加一些噪声
y_data += 0.2 * np.random.normal(size=len(x_data))
# 使用curve_fit进行拟合
popt, pcov = curve_fit(exponential_func, x_data, y_data)
# 绘制原始数据
plt.scatter(x_data, y_data, label='Original data')
# 绘制拟合曲线
x_fit = np.linspace(0, 4, 1000)
y_fit = exponential_func(x_fit, *popt)
plt.plot(x_fit, y_fit, 'r-', label='Fit: a=%5.3f, b=%5.3f, c=%5.3f' % tuple(popt))
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.show()
运行结果
多分类
例子
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import confusion_matrix, classification_report
import seaborn as sns
# 加载iris数据集
iris = load_iris()
X = iris.data
y = iris.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 创建随机森林分类器
clf = RandomForestClassifier(n_estimators=100, random_state=42)
# 训练模型
clf.fit(X_train, y_train)
# 预测测试集
y_pred = clf.predict(X_test)
# 计算混淆矩阵
cm = confusion_matrix(y_test, y_pred)
# 绘制混淆矩阵
plt.figure(figsize=(10, 7))
sns.heatmap(cm, annot=True, fmt=".0f", linewidths=.5, square = True, cmap = 'Blues');
plt.ylabel('Actual label');
plt.xlabel('Predicted label');
plt.title('Confusion Matrix', size = 15);
plt.show()
# 打印分类报告
print(classification_report(y_test, y_pred))
运行结果
神经元模型
分类
Spiking模型
Integrate-and-fire模型
M-P模型
单神经元模型
作用函数
非对称型 Sigmoid 函数 (Log Sigmoid)
非对称型 Sigmoid 函数,也被称为 Log Sigmoid 函数,是 Sigmoid 函数的一种变体。这是一个在 0 和 1 之间取值的函数,其形状类似于 S 曲线,因此被称为 Sigmoid 函数。当 x 趋向于正无穷时,函数值趋向于 1;当 x 趋向于负无穷时,函数值趋向于 0。非对称型 Sigmoid 函数(Log Sigmoid)是标准 Sigmoid 函数的一种变体。
对称型 Sigmoid 函数 (Tangent Sigmoid)
对称型 Sigmoid 函数是另一种 Sigmoid 函数的变体,它与标准的 Sigmoid 函数相比具有对称的特性。
对称型 Sigmoid 函数通常是为了在对称区间上获得相同的输出范围而设计的。对称型 Sigmoid 函数在某些情况下可能更有用,特别是当你需要输出在 -1 和 1 之间对称变化时。然而,和标准的 Sigmoid 函数一样,对称型 Sigmoid 函数也可能遇到梯度消失的问题,在深度学习中不是最常用的激活函数。在实践中,ReLU(Rectified Linear Unit)及其变体如 Leaky ReLU 通常更受欢迎,因为它们能够更好地解决梯度消失问题。
感知机模型
感知机与神经元模型类比
具有完全相同的形式:
多层感知机
针对问题
线性不可分问题:无法线性分类
多层感知机定理
定理1 :若隐层节点(单元)可任意设置,用三层阈值节点的网络,可以实现任意的二值逻辑函数。
定理2 :若隐层节点(单元)可任意设置,用三层S型非线性特性节点的网络,可以一致逼近紧集上的连续函数或按 范数逼近紧集上的平方可积函数。
多层前馈网络
多层感知机是一种多层前馈网络, 由多层神经网络构成,每层网络将输出传递给下一层网络。神经元间的权值连接仅出现在相邻层之间,不出现在其他位置。如果每一个神经元都连接到上一层的所有神经元
(除输入层外),则成为全连接网络。
BP神经网络
BP算法简述
已知网络的输入/输出样本,即导师信号。
BP学习算法由正向传播和反向传播组成:① 正向传播是输入信号从输入层经隐层,传
向输出层,若输出层得到了期望的输出,则学习算法结束;否则,转至反向传播。② 反向传播是将误差(样本输出与网络输出之差)按原联接通路反向计算,由梯度下降法调整各层节点的权值和阈值,使误差减小。
算法评述
优点
学习完全自主
可任意逼近非线性函数
缺点
算法非全局收敛;
收敛速度慢;
学习速率α 选择;
神经网络如何设计(几层?节点数?)