生成数据
x1 和 y1 是第一个正态分布的数据点,均值为0。
x2 和 y2 是第二个正态分布的数据点,均值为3。
这样生成的数据点在二维平面上会有明显的分离,便于观察。
创建数据框:
将 x1 和 x2 合并成一个向量 x。
将 y1 和 y2 合并成一个向量 y。
添加一个 category 列,用于区分两个数据集。
绘制散点图:
使用 plot 函数绘制散点图。
col 参数使用 ifelse 函数根据 category 列的值分配颜色:Category 1 为蓝色,Category 2 为红色。
pch = 19 表示使用实心点。
main 添加图表标题,xlab 和 ylab 添加轴标签,cex = 1.2 增大点的大小。
添加图例:
使用 legend 函数添加图例,说明不同颜色代表的类别。
输出结果
运行上述代码后,你将看到一个散点图,其中两个正态分布的数据点使用不同的颜色区分。图例会清晰地表明每种颜色对应的类别。
可视化结果
散点图将直观地展示两个正态分布的数据点在二维平面上的分布情况,不同颜色区分了两个数据集。
通过这种方式,你可以随机生成两个正态分布的数据点,并使用散点图直观地显示它们的分布情况,同时用不同颜色区分两个数据集。
# 设置随机种子
set.seed(123)
# 生成两个正态分布的数据集
n <- 100 # 每个类别的数据点数量
x1 <- rnorm(n, mean = 0, sd = 1) # 类别1的数据,均值为0
y1 <- rnorm(n, mean = 0, sd = 1) # 类别1的数据,均值为0
x2 <- rnorm(n, mean = 3, sd = 1) # 类别2的数据,均值为3
y2 <- rnorm(n, mean = 3, sd = 1) # 类别2的数据,均值为3
# 创建数据框
data <- data.frame(
x = c(x1, x2), # 合并x1和x2
y = c(y1, y2), # 合并y1和y2
category = c(rep("Category 1", n), rep("Category 2", n)) # 类别标签
)
# 绘制散点图
plot(data$x, data$y, pch = 19, col = ifelse(data$category == "Category 1", "blue", "red"),
main = "Scatter Plot of Two Normal Distributions",
xlab = "X", ylab = "Y", cex = 1.2)
# 添加图例
legend("topright", legend = c("Category 1", "Category 2"), col = c("blue", "red"), pch = 19)
最小二乘法
最小二乘法简介
最小二乘法是一种用于线性回归的参数估计方法,通过最小化残差平方和来拟合数据。核心目标是找到一组参数,使得预测值与实际观测值之间的误差平方和最小。
数学原理
假设线性模型为:
y
=
X
β
+
ϵ
y = X\beta + \epsilon
y=Xβ+ϵ
其中:
- y y y 为因变量向量
- X X X 为设计矩阵(包含自变量和截距项)
- β \beta β 为待估参数向量
- ϵ \epsilon ϵ 为误差项
最小二乘解通过求解正规方程得到:
β
^
=
(
X
T
X
)
−
1
X
T
y
\hat{\beta} = (X^T X)^{-1} X^T y
β^=(XTX)−1XTy
R语言实现示例
方法1:使用基础函数 lm()
# 生成示例数据
set.seed(123)
x <- 1:10
y <- 2 * x + rnorm(10, mean = 0, sd = 1)
# 最小二乘拟合
model <- lm(y ~ x)
summary(model) # 输出模型摘要
方法2:手动计算参数
# 构造设计矩阵(包含截距项)
X <- cbind(1, x) # 第一列为1(截距)
# 计算最小二乘解
beta_hat <- solve(t(X) %*% X) %*% t(X) %*% y
print(beta_hat) # 输出参数估计值
方法3:可视化拟合结果
# 绘制数据点和回归线
plot(x, y, main = "Least Squares Fit", pch = 16)
abline(model, col = "red") # 添加回归线
关键输出说明
lm()
函数返回的模型摘要包含系数估计、标准误差、R²等统计量。- 手动计算的
beta_hat
应与lm()
结果一致,验证计算正确性。
注意事项
- 若 X T X X^T X XTX 不可逆(如共线性存在),需使用广义逆或正则化方法。
- 残差分析可通过
plot(model)
快速检查模型假设。### 最小二乘法简介
最小二乘法是一种用于线性回归的参数估计方法,通过最小化残差平方和来拟合数据。核心目标是找到一组参数,使得预测值与实际观测值之间的误差平方和最小。
数学原理
假设线性模型为:
y
=
X
β
+
ϵ
y = X\beta + \epsilon
y=Xβ+ϵ
其中:
- y y y 为因变量向量
- X X X 为设计矩阵(包含自变量和截距项)
- β \beta β 为待估参数向量
- ϵ \epsilon ϵ 为误差项
最小二乘解通过求解正规方程得到:
β
^
=
(
X
T
X
)
−
1
X
T
y
\hat{\beta} = (X^T X)^{-1} X^T y
β^=(XTX)−1XTy
R语言实现示例
方法1:使用基础函数 lm()
# 生成示例数据
set.seed(123)
x <- 1:10
y <- 2 * x + rnorm(10, mean = 0, sd = 1)
# 最小二乘拟合
model <- lm(y ~ x)
summary(model) # 输出模型摘要
方法2:手动计算参数
# 构造设计矩阵(包含截距项)
X <- cbind(1, x) # 第一列为1(截距)
# 计算最小二乘解
beta_hat <- solve(t(X) %*% X) %*% t(X) %*% y
print(beta_hat) # 输出参数估计值
方法3:可视化拟合结果
# 绘制数据点和回归线
plot(x, y, main = "Least Squares Fit", pch = 16)
abline(model, col = "red") # 添加回归线
关键输出说明
lm()
函数返回的模型摘要包含系数估计、标准误差、R²等统计量。- 手动计算的
beta_hat
应与lm()
结果一致,验证计算正确性。
注意事项
- 若 X T X X^T X XTX 不可逆(如共线性存在),需使用广义逆或正则化方法。
- 残差分析可通过
plot(model)
快速检查模型假设。
本文介绍了使用R语言实现最小二乘法线性回归的两种方法。方法一直接调用lm()函数进行拟合,可输出包含系数、标准误差等统计量的模型摘要。方法二手动构建设计矩阵并求解正规方程,计算结果与lm()一致,验证了最小二乘法的数学原理。文章还展示了绘制原始数据点和回归线的可视化方法,并提示了可能存在的矩阵不可逆问题及解决方案。通过对比自动和手动实现方式,帮助读者深入理解最小二乘法的计算过程及其R语言实现。
完整程序代码:
# 设置随机种子
set.seed(123)
# 生成两个正态分布的数据集
n <- 100 # 每个类别的数据点数量
x1 <- rnorm(n, mean = 0, sd = 1) # 类别1的数据,均值为0
y1 <- rnorm(n, mean = 0, sd = 1) # 类别1的数据,均值为0
x2 <- rnorm(n, mean = 3, sd = 1) # 类别2的数据,均值为3
y2 <- rnorm(n, mean = 3, sd = 1) # 类别2的数据,均值为3
# 创建数据框
data <- data.frame(
x = c(x1, x2), # 合并x1和x2
y = c(y1, y2), # 合并y1和y2
category = c(rep("Category 1", n), rep("Category 2", n)) # 类别标签
)
# 将类别标签转换为数值
data$category_num <- ifelse(data$category == "Category 1", 0, 1)
# 绘制散点图
plot(data$x, data$y, pch = 19, col = ifelse(data$category == "Category 1", "blue", "red"),
main = "Scatter Plot of Two Normal Distributions",
xlab = "X", ylab = "Y", cex = 1.2)
legend("topright", legend = c("Category 1", "Category 2"), col = c("blue", "red"), pch = 19)
# 拟合逻辑回归模型
model <- glm(category_num ~ x + y, data = data, family = binomial)
summary(model) # 输出模型摘要
# 预测
predictions <- predict(model, newdata = data, type = "response")
# 将预测值转换为类别标签(以0.5为阈值)
predicted_classes <- ifelse(predictions > 0.5, 1, 0)
# 计算准确率
accuracy <- mean(predicted_classes == data$category_num)
cat("Accuracy:", accuracy, "\n")
# 绘制分类结果
plot(data$x, data$y, pch = 19, col = ifelse(predicted_classes == 0, "blue", "red"),
main = "Classification Result with Logistic Regression",
xlab = "X", ylab = "Y", cex = 1.2)
legend("topright", legend = c("Predicted Category 1", "Predicted Category 2"), col = c("blue", "red"), pch = 19)
# 绘制分类直线
# 获取模型系数
coefficients <- coef(model)
a <- coefficients["x"]
b <- coefficients["y"]
intercept <- coefficients["(Intercept)"]
# 计算分类直线的 y 值
x_values <- seq(min(data$x), max(data$x), length.out = 100)
y_values <- - (intercept + a * x_values) / b
# 绘制分类直线
lines(x_values, y_values, col = "green", lwd = 2)