KNN算法学习实践
1.理论学习
原文链接
ShowMeAI知识社区
2.案例实践
假如一套房子打算出租,但不知道市场价格,可以根据房子的规格(面积、房间数量、厕所数量、容纳人数等),在已有数据集中查找相似(K近邻)规格的房子价格,看别人的相同或相似户型租了多少钱。
我们本次用到的数据集是 rent_price,见附件或第一章链接网盘地址下载。
2.1分类过程
已知的数据集中,每个已出租住房都有房间数量、厕所数量、容纳人数等字段,并有对应出租价格。将预计出租房子数据与数据集中每条记录比较计算欧式距离,取出距离最小的5条记录,将其价格取平均值,可以将其看做预计出租房子的市场平均价格。
先引入需要的包
import pandas as pd
import numpy as np
from scipy.spatial import distance#用于计算欧式距离
from sklearn.preprocessing import StandardScaler#用于对数据进行标准化操作
from sklearn.neighbors import KNeighborsRegressor#KNN算法
from sklearn.metrics import mean_squared_error#用于计算均方根误差
导入数据并提取目标字段,我们看一下dc_listings数据集。
#导入数据并提取目标字段
path = r'rent_price.csv'
file = open(path, encoding = 'gb18030', errors = 'ignore')
dc_listings = pd.read_csv(file)
features = ['accommodates','bedrooms','bathrooms','beds','price','minimum_nights','maximum_nights','number_of_reviews']
dc_listings = dc_listings[features]
2.2进行初步数据清洗
1.数据集中非数值类型的字段需要转换,替换掉美元$符号和千分位符号逗号。
#数据初步清洗
our_acc_value = 3
dc_listings['distance'] = np.abs(dc_listings.accommodates - our_acc_value)
dc_listings = dc_listings.sample(frac=1, random_state=0)
dc_listings = dc_listings.sort_values('distance')
dc_listings['price'] = dc_listings.price.str.replace("\$|,", "").astype(float)
dc_listings = dc_listings.dropna()
2.理想情况下,数据集中每个字段取值范围都相同,但实际上这是几乎不可能的,如果计算时直接用原数据计算,则会造成较大训练误差,所以需要对各列数据进行标准化或归一化操作,尽量减少不必要的训练误差。
#数据标准化
dc_listings[features] = StandardScaler().fit_transform(dc_listings[features])
normalized_listings = dc_listings
3.最好不要将所有数据全部拿来测试,需要分出训练集和测试集具体划分比例按数据集确定。
#取得训练集和测试集
norm_train_df = normalized_listings[:2792]
norm_test_df = normalized_listings[2792:]
2.3计算欧氏距离并预测房屋价格
#scipy包distance模块计算欧式距离
first_listings = normalized_listings.iloc[0][['accommodates', 'bathrooms']]
fifth_listings = normalized_listings.iloc[20][['accommodates', 'bathrooms']]
#用python方法做多变量KNN模型
def predict_price_multivariate(new_listing_value, feature_columns):temp_df = norm_train_df#distance.cdist计算两个集合的距离temp_df['distance'] = distance.cdist(temp_df[feature_columns], [new_listing_value[feature_columns]])temp_df = temp_df.sort_values('distance')#temp_df按distance排序knn_5 = temp_df.price.iloc[:5]predicted_price = knn_5.mean()return predicted_price
cols = ['accommodates', 'bathrooms']
norm_test_df['predicted_price'] = norm_test_df[cols].apply(predict_price_multivariate, feature_columns=cols, axis=1)
norm_test_df['squared_error'] = (norm_test_df['predicted_price'] - norm_test_df['price']) ** 2
mse = norm_test_df['squared_error'].mean()
rmse = mse ** (1/2)
print(rmse)
#利用sklearn完成KNN
col = ['accommodates', 'bedrooms']
knn = KNeighborsRegressor()
#将自变量和因变量放入模型训练,并用测试数据测试
knn.fit(norm_train_df[cols], norm_train_df['price'])
two_features_predictions = knn.predict(norm_test_df[cols])
#计算预测值与实际值的均方根误差
two_features_mse = mean_squared_error(norm_test_df['price'], two_features_predictions)
two_features_rmse = two_features_mse ** (1/2)
print(two_features_rmse)
输出为:
1.4667825805653032
1.5356457412450537
2.3全部代码
import mathimport pandas as pd
import numpy as np
from scipy.spatial import distance # 用于计算欧氏距离
from sklearn.preprocessing import StandardScaler # 用于对数据进行标准化操作
from sklearn.neighbors import KNeighborsRegressor # KNN算法
from sklearn.metrics import mean_squared_error # 用于计算均方根误差#导入数据并提取目标字段
path = r'E:\DeepLearn\KNN\rent_price.csv'
file = open(path, encoding='gb18030', errors='ignore')
dc_listings = pd.read_csv(file)
features = ['accommodates','bedrooms','bathrooms','beds','price','minimum_nights','maximum_nights','number_of_reviews']
dc_listings = dc_listings[features]#数据初步清洗
# 数据集中非数值类型的字段需要转换,替换掉美元$符号和千分位逗号。
our_acc_value = 3
dc_listings['distance'] = np.abs(dc_listings.accommodates - our_acc_value)
dc_listings = dc_listings.sample(frac = 1, random_state = 0)
dc_listings = dc_listings.sort_values('distance')
dc_listings['price'] = dc_listings.price.str.replace('\$|,','').astype(float)
dc_listings = dc_listings.dropna()# 数据标准化
dc_listings[features] = StandardScaler().fit_transform(dc_listings[features])
normalized_listings = dc_listings# 取得训练集和测试集
norm_train_df = normalized_listings[: 2792]
norm_test_df = normalized_listings[2792:]# 计算欧氏距离并预测房屋价格# scipy包distance模块计算欧氏距离
first_listings = normalized_listings.iloc[0][['accommodates', 'bathrooms']]
fifth_listings = normalized_listings.iloc[20][['accommodates', 'bathrooms']]# 用python方法做多变量KNN模型
def predict_price_multivariate(new_listings_value, feature_columns):temp_df = norm_train_df# distance.cdist计算两个集合的距离temp_df['distance'] = distance.cdist(temp_df[feature_columns], [new_listings_value[feature_columns]])# temp_df 按distance排序temp_df = temp_df.sort_values('distance')knn_5 = temp_df.price.iloc[:5]predicted_price = knn_5.mean()return predicted_pricecols = ['accommodates', 'bathrooms']
norm_test_df['predicted_price'] = norm_test_df[cols].apply(predict_price_multivariate, feature_columns = cols, axis = 1)
norm_test_df['squared_error'] = (norm_test_df['predicted_price'] - norm_test_df['price']) ** 2
mse = norm_test_df['squared_error'].mean()
rmse = mse ** 0.5
print(rmse)# 利用sklearn完成KNN
col = ['accommodates', 'bedrooms']
knn = KNeighborsRegressor()
# 将自变量和因变量放入模型训练,并用测试数据测试
knn.fit(norm_train_df[cols],norm_train_df["price"])
two_features_predictions = knn.predict(norm_test_df[cols])# 计算预测值与实际值的均方根误差
two_features_mse = mean_squared_error(norm_test_df['price'], two_features_predictions)
two_features_rmse = math.sqrt(two_features_mse)
print(two_features_rmse)
相关文章:

KNN算法学习实践
1.理论学习 原文链接 ShowMeAI知识社区 2.案例实践 假如一套房子打算出租,但不知道市场价格,可以根据房子的规格(面积、房间数量、厕所数量、容纳人数等),在已有数据集中查找相似(K近邻)规格…...

数据可视化的图表
1.折线图反映了一段时间内事物连续的动态变化规律,适用于描述一个变量随另一个变量变化的趋势,通常用于绘制连续数据,适合数据点较多的情况。 2.散点图是以直角坐标系中各点的密集程度和变化趋势来表示两种现象间的相关关系,常用于显示和比较数值。当要在不考虑时间…...

动手学深度学习-卷积神经网络-3填充和步幅
目录 填充 步幅 小结 在上一节的例子(下图) 中,输入的高度和宽度都为3,卷积核的高度和宽度都为2,生成的输出表征的维数为22。 正如我们在 上一节中所概括的那样,假设输入形状为nhnw,卷积核形…...

【JS|第28期】new Event():前端事件处理的利器
日期:2025年1月24日 作者:Commas 签名:(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释:如果您觉得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方…...

Spring Boot 中的事件发布与监听:深入理解 ApplicationEventPublisher(附Demo)
目录 前言1. 基本知识2. Demo3. 实战代码 前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 基本的Java知识推荐阅读: java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全&am…...

【Spring】Spring启示录
目录 前言 一、示例程序 二、OCP开闭原则 三、依赖倒置原则DIP 四、控制反转IOC 总结 前言 在软件开发的世界里,随着项目的增长和需求的变化,如何保持代码的灵活性、可维护性和扩展性成为了每个开发者必须面对的问题。传统的面向过程或基于类的设计…...

ospf动态路由配置,cost路径调整,ospf认证实验
一、实验拓扑如图: 接口ip配置网络 :10.17.12.* 10.17.13.* ,10.17.23.* 回环接口配置分别为 10.0.1.1 ,10.0.1.2,10.0.1.3对应三台路由器 ar1配置接口ip interface GigabitEthernet0/0/0 ip address 10.17.12.1…...

在Rust应用中访问.ini格式的配置文件
在Rust应用中访问.ini格式的配置文件,你可以使用第三方库,比如 ini 或 config. 下面是一个使用 ini 库的示例,该库允许你读取和解析.ini文件。 使用 ini 库 添加依赖 首先,你需要在你的 Cargo.toml 文件中添加 ini 库的依赖&am…...

批量处理多个模型的预测任务
#!/bin/bash# 检查是否传入必要的参数,若未传入参数则打印用法并退出 if [ "$#" -lt 1 ]; thenecho "用法: $0 <file_path>"echo "示例: $0 /home/aistudio/work/PaddleSeg/city/cityscapes_urls_extracted.txt"exit 1 fi# 读取…...

Java 编程初体验
Java学习资料 Java学习资料 Java学习资料 一、引言 在当今数字化的时代,编程已然成为一项极具价值的技能。而 Java 作为一门广泛应用于企业级开发、移动应用、大数据等众多领域的编程语言,吸引着无数初学者投身其中。当我们初次踏入 Java 编程的世界&…...

element-plus 的table section如何实现单选
如果是单选那么全新的按钮应该隐藏或者不可编辑的状态。但是我没找到改变成不可编辑的方法,只能采取隐藏 <template><!-- 注意要包一层div根元素,否则css样式可能会不生效,原因不详 --><div><el-table ref"proTab…...

【JavaEE进阶】图书管理系统 - 壹
目录 🌲序言 🌴前端代码的引入 🎋约定前后端交互接口 🚩接口定义 🍃后端服务器代码实现 🚩登录接口 🚩图书列表接口 🎄前端代码实现 🚩登录页面 🚩…...

牛客周赛 Round 77 题解
文章目录 A-时间表B-数独数组D-隐匿社交网络E-1or0 A-时间表 签到题 #include <bits/stdc.h> using namespace std;int main() {int a[6] {20250121,20250123,20250126,20250206,20250208,20250211};int n; cin >> n;cout << a[n - 1];return 0; }B-数独数…...

Mybatis配置文件详解
MyBatis通过XML或注解的方式将Java对象与数据库中的记录进行映射,极大地简化了数据访问层的开发。而在MyBatis的核心组成部分中,配置文件扮演着举足轻重的角色。它不仅定义了MyBatis的运行环境,还配置了数据源、事务管理、映射器等关键元素&a…...

《深度揭秘:TPU张量计算架构如何重塑深度学习运算》
在深度学习领域,计算性能始终是推动技术发展的关键因素。从传统CPU到GPU,再到如今大放异彩的TPU(张量处理单元),每一次硬件架构的革新都为深度学习带来了质的飞跃。今天,就让我们深入探讨TPU的张量计算架构…...

Java基础知识总结(二十二)--List接口
List本身是Collection接口的子接口,具备了Collection的所有方法。现在学习List体系特有的共性方法,查阅方法发现List的特有方法都有索引,这是该集合最大的特点。 List:有序(元素存入集合的顺序和取出的顺序一致),元素都…...

[STM32 - 野火] - - - 固件库学习笔记 - - -十二.基本定时器
一、定时器简介 STM32 中的定时器(TIM,Timer)是其最重要的外设之一,广泛用于时间管理、事件计数和控制等应用。 1.1 基本功能 定时功能:TIM定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中…...

算法随笔_27:最大宽度坡
上一篇:算法随笔_26: 按奇偶排序数组-CSDN博客 题目描述如下: 给定一个整数数组 nums,坡是元组 (i, j),其中 i < j 且 nums[i] < nums[j]。这样的坡的宽度为 j - i。 找出 nums 中的坡的最大宽度,如果不存在,返回 0 。 …...

无公网IP 外网访问本地部署 llamafile 大语言模型
llamafile 是一种AI大模型部署(或者说运行)的方案,它的特点就是可以将模型和运行环境打包成一个独立的可执行文件,这样就简化了部署流程。用户只需要下载并执行该文件,无需安装运行环境或依赖库,这大大提高…...

使用PC版本剪映制作照片MV
目录 制作MV模板时长调整拖动边缘缩短法分割删除法变速法整体调整法 制作MV 导入音乐 导入歌词 点击歌词 和片头可以修改字体: 还可以给字幕添加动画效果: 导入照片,自动创建照片轨: 修改片头字幕:增加两条字幕轨&…...

搭建 docxify 静态博客教程
首先,安装 node 环境安装 docxify ,参考官网:https://docsify.js.org/#/zh-cn/ npm i docsify-cli -g新建docs文件夹专门用来放文章,初始化命令 docsify init ./docs就会生成如下两个文件,index.html 入口文件&#…...

汽车OEMs一般出于什么目的来自定义Autosar CP一些内容
汽车OEMs在使用AUTOSAR CP(Classic Platform)协议时,可能会根据自身的特定需求对标准协议进行修改,形成自己的企业标准(企标)。这种修改通常是为了满足特定的硬件平台、功能需求、安全要求或优化性能。以下是一些常见的修改场景和例子: 1. 硬件平台适配 企业可能会根据…...

Vue.js Vuex 模块化管理
Vue.js Vuex 模块化管理 今天咱们来聊聊如何在 Vuex 中进行模块化管理。当你的 Vue.js 应用变得越来越庞大时,单一的状态管理可能会让人头疼。这时候,Vuex 的模块化功能就派上用场了。 为什么需要模块化? 想象一下,如果把所有的…...

分布式光纤应变监测是一种高精度、分布式的监测技术
一、土木工程领域 桥梁结构健康监测 主跨应变监测:在大跨度桥梁的主跨部分,如悬索桥的主缆、斜拉桥的斜拉索和主梁,分布式光纤应变传感器可以沿着这些关键结构部件进行铺设。通过实时监测应变情况,能够精确捕捉到车辆荷载、风荷…...

用Devc++与easyx一步一步做游戏[启动界面部分]-解决hover闪烁问题及优化
在之前的博文中《用Devc与easyx一步一步做游戏[启动界面部分]-之按钮制作》,我们利用Devc和easyx完成了游戏启动界面按钮的基本制作,实现了按钮的绘制以及鼠标悬停时的信息提示功能。然而,目前还存在一个问题,即鼠标移动时&#x…...

mysql 学习3 SQL语句--整体概述。SQL通用语法;DDL创建数据库,查看当前数据库是那个,删除数据库,使用数据库;查看当前数据库有哪些表
SQL通用语法 SQL语句分类 DDL data definition language : 用来创建数据库,创建表,创建表中的字段,创建索引。因此成为 数据定义语言 DML data manipulation language 有了数据库和表以及字段后,那么我们就需要给这个表中 添加数…...

【数据结构】_链表经典算法OJ:分割链表(力扣—中等)
目录 1. 题目描述及链接 2. 解题思路 2.1 思路1 2.2 思路2 2.3 思路3(本题采取该解法) 3. 题解程序 1. 题目描述及链接 题目链接:面试题 02.04. 分割链表 - 力扣(LeetCode) 题目描述: 给你一个链表…...

k8s支持自定义field-selector spec.hostNetwork过滤
好久没写博客啦,年前写一个博客就算混过去啦😂 写一个小功能,对于 Pod,在没有 label 的情况下,支持 --field-selector spec.hostNetwork 查询 Pod 是否为 hostNetwork 类型,只为了熟悉 APIServer 是如何构…...

ICSE‘25 LLM Assistance for Memory Safety
不知道从什么时候开始,各大技术社区,技术群聊流行着 “用Rust重写!” ,放一张图(笑死… 这不, 随着大模型技术的流行,大家都在探索如何让大模型自动完成仓库级别(全程序)的代码重构,代码变换(Refactor&…...

《十七》浏览器基础
浏览器:是安装在电脑里面的一个软件,能够将页面内容渲染出来呈现给用户查看,并让用户与网页进行交互。 常见的主流浏览器: 常见的主流浏览器有:Chrome、Safari、Firefox、Opera、Edge 等。 输入 URL,浏览…...