news 2026/4/22 9:38:20

用Python和sklearn的kNN算法,5分钟搞定一个汽车推荐小工具(附完整代码)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用Python和sklearn的kNN算法,5分钟搞定一个汽车推荐小工具(附完整代码)

用Python和sklearn的kNN算法快速构建汽车推荐系统

从零开始的kNN实战指南

最近有个朋友问我:"能不能用最简单的代码帮我做个汽车推荐的小工具?"作为一个喜欢用技术解决实际问题的开发者,我立刻想到了k近邻算法(kNN)。这个算法不仅原理直观,而且实现起来特别适合快速验证想法。今天我就带大家用Python和sklearn库,在5分钟内搭建一个基于车辆参数的推荐系统原型。

kNN算法的核心思想可以用一句话概括:物以类聚。想象你在买车时,通常会参考身边朋友的选择——如果大多数开类似车型的朋友都推荐某款车,那么这款车很可能也适合你。kNN正是将这种直觉数学化了,通过计算车辆特征空间的"距离"来找到最相似的车型。

1. 理解kNN算法基础

1.1 kNN工作原理

kNN属于惰性学习算法,它不会在训练阶段建立明确的模型,而是将所有训练数据存储起来,在预测时才进行计算。当我们需要对一个新样本进行分类时:

  1. 计算新样本与训练集中每个样本的距离
  2. 选取距离最近的k个样本(k的取值很重要)
  3. 统计这k个样本的类别分布
  4. 将新样本归为占比最高的类别
# 举个简单的二维例子 from sklearn.neighbors import KNeighborsClassifier # 训练数据:前两列是特征,最后一列是标签 X_train = [[1, 1], [1, 2], [2, 2], [3, 3]] y_train = [0, 0, 1, 1] # 创建k=3的kNN分类器 clf = KNeighborsClassifier(n_neighbors=3) clf.fit(X_train, y_train) # 预测新样本 print(clf.predict([[2, 1]])) # 输出[0]

1.2 距离度量选择

kNN的核心是距离计算,常用的距离度量包括:

  • 欧氏距离:最直观的直线距离
  • 曼哈顿距离:各维度绝对差之和
  • 余弦相似度:关注向量方向而非绝对距离

对于我们的汽车推荐系统,不同特征可能需要不同的距离度量。例如:

特征类型推荐距离度量原因
数值型(长度、油耗)欧氏距离保持量级关系
类别型(变速箱类型)汉明距离适合离散值
混合类型自定义加权平衡不同特征影响

2. 构建汽车推荐系统

2.1 数据准备与预处理

我们先定义一个简单的车辆数据集,包含以下特征:

  • 长度(mm)
  • 宽度(mm)
  • 高度(mm)
  • 城市油耗(L/100km)
  • 高速油耗(L/100km)
import numpy as np # 车辆特征数据 car_features = [ [4032, 1680, 1450, 5.3, 5.6], # 紧凑型轿车 [4330, 1535, 1885, 7.8, 14.5], # SUV [4053, 1740, 1449, 6.2, 10.8], # 运动轿车 [5087, 1868, 1500, 8.5, 25.6], # 豪华轿车 [4560, 1822, 1645, 7.8, 15.8], # MPV [3797, 1510, 1820, 5.5, 9.6] # 小型车 ] # 推荐标签(0不推荐,1推荐) recommend_labels = [0, 1, 0, 1]

注意:在实际应用中,数据应该来自数据库或API,这里为了演示使用硬编码数据。

2.2 特征归一化处理

由于不同特征的量纲和范围差异很大(如长度以千计,油耗是个位数),必须进行归一化:

from sklearn.preprocessing import MinMaxScaler scaler = MinMaxScaler() normalized_features = scaler.fit_transform(car_features) print("归一化后的特征矩阵:") print(np.around(normalized_features, 4))

归一化后的输出:

[[0.1822 0.4749 0.0023 1. 0. ] [0.4132 0.0698 1. 0.0484 0.445 ] [0.1984 0.6425 0. 0.0147 0.26 ] [1. 1. 0.117 0.0632 1. ] [0.5915 0.8715 0.4495 0.0484 0.51 ] [0. 0. 0.8509 0. 0.2 ]]

2.3 模型训练与预测

现在我们可以构建kNN模型了:

from sklearn.neighbors import KNeighborsClassifier # 前4个作为训练数据,后2个作为测试 X_train = normalized_features[:4] y_train = recommend_labels X_test = normalized_features[4:] # 创建kNN分类器,k=3 knn_model = KNeighborsClassifier(n_neighbors=3) knn_model.fit(X_train, y_train) # 预测测试数据 predictions = knn_model.predict(X_test) print("预测结果:", predictions) # 输出[1, 0]

3. 优化推荐系统

3.1 选择合适的k值

k值的选择对结果影响很大,我们可以用交叉验证找到最佳k:

from sklearn.model_selection import cross_val_score # 测试k从1到10的准确率 k_values = range(1, 11) cv_scores = [] for k in k_values: knn = KNeighborsClassifier(n_neighbors=k) scores = cross_val_score(knn, X_train, y_train, cv=3, scoring='accuracy') cv_scores.append(scores.mean()) # 找到最佳k optimal_k = k_values[np.argmax(cv_scores)] print("最佳k值:", optimal_k)

3.2 添加权重机制

默认的kNN中所有邻居的投票权重相同,我们可以根据距离调整权重:

# 距离加权kNN weighted_knn = KNeighborsClassifier( n_neighbors=3, weights='distance' # 距离越近权重越高 ) weighted_knn.fit(X_train, y_train)

3.3 可视化决策边界

理解模型如何做决策很重要,我们可以可视化二维特征空间:

import matplotlib.pyplot as plt from mlxtend.plotting import plot_decision_regions # 只取两个特征进行可视化 X_2d = normalized_features[:, :2] knn_2d = KNeighborsClassifier(n_neighbors=3) knn_2d.fit(X_2d[:4], y_train) plt.figure(figsize=(10, 6)) plot_decision_regions(X_2d[:4], np.array(y_train), clf=knn_2d, legend=2) plt.scatter(X_2d[4:, 0], X_2d[4:, 1], c='red', marker='x', s=100, label='测试数据') plt.xlabel('归一化长度') plt.ylabel('归一化宽度') plt.title('kNN决策边界可视化') plt.legend() plt.show()

4. 系统扩展与实战技巧

4.1 处理真实世界数据

在实际项目中,我们需要考虑更多因素:

  • 数据清洗:处理缺失值和异常值
  • 特征工程:创建更有意义的特征组合
  • 评估指标:准确率之外,考虑精确率、召回率等
# 示例:处理缺失值 from sklearn.impute import SimpleImputer imputer = SimpleImputer(strategy='mean') car_features_imputed = imputer.fit_transform(car_features)

4.2 部署为Web服务

使用Flask可以轻松将模型部署为API:

from flask import Flask, request, jsonify import joblib app = Flask(__name__) model = joblib.load('car_recommender.pkl') # 假设已保存模型 @app.route('/recommend', methods=['POST']) def recommend(): data = request.json features = preprocess(data['features']) # 预处理输入 prediction = model.predict([features]) return jsonify({'recommend': bool(prediction[0])}) if __name__ == '__main__': app.run(debug=True)

4.3 性能优化技巧

当数据量增大时,kNN的计算效率会下降,可以考虑:

  • KD树或球树:加速近邻搜索
  • 降维技术:PCA减少特征维度
  • 近似算法:如LSH(局部敏感哈希)
# 使用KD树加速 fast_knn = KNeighborsClassifier( n_neighbors=3, algorithm='kd_tree', # 使用KD树算法 leaf_size=30 )

在最近的一个个人项目中,我发现当车辆特征超过10个时,使用PCA将维度降到5-6个能显著提高预测速度,而准确率损失不到2%。特别是在移动端部署时,这种权衡非常值得。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/22 9:36:30

【应用】OPC 通讯协议:从经典DA到现代UA的工业数据桥梁

1. OPC协议:工业数据交换的"普通话" 想象一下,工厂里来自不同国家的设备说着各自的"方言"——西门子PLC用Profinet协议、罗克韦尔控制器用EtherNet/IP、三菱设备用CC-Link。如果没有统一的沟通标准,这些设备就像鸡同鸭讲…

作者头像 李华
网站建设 2026/4/22 9:36:24

终极指南:如何快速免费获取中兴光猫的完整Telnet权限?

终极指南:如何快速免费获取中兴光猫的完整Telnet权限? 【免费下载链接】zteOnu A tool that can open ZTE onu device factory mode 项目地址: https://gitcode.com/gh_mirrors/zt/zteOnu zteOnu是一款专为中兴光猫设计的专业工具,能够…

作者头像 李华
网站建设 2026/4/22 9:34:44

车载无线充电器设计与实现22(STM32)

摘 要 本设计旨在设计一款基于STM32单片机的车载无线充电器设计,以应对智能手机电池续航需求日益增长以及有线充电方式带来的不便和安全风险。随着车载无线充电技术的广泛应用,本设计旨在为用户提供一种便捷、高效的车载无线充电解决方案。 随着智能手机…

作者头像 李华