k-近邻算法自实现和sklearn方法

自实现

 import pandas as pd
 import numpy as np
 import matplotlib.pyplot as plt
 from sklearn.neighbors import KNeighborsClassifier

"""
电影分类数据类型分析   方法自实现k-近邻方法
"""

#加载数据
move=pd.read_excel('./电影分类数据.xlsx')
# print(move)
"""
    序号    电影名称  搞笑镜头  拥抱镜头  打斗镜头 电影类型  唐人街探案  23   3  17
0    1    宝贝当家    45     2     9  喜剧片    NaN NaN NaN NaN
1    2     美人鱼    21    17     5  喜剧片    NaN NaN NaN NaN
2    3   澳门风云3    54     9    11  喜剧片    NaN NaN NaN NaN
3    4   功夫熊猫3    39     0    31  喜剧片    NaN NaN NaN NaN
4    5    谍影重重     5     2    57  动作片    NaN NaN NaN NaN
5    6     叶问3     3     2    65  动作片    NaN NaN NaN NaN
6    7  我的特工爷爷     6     4    21  动作片    NaN NaN NaN NaN
7    8      奔爱     7    46     4  爱情片    NaN NaN NaN NaN
8    9     夜孔雀     9    39     8  爱情片    NaN NaN NaN NaN
9   10    代理情人     9    38     2  爱情片    NaN NaN NaN NaN
10  11   新步步惊心     8    34    17  爱情片    NaN NaN NaN NaN
11  12    伦敦陷落     2     3    55  动作片    NaN NaN NaN NaN
"""
# print(move.shape)

#获取训练集
train=move.iloc[:,1:6]
# print(train)

#获取测试集数据
test=np.array(move.columns[-4:])
# print(test)

#自实现knn算法分析
k=5
#循环计算每个点与测试样本的距离
index_num=train.shape[0]
train['欧氏距离']=np.nan#先占位
for i in range(index_num):#训练集数据有几行就循环几行
    dist=np.sqrt(np.sum(np.power(train.iloc[i,1:4].values-test[1:], 2)))
    # print(dist)
    train.ix[i,'欧氏距离']=dist#将距离保存到train中
# print(train)
"""
      电影名称  搞笑镜头  拥抱镜头  打斗镜头 电影类型       欧氏距离
0     宝贝当家    45     2     9  喜剧片  23.430749
1      美人鱼    21    17     5  喜剧片  18.547237
2    澳门风云3    54     9    11  喜剧片  32.140317
3    功夫熊猫3    39     0    31  喜剧片  21.470911
4     谍影重重     5     2    57  动作片  43.874822
5      叶问3     3     2    65  动作片  52.009614
6   我的特工爷爷     6     4    21  动作片  17.492856
7       奔爱     7    46     4  爱情片  47.686476
8      夜孔雀     9    39     8  爱情片  39.661064
9     代理情人     9    38     2  爱情片  40.570926
10   新步步惊心     8    34    17  爱情片  34.438351
11    伦敦陷落     2     3    55  动作片  43.416587
"""
#对训练集数据的电影类型进行排序  从小到大
train=train.sort_values('欧氏距离').iloc[:k,:]#ix[:k,:]  取0行到k行,所有列
# print(train)
"""
     电影名称  搞笑镜头  拥抱镜头  打斗镜头 电影类型       欧氏距离
6  我的特工爷爷     6     4    21  动作片  17.492856
1     美人鱼    21    17     5  喜剧片  18.547237
3   功夫熊猫3    39     0    31  喜剧片  21.470911
0    宝贝当家    45     2     9  喜剧片  23.430749
2   澳门风云3    54     9    11  喜剧片  32.140317

"""
mode=train['电影类型'].mode()[0]
# print(mode)
"""
喜剧片
"""

sklearn方法

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.neighbors import KNeighborsClassifier

"""
电影分类数据类型分析   方法k-近邻方法
"""

#加载数据
move=pd.read_excel('./电影分类数据.xlsx')
# print(move)

#获取训练集
train=move.iloc[:,1:6]
# print(train)
#训练集判断条件
plt.rcParams['font.sans-serif']='SimHei'
#或
# train.loc[train.loc[:,'电影类型']=='喜剧片','类别']=0
# train.loc[train.loc[:,'电影类型']=='动作片','类别']=1
# train.loc[train.loc[:,'电影类型']=='爱情片','类别']=2
#获取测试集
test=np.array(move.columns[-4:])
# print(test)
#构建knn实例
k=5
knn=KNeighborsClassifier(n_neighbors=k)
x=train.iloc[:,1:4].values#特征值
y=train.iloc[:,-1].values#目标值
#训练数据
knn.fit(x,y)
#拿出测试数据
test=test[1:]
#预测数据
y_predict=knn.predict([test])#注意维度匹配,这里二维数组
print(y_predict[0])#
"""
喜剧片
"""
k近邻算法是一种常用的无监督学习算法。它可以用来预测一个新的数据点所属的类别或者数值。在sklearn中,可以使用KNeighborsClassifier和KNeighborsRegressor来实现k近邻算法。 KNeighborsClassifier适用于分类问题,KNeighborsRegressor适用于回归问题。它们的使用方法类似,主要区别在于输入的数据类型和输出的结果类型。 下面是一个简单的示例,演示如何使用KNeighborsClassifier实现分类任务: ```python from sklearn.neighbors import KNeighborsClassifier from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split # 加载数据集 iris = load_iris() X = iris.data y = iris.target # 划分数据集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 创建模型对象 knn = KNeighborsClassifier(n_neighbors=3) # 拟合模型 knn.fit(X_train, y_train) # 预测结果 y_pred = knn.predict(X_test) # 计算准确率 accuracy = knn.score(X_test, y_test) print('Accuracy:', accuracy) ``` 在这个示例中,首先使用load_iris函数加载鸢尾花数据集,然后利用train_test_split函数划分数据集。然后,创建KNeighborsClassifier对象,并将n_neighbors参数设置为3。接下来,使用fit方法拟合模型,并使用predict方法预测结果。最后,使用score方法计算模型的准确率。 需要注意的是,k近邻算法的效果很大程度上取决于k值的选择。通常,k的值越大,模型越简单,但是容易欠拟合;k的值越小,模型越复杂,但是容易过拟合。因此,需要通过交叉验证等方法来选择最优的k值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小争520

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值