特征矩阵
特征矩阵是一个二维数组或矩阵,用于表示数据集中所有样本的特征信息。在机器学习中,特征矩阵是用于模型训练的数据输入,它由所有样本的特征值组成。
解释
假设你有一个数据集,描述房屋的价格与房屋的面积和房间数之间的关系。每个房屋的信息可以用两个特征来描述:面积和房间数。那么,特征矩阵就是用这些特征来表示多个房屋样本的矩阵。
特征矩阵的形式
通常,特征矩阵记作 ( X ),其结构如下:
- 行(row):每一行表示一个样本(或数据点)。
- 列(column):每一列表示一个特征(或变量)。
如果我们有 ( m ) 个样本和 ( n ) 个特征,那么特征矩阵 ( X ) 的大小为 ( m × n ) (m \times n) (m×n)。
示例
假设我们有 3 个房屋样本,每个房屋用两个特征描述:
- 房屋 1:面积为 120 平方米,房间数为 3
- 房屋 2:面积为 150 平方米,房间数为 4
- 房屋 3:面积为 80 平方米,房间数为 2
特征矩阵 ( X ) 可以表示为:
X
=
[
120
3
150
4
80
2
]
X = \begin{bmatrix} 120 & 3 \\ 150 & 4 \\ 80 & 2 \end{bmatrix}
X=
12015080342
扩展:添加截距项
在某些线性回归模型中,我们可能会为特征矩阵添加一列全为 1 的数值,以表示截距项(bias)。这样可以用一个参数
θ
0
\theta_0
θ0来表示模型的截距。例如,上面的特征矩阵添加一列全为 1 的数值后变成:
X
=
[
1
120
3
1
150
4
1
80
2
]
X = \begin{bmatrix} 1 & 120 & 3 \\ 1 & 150 & 4 \\ 1 & 80 & 2 \end{bmatrix}
X=
11112015080342
总结
- 特征矩阵包含了所有样本的所有特征信息,是模型输入数据的核心部分。
- 每一行表示一个样本,每一列表示一个特征。
- 它用于描述数据,并为机器学习模型提供结构化的数据格式。
截距项(也叫 偏置项 或 bias)是线性模型中的一个常数项,用于调整模型的输出,使模型能够更好地拟合数据。
截距项
截距项的作用
在一个简单的线性回归模型中,模型的公式通常写作:
y
=
θ
0
+
θ
1
x
y = \theta_0 + \theta_1 x
y=θ0+θ1x
- y y y 是预测的输出。
- x x x 是输入特征。
- θ 1 \theta_1 θ1 是特征的权重或系数,表示特征 x 对 y 的影响。
- θ 0 \theta_0 θ0 是 截距项(bias),它表示当 x = 0时y 的预测值。
图形上的解释
从几何的角度来看,截距项是指直线与 ( y )-轴的交点。它决定了当输入特征值为零时,模型的输出是多少。通过调整截距项,模型可以更准确地拟合数据。例如:
- 如果没有截距项(即 θ 0 = 0 \theta_0 = 0 θ0=0),直线必须通过原点(0, 0),这可能会导致模型无法很好地描述数据关系。
- 加入截距项后,直线可以上移或下移,提供更好的拟合。
例子
- 如果你有一个线性模型 ( y = 3x + 5 ),其中 5 就是截距项。这表示当 ( x = 0 ) 时, ( y ) 的值是 5。
- 在实际数据中,很多关系并不直接通过原点,因此截距项在调整模型中非常重要。
为什么需要截距项?
截距项的存在可以帮助模型更灵活地拟合数据。没有截距项时,模型的预测会强制通过原点,可能导致较大的预测误差。通过引入截距项,模型可以更自由地调整,适应数据的整体趋势。
多特征的情形
在多元线性回归中,模型可以写作:
y
=
θ
0
+
θ
1
x
1
+
θ
2
x
2
+
…
+
θ
n
x
n
y = \theta_0 + \theta_1 x_1 + \theta_2 x_2 + \ldots + \theta_n x_n
y=θ0+θ1x1+θ2x2+…+θnxn
- θ 0 \theta_0 θ0 仍然是截距项,用来调整整体的预测值水平。
- θ 1 , θ 2 , … , θ n \theta_1, \theta_2, \ldots, \theta_n θ1,θ2,…,θn 是对应每个特征的系数。
总结
- 截距项(bias)帮助模型调整输出,使其更好地拟合数据。
- 它允许模型在输入特征为零时,仍然可以预测非零的输出值。
- 在许多机器学习模型中,截距项是一个重要的参数,用来优化模型性能。
computeCost
这个 computeCost
函数用于计算线性回归中的代价函数(Cost Function),其目的是衡量预测值与实际值之间的差距。
参数说明
X
: 输入特征矩阵,大小为(m, n)
,其中m
是样本数,n
是特征数。X
通常包含所有样本的特征,可能还包括一列全是 1 的常数列,用于表示截距项(bias)。y
: 真实的输出(目标值)向量,大小为(m, 1)
,表示每个样本对应的实际值。theta
: 参数向量,大小为(1, n)
,表示线性回归模型的参数(权重和截距项)。
解释代码
def computeCost(X, y, theta):
# 计算预测值与实际值之间的误差
inner = np.power(((X * theta.T) - y), 2) # 计算误差的平方
# 计算代价函数
return np.sum(inner) / (2 * len(X)) # 取误差平方和的一半,并除以样本数
具体解释
X * theta.T
: 计算预测值。X
是特征矩阵,theta.T
是参数向量的转置(如果theta
是(1, n)
,它的转置会变成(n, 1)
),所以X * theta.T
得到一个大小为(m, 1)
的预测值向量。(X * theta.T) - y
: 计算预测值与实际值之间的误差,大小仍然是(m, 1)
。np.power(..., 2)
: 将每个误差的平方计算出来,得到误差平方向量。np.sum(inner)
: 计算所有误差平方的总和。(2 * len(X))
: 计算样本数量的两倍,用于归一化误差平方和,使代价函数能够平均衡量每个样本的误差。np.sum(inner) / (2 * len(X))
: 最后返回代价函数值,它表示模型当前参数theta
下预测的误差大小。
代价函数的作用
代价函数用于评估模型预测的准确性,数值越小表示模型预测与实际值之间的差距越小,反之,代价函数值越大,模型预测效果越差。优化算法(如梯度下降)使用这个代价函数来调整 theta
,以最小化预测误差。