机器学习-------算法(四)

本文介绍了K近邻算法,重点在于如何计算距离,特别是欧氏距离。讨论了相似样本的定义,并提示在实际应用中可能需要对数据进行标准化处理。此外,详细说明了sklearn库中的KNeighborsClassifier API,包括算法选项如'ball_tree'、'kd_tree'和'brute',以及k值选择对算法性能的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分类算法----K近邻算法:

算法描述:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。

(一)最重要的一点就是求距离

距离公式----欧氏距离

√(𝑎1−𝑏1)^2+(𝑎2−𝑏2)^2+(𝑎3−𝑏3)^2

上述公式就是求了两者之间的距离。

相似的样本,特征值之间的值应该是相似的。

附加:

K-近邻算法:为防止某一项对结果的影响,需要做标准化处理。

(二)API:

API: sklearn.neighbors.KNeighborsClassifier(n_neighbors=5,algorithm='auto')

      n_neighbors int, 可选(默认 = 5 ), k_neighbors 查询默认使用的邻居数
 

algorithm{‘auto’ball_treekd_tree‘brute’},可选用于计算最近邻居的算法:ball_tree将会使用 BallTreekd_tree将使用 KDTree‘auto’将尝试根据传递给fit方法的值来决定最合适的算法。 (不同实现方式影响效率)

算法:

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler


def knncls():
    """K-近邻算法"""
    # 读取数据
    data = pd.read_scv("读取文件位置")
    # 数据处理
    # 1 缩小数据范围,查询数据
    data = data.query("x > 1.0 & x < 1.25")
    # 处理事件
    time_value = pd.to_datetime(data["time"], unit="s")
    # 日期格式转换成字典格式
    time_value = pd.DatetimeIndex(time_value)
    # 构造一些特征
    data["day"] = time_value.day
    data["hour"] = time_value.hour
    # 删除掉原来的时间戳   1:列
    data.drop(["time"], axis= 1)
    # 删除签到人数少的
    place_count = data.groupby('place_id').count()
    tf = place_count[place_count.row_id > 3].reset_index()
    data = data[data['place_id'].isin(tf.place_id)]
    # 取出特征值和目标值
    # 所有数据中取出了目标值,然后再删除目标值,剩下的就是特征值
    y = data["place_id"]
    x = data.drop(["place_id"],axis = 1)
    # 数据的分割
    train_x, test_x, train_y,test_y = train_test_split(x, y ,test_size=0.25)
    # 特征工程(标准化)
    std = StandardScaler()
    # 对测试训练集进行标准化
    train_x = std.fit_transform(train_x)
    test_x = std.transform(test_x)

    # 进行算法流程
    knn = KNeighborsClassifier(n_neighbors=5)
    # fit, predict, ````
    knn.fit(train_x, train_y)
    # 得出预测结果
    y_predict = knn.predict(test_x)
    print("预测结果", y_predict)
    # 预测准确率
    print("准确率:", knn.score(test_x, test_y))


if __name__ == '__main__':
    knncls()

总结:

k值取很小:容易受异常点影响

k值取很大:容易受最近数据太多导致比例变化

优点:
简单,易于理解, 易于实现,无需估计参数,无需训练

 

 

缺点:
懒惰算法,对测试样本分类时的计算量大,内存开销大
必须指定 K 值, K 值选择不当则分类精度不能保证

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值