,试将其表示为齐次线性模型形式。
神来之笔:非齐次线性模型可以通过扩展输入特征向量 X(增加一个额外维度且值固定为 1)转化为齐次线性模型。这个方法常用于机器学习模型的数学推导中,使公式更简洁统一。
上图展示了如何将原始特征向量 X 转化为扩展特征向量 X′:
月份 | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|
月广告投入(万元) | 9.95 | 10.14 | 9.22 | 8.87 | 12.06 | 16.30 |
月销量(万辆) | 1.018 | 1.143 | 1.036 | 0.915 | 1.373 | 1.640 |
月份 | 7 | 8 | 9 | 10 | 11 | 12 |
月广告投入(万元) | 17.01 | 18.93 | 14.01 | 13.01 | 15.41 | 14.21 |
月销量(万辆) | 1.886 | 1.913 | 1.521 | 1.237 | 1.601 | 1.496 |
我们需要根据给定的广告投入与销量数据,构造一个线性回归模型。线性回归的数学形式是:
其中:
目标是利用历史数据拟合出模型 w 和 b,并预测当广告投入为 20 万元时的销量。
代码:
import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
# Input data from the table
data = {
"广告投入": [9.95, 10.14, 9.22, 8.87, 12.06, 16.30, 14.01, 13.01, 15.41, 14.21, 17.01, 18.93],
"销量": [1.018, 1.143, 1.036, 0.915, 1.373, 1.640, 1.521, 1.237, 1.601, 1.496, 1.886, 1.913],
}
# Create a DataFrame
df = pd.DataFrame(data)
# Prepare data for regression
X = np.array(df["广告投入"]).reshape(-1, 1)
y = np.array(df["销量"])
# Fit linear regression model
model = LinearRegression()
model.fit(X, y)
# Predict for advertising input of 20万元
ad_input = np.array([[20]])
predicted_sales = model.predict(ad_input)[0]
# Model coefficients and intercept
coefficients = model.coef_[0]
intercept = model.intercept_
# Display results and dataset summary to the user
results = {
"线性回归方程": f"y = {coefficients:.4f} * x + {intercept:.4f}",
"预测广告投入为20万元时的销量": predicted_sales,
}
import ace_tools as tools; tools.display_dataframe_to_user(name="广告投入与销量分析数据", dataframe=df)
results
得到结果:
月份 | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|
月广告投入(万元) | 9.95 | 10.14 | 9.22 | 8.87 | 12.06 | 16.30 |
月销量(万辆) | 1.018 | 1.143 | 1.036 | 0.915 | 1.373 | 1.640 |
月份 | 7 | 8 | 9 | 10 | 11 | 12 |
月广告投入(万元) | 17.01 | 18.93 | 14.01 | 13.01 | 15.41 | 14.21 |
月销量(万辆) | 1.886 | 1.913 | 1.521 | 1.237 | 1.601 | 1.496 |
# Re-import necessary libraries
import pandas as pd
import numpy as np
from sklearn.linear_model import LogisticRegression
# Recreate the dataset from the original problem
data = {
"广告投入": [9.95, 10.14, 9.22, 8.87, 12.06, 16.30, 14.01, 13.01, 15.41, 14.21, 17.01, 18.93],
"销量": [1.018, 1.143, 1.036, 0.915, 1.373, 1.640, 1.521, 1.237, 1.601, 1.496, 1.886, 1.913],
}
# Create a DataFrame
df = pd.DataFrame(data)
# Step 1: Create classification labels (1 if sales >= 1.5, else 0)
df["分类"] = (df["销量"] >= 1.5).astype(int) # 1 for sales >= 1.5, 0 otherwise
# Step 2: Prepare data for classification
X_class = np.array(df["广告投入"]).reshape(-1, 1) # Feature: Advertising Input
y_class = np.array(df["分类"]) # Label: Sales Classification
# Step 3: Train a logistic regression classifier
classifier = LogisticRegression()
classifier.fit(X_class, y_class)
# Step 4: Predict for advertising input of 13.5万元
ad_input_class = np.array([[13.5]])
predicted_class = classifier.predict(ad_input_class)[0]
probability = classifier.predict_proba(ad_input_class)[0][1]
# Model coefficients and intercept
class_coefficients = classifier.coef_[0][0]
class_intercept = classifier.intercept_[0]
# Results
classification_results = {
"线性分类器方程": f"f(x) = {class_coefficients:.4f} * x + {class_intercept:.4f}",
"广告投入为13.5万元时的预测类别": "销量达到1.5万辆 (类别1)" if predicted_class == 1 else "销量未达1.5万辆 (类别0)",
"达到1.5万辆的概率": f"{probability:.4%}",
}
import ace_tools as tools; tools.display_dataframe_to_user(name="广告投入与销量分类数据", dataframe=df)
classification_results
import numpy as np
import pandas as pd
# 数据提取
ad_investment = np.array([9.95, 10.14, 9.22, 8.87, 12.06, 16.30, 17.01, 18.93, 14.01, 13.03, 15.41, 14.21])
sales = np.array([1.018, 1.143, 1.036, 0.915, 1.373, 1.640, 1.886, 1.913, 1.521, 1.237, 1.601, 1.496])
# 将销量划分为两类
labels = np.where(sales >= 1.5, 1, 0)
# 均值计算
x_mean = np.mean(ad_investment)
y_mean = np.mean(labels)
# 计算斜率 w 和截距 b
w = np.sum((ad_investment - x_mean) * (labels - y_mean)) / np.sum((ad_investment - x_mean) ** 2)
b = y_mean - w * x_mean
# 构建分类器函数
def classify(x, w, b):
return 1 if (w * x + b) >= 0 else 0
# 对广告投入为 13.5 的情况进行预测
ad_to_predict = 13.5
predicted_class = classify(ad_to_predict, w, b)
# 显示结果
w, b, predicted_class
编号 | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|
湿度情况 | 干燥 | 干燥 | 干燥 | 潮湿 | 潮湿 | 潮湿 |
温度情况 | 高温 | 低温 | 适宜 | 高温 | 低温 | 适宜 |
天气情况 | 晴朗 | 晴朗 | 阴雨 | 阴雨 | 晴朗 | 阴雨 |
🔍 9. 试分析基尼指数为何可用于度量数据集的纯度。
基尼指数通过衡量数据集中样本类别的不一致性来反映纯度,其核心在于:
接近 1 时,其他类别的概率趋于 0,基尼指数趋于 0,表示数据集几乎全部属于一个类别,纯度高。
接近均匀分布时,基尼指数较高,表示数据分布混乱,纯度低。
表示类别的重要性,平方项让高概率类别的贡献更大,而低概率类别的贡献更小。因此,基尼指数对不平衡分布的数据更敏感。
基尼指数通过衡量类别分布的不一致性和概率的均匀程度来反映数据集的纯度:
对于一个样本集合 D,假设有 K 个类别,其基尼指数公式为:
其中:
是样本属于第 iii 类的概率(即该类别样本数占总样本数的比例)。
越接近 1,其他类别的
(
)越接近 0,基尼指数越小,表示数据集纯度越高。
越均匀,基尼指数越大,表示数据集纯度越低。
相同点:
剪枝时机 | 决策树构建过程中提前停止 | 决策树构建完成后,从底向上逐层剪枝 |
---|
计算复杂度 | 较低,速度快 | 较高,需要更多计算资源 |
---|
剪枝依据 | 启发式标准(如增益、样本数等) | 验证集性能(如准确率、交叉验证等) |
---|
风险 | 可能过早停止分裂,导致欠拟合 | 逐步删除不必要的节点,风险较低 |
---|
模型复杂度 | 树通常较浅,节点少 | 初始树较复杂,剪枝后更稳健 |
---|
适用场景 | 训练数据较少、简单问题 | 数据复杂、模型需要精细调整 |
---|
🔍 12. 现有如表3-30所示的客户信息数据集,试根据该数据集构造一棵用于判断是否提供贷款的ID3决策树。
编号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
年龄 | 27 | 28 | 36 | 57 | 52 | 41 | 51 | 23 | 31 | 50 | 41 | 38 |
收入水平 | 高 | 高 | 高 | 中 | 中 | 低 | 中 | 中 | 高 | 中 | 低 | 中 |
固定收入 | 否 | 否 | 否 | 是 | 否 | 否 | 否 | 是 | 是 | 否 | 是 | 是 |
银行VIP | 否 | 是 | 否 | 否 | 否 | 否 | 是 | 否 | 是 | 否 | 是 | 否 |
提供贷款 | 否 | 否 | 是 | 是 | 否 | 否 | 是 | 否 | 是 | 否 | 是 | 是 |
这里手写了,没算,大家可以自己算,结合上面求信息增益的过程:
编号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
年龄 | 27 | 28 | 36 | 57 | 52 | 41 | 51 | 23 | 31 | 50 | 41 | 38 |
收入水平 | 高 | 高 | 高 | 中 | 中 | 低 | 中 | 中 | 高 | 中 | 低 | 中 |
固定收入 | 否 | 否 | 否 | 是 | 否 | 否 | 否 | 是 | 是 | 否 | 是 | 是 |
银行VIP | 否 | 是 | 否 | 否 | 否 | 否 | 是 | 否 | 是 | 否 | 是 | 否 |
提供贷款 | 否 | 否 | 是 | 是 | 否 | 否 | 是 | 否 | 是 | 否 | 是 | 是 |
固有属性值
编号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
年龄 | 27 | 28 | 36 | 57 | 52 | 41 | 51 | 23 | 31 | 50 | 41 | 38 |
收入水平 | 高 | 高 | 高 | 中 | 中 | 低 | 中 | 中 | 高 | 中 | 低 | 中 |
固定收入 | 否 | 否 | 否 | 是 | 否 | 否 | 否 | 是 | 是 | 否 | 是 | 是 |
银行VIP | 否 | 是 | 否 | 否 | 否 | 否 | 是 | 否 | 是 | 否 | 是 | 否 |
提供贷款 | 否 | 否 | 是 | 是 | 否 | 否 | 是 | 否 | 是 | 否 | 是 | 是 |
这里小编就列出了收入水平一条~其余的靠大家自己努力,都是类似的
月份 | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|
月广告投入(万元) | 9.95 | 10.14 | 9.22 | 8.87 | 12.06 | 16.30 |
月销量(万辆) | 1.018 | 1.143 | 1.036 | 0.915 | 1.373 | 1.640 |
月份 | 7 | 8 | 9 | 10 | 11 | 12 |
月广告投入(万元) | 17.01 | 18.93 | 14.01 | 13.01 | 15.41 | 14.21 |
月销量(万辆) | 1.886 | 1.913 | 1.521 | 1.237 | 1.601 | 1.496 |
实现分裂计算的代码
import numpy as np
import pandas as pd
# 数据准备
advertising = np.array([9.95, 10.14, 9.22, 8.87, 12.06, 16.30, 17.01, 18.93, 14.01, 13.03, 15.41, 14.21])
sales = np.array([1.018, 1.143, 1.036, 0.915, 1.373, 1.640, 1.886, 1.913, 1.521, 1.237, 1.601, 1.496])
# 分裂点候选(广告投入的唯一值)
split_points = np.unique(advertising)
# 寻找最佳分裂点
best_split = None
min_mse = float('inf')
results = []
for split in split_points:
# 左子集和右子集
left_indices = advertising <= split
right_indices = advertising > split
# 左子集和右子集的均值
y_left_mean = np.mean(sales[left_indices]) if np.sum(left_indices) > 0 else 0
y_right_mean = np.mean(sales[right_indices]) if np.sum(right_indices) > 0 else 0
# 左子集和右子集的均方误差
mse_left = np.mean((sales[left_indices] - y_left_mean) ** 2) if np.sum(left_indices) > 0 else 0
mse_right = np.mean((sales[right_indices] - y_right_mean) ** 2) if np.sum(right_indices) > 0 else 0
# 加权均方误差
n_left = np.sum(left_indices)
n_right = np.sum(right_indices)
mse_total = (n_left / len(sales)) * mse_left + (n_right / len(sales)) * mse_right
# 更新最优分裂点
results.append((split, mse_total, mse_left, mse_right))
if mse_total < min_mse:
min_mse = mse_total
best_split = split
# 输出结果
best_split, min_mse, results
朴素贝叶斯分类器是一种基于 贝叶斯定理 的简单但有效的分类算法。其核心假设前提是 特征条件独立性假设,具体如下:
是条件独立的。
对类别 C 的贡献是独立的,特征之间不存在相互依赖关系。
朴素贝叶斯分类器在特征之间相对独立的情况下效果较好,如文本分类(单词作为特征时通常近似独立)。
半朴素贝叶斯分类器是对朴素贝叶斯的扩展和改进,放松了特征条件独立性的假设,允许特征之间存在某种依赖关系。
其中,parent(i) 是第 i 个特征的父特征。
半朴素贝叶斯分类器适用于特征之间有一定依赖关系但这种依赖关系并不复杂的场景,例如某些医学诊断和传感器网络数据。
编号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
年龄 | 27 | 28 | 36 | 57 | 52 | 41 | 51 | 23 | 31 | 50 | 41 | 38 |
收入水平 | 高 | 高 | 高 | 中 | 中 | 低 | 中 | 中 | 高 | 中 | 低 | 中 |
固定收入 | 否 | 否 | 否 | 是 | 否 | 否 | 否 | 是 | 是 | 否 | 是 | 是 |
银行VIP | 否 | 是 | 否 | 否 | 否 | 否 | 是 | 否 | 是 | 否 | 是 | 否 |
提供贷款 | 否 | 否 | 是 | 是 | 否 | 否 | 是 | 否 | 是 | 否 | 是 | 是 |
编号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
年龄 | 27 | 28 | 36 | 57 | 52 | 41 | 51 | 23 | 31 | 50 | 41 | 38 |
收入水平 | 高 | 高 | 高 | 中 | 中 | 低 | 中 | 中 | 高 | 中 | 低 | 中 |
固定收入 | 否 | 否 | 否 | 是 | 否 | 否 | 否 | 是 | 是 | 否 | 是 | 是 |
银行VIP | 否 | 是 | 否 | 否 | 否 | 否 | 是 | 否 | 是 | 否 | 是 | 否 |
提供贷款 | 否 | 否 | 是 | 是 | 否 | 否 | 是 | 否 | 是 | 否 | 是 | 是 |
是条件独立的。
在本题中,我们的假设是:
为了构建一个以“年龄”为核心的半朴素贝叶斯分类器,我们需要以下步骤:
其中 w是回归系数,
是噪声(假设服从正态分布)。
,我们可以得到其均值(作为点估计)和方差(表示不确定性)。
🔍 23. 试举例说明核函数技术为何能实现数据升维。
核函数技术是一种在支持向量机(SVM)和其他机器学习算法中常用的方法,它的核心思想是通过一个映射函数将低维数据映射到更高维空间,从而使原本线性不可分的数据变得线性可分。以下是核函数实现数据升维的解释和示例。
核函数通过一个隐式的方式完成升维操作。我们并不直接计算数据在高维空间中的位置,而是通过核函数计算两个数据点在高维空间中的内积。这种方式既避免了高维计算的复杂性,也达到了升维的效果。
核函数技术通过隐式映射数据到高维空间,可以帮助解决许多非线性问题。不仅限于SVM,以上方法在分类、回归、聚类、降维和密度估计等领域均得到了广泛应用。