matlab中的最小二乘线性分类器
Posted
技术标签:
【中文标题】matlab中的最小二乘线性分类器【英文标题】:Least squares linear classifier in matlab 【发布时间】:2014-04-24 20:12:19 【问题描述】:我很难理解如何在 matlab 中为我的数据实现最小二乘线性分类器。我的数据有 N 行,每行 10 列宽。每行代表一个具有 10 个特征的数据点。只有两个类,我的测试数据的前 N/2 行是 1 类,其余的是 2 类。
所有关于最小二乘法的在线解释都是有道理的,但我无法将它们适应我的数据,我只需要一些与我的数据和最小二乘法相关的概念解释。
【问题讨论】:
或许你可以把这看作一个非线性优化问题,其中x是数据点,beta是线性系数,f(beta * x)是分类结果。当然,f() 是将 beta * x 映射到 0/1 或 -1/1 的非线性函数。错误将是 Y - f(beta, x),其中 Y 是真实标签。那么就可以使用 MATLAB 函数 lsqnonlin() 来解决这个问题。 【参考方案1】:使用最小二乘法进行线性分类
使用最小二乘法创建线性分类器的思想是定义一个线性函数
f(x) = w<sup>T</sup>x
并调整w
,使f(x)
接近1
为您的一类数据点和接近-1
另一类。 w
的调整是通过最小化每个数据点 f(x)
与 1
或 -1
之间的平方距离来完成的,具体取决于其类别。
二维 Matlab 示例
% Create a two-cluster data set with 100 points in each cluster
N = 100;
X1 = 0.3*bsxfun(@plus, randn(N, 2), [6 6]);
X2 = 0.6*bsxfun(@plus, randn(N, 2), [-2 -1]);
% Create a 200 by 3 data matrix similar to the one you have
% (see note below why 200 by 3 and not 200 by 2)
X = [[X1; X2] ones(2*N, 1)];
% Create 200 by 1 vector containing 1 for each point in the first cluster
% and -1 for each point in the second cluster
b = [ones(N, 1); -ones(N, 1)]
% Solve least squares problem
z = lsqlin(X, b);
% Plot data points and linear separator found above
y = -z(3)/z(2) - (z(1)/z(2))*x;
hold on;
plot(X(:, 1), X(:, 2), 'bx'); xlim([-3 3]); ylim([-3 3]);
plot(x, y, 'r');
注意数据矩阵中的额外列
我在数据矩阵中添加了额外的一列 为了允许分隔符的移动,从而使它有点 更通用。如果你不这样做,你强制分隔符通过 通过起源,这往往会导致更糟 分类结果。
【讨论】:
这是一个很好的解释!谢谢。 您能否解释一种方法来评估线性最小二乘分类器,并获得系数?我正在尝试解决二进制分类问题,当在测试数据上运行时,我得到的标签是真实值。如何将它们分类到我的二进制类?大多数结果标签都是正面的。谢谢。 @ggauravr 你用w^T x
的符号对一个测试点x
进行分类,即如果w^T x > 0
该点在第一类,否则如果w^T x < 0
在第二类.
谢谢,想通了。你的回答很有帮助。
@3lectrologos,额外的列对找到的线性分隔符有何影响?当我将额外的列值设置为 0 而不是 1 时,我得到了更好的解决方案。当额外列值的一半是 -1 而另一个是 0 时更是如此。以上是关于matlab中的最小二乘线性分类器的主要内容,如果未能解决你的问题,请参考以下文章