KNN算法
K-Nearest Neighbor,即K最近邻算法
K指的是最近邻的个数
KNN算法既可用于求解分类问题,也可用于求解回归问题
K值的确定
K值过小,容易造成过拟合
K值过大,容易导致结果固化
经验上,一般取K为5
距离的确定
当q=1时,又称曼哈顿距离
当p=2时,又称欧氏距离
当p=正无穷时,又称切比雪夫距离,它是各个坐标距离的最大值
KNN算法的距离确定一般用欧式距离
权重
权重指的是某一个因素相对于整体事务的重要程度,既可体现各个因素所占的百分比,也强调了因素的相对重要程度和贡献度。
在KNN算法中,距离预测样本点越近的样本越有话语权。
本次解决问题
本次分别以自算与调库两种写KNN算法,目的:在已知数据集不同种类的电影训练下判断新电影的种类
开始
为了学习KNN原理,先自己写一个不调库的
import math
#已知数据,即训练数据集,数字分别代表搞笑镜头,拥抱镜头,打斗镜头
movie_data = {'宝贝当家': [45, 2, 9, '喜剧片'],
'美人鱼': [21, 17, 5, '喜剧片'],
'澳门风云3': [54, 9, 11, '喜剧片'],
'功夫熊猫': [39, 0, 31, '喜剧片'],
'谍影重重': [5, 2, 57, '动作片'],
'叶问3': [3, 2, 65, '动作片'],
'伦敦陷落': [2, 3, 55, '动作片'],
'我的特工爷爷': [6, 4, 21, '动作片'],
'奔爱': [7, 46, 4, '爱情片'],
'夜孔雀': [9, 39, 8, '爱情片'],
'代理情人': [9, 38, 2, '爱情片'],
'新步步惊心': [8, 34, 17, '爱情片']
}
#需判断的新数据
x = [23, 3, 17]
KNN = []
#用欧式距离进行排序
for key, v in movie_data.items():
d = math.sqrt((x[0]-v[0])**2+(x[1]-v[1])**2+(x[2]-v[2])**2)
KNN.append([key, round(d, 2)]) #round作用是保留两位小数
KNN.sort(key=lambda c: c[1])
#选取其中距离最近的五个发言者
KNN = KNN[: 5]
labels = {'喜剧片': 0, '动作片': 0, '爱情片': 0}
for s in KNN:
label = movie_data[s[0]]
labels[label[3]] += 1
labels = sorted(labels.items(), key=lambda h: h[1])
print(labels)
print(labels[2][0], sep='\n')
运行后的结果
很明显,KNN算法原理就是找到与新数据最近的几个,跟据这几个的分类判断新数据的种类。
下面,我们用调库的方式再写
首先,我把上面的训练数据保存,目的是模拟以后需要从文件中拿数据
from pandas import DataFrame
#提取字典中的两列值
key = list(movie_data.keys())
value = list(movie_data.values())
gaoxiao = []
yongbao = []
dadou = []
fenlei = []
for i in value:
gaoxiao.append(i[0])
yongbao.append(i[1])
dadou.append(i[2])
fenlei.append(i[3])
print(key, value)
#利用pandas模块先建立DataFrame类型,然后将两个上面的list存进去
result_excel = DataFrame()
result_excel['剧名'] = key
result_excel['搞笑镜头'] = gaoxiao
result_excel['拥抱镜头'] = yongbao
result_excel['打斗镜头'] = dadou
result_excel['分类'] = fenlei
# print(result_excel)
result_excel.to_excel('电影集.xlsx', header=True, index=False)
运行后的结果
现在调库代码
import pandas as pd
from sklearn.neighbors import KNeighborsClassifier
movie = pd.read_excel('电影集.xlsx')
X = movie[['搞笑镜头', '拥抱镜头', '打斗镜头']]
y = movie['分类']
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X, y)
movie_new = pd.DataFrame({'搞笑镜头': [23], '拥抱镜头': [3], '打斗镜头': [17]})
movie_new1 = pd.DataFrame({'搞笑镜头': [2, 3], '拥抱镜头': [1, 3], '打斗镜头': [1, 77]})
print(knn.predict(movie_new))
print(knn.predict_proba(movie_new))
print(knn.classes_)
print(knn.predict(movie_new1))
print(knn.predict_proba(movie_new1))
print(knn.classes_)
运行后的结果