基础算法-KNN(邻近算法)
程序员文章站
2022-03-29 14:48:33
...
KNN算法原理介绍
KNN概述
knn的线性回归例子
房东房屋出租:租多少钱合适呢?
找到和自己房子位置、户型等条件类似的n套,它们多少租金,我也多少租金。
knn的逻辑回归例子:
有已知的4部电影:根据镜头类别多少来分类成动作片和爱情片。有一部未知电影,假设K = 3,那么就计算其与前3部电影的距离d1,d2,d3,当未知电影与爱情片的距离d1、d2小于和动作片的距离d3时,判定未知电影是爱情片。
算法核心和实质
核心:物以类聚,人以群分
实质:找邻居,投票决定
原理详述
如何找邻居,找几个,如何投票?
距离的定义
欧式距离:两点间直线距离
曼哈顿距离:直线作为斜边构成直角三角形,两条直角边就是曼哈顿距离
K值的选取
k值选取不同,会导致不同的结果
如何投票
哪个多就是哪个类别
优缺点
代码实战
KNN算法API参数详解
n_neighbors:K值,邻居的个数,默认为5【关键参数】,为了取得合适的k,一般会先遍历
score():调出knn方法效果的评分
经典数据集分类任务(单分类)
"""
鸢尾花
"""
import pandas as pd
'''
训练集
测试集
'''
train_data = pd.read_excel(r'/Users/dx/Desktop/Python数据分析与机器学习/7.KNN算法/鸢尾花案例/鸢尾花训练数据.xlsx')
test_data = pd.read_excel(r'/Users/dx/Desktop/Python数据分析与机器学习/7.KNN算法/鸢尾花案例/鸢尾花测试数据.xlsx')
'''
处理数据
数据分离
'''
train_data.columns
train_x = train_data[['萼片长(cm)', '萼片宽(cm)', '花瓣长(cm)', '花瓣宽(cm)']]
train_y = train_data[['类型_num']]
'''
数据标准化
Z-Score标准化
'''
from sklearn.preprocessing import scale
data = pd.DataFrame()
data['萼片长标准化'] = scale(train_x['萼片长(cm)'])
data['萼片宽标准化'] = scale(train_x['萼片宽(cm)'])
data['花瓣长标准化'] = scale(train_x['花瓣长(cm)'])
data['花瓣宽标准化'] = scale(train_x['花瓣宽(cm)'])
'''
使用sklearn中的knn模块
'''
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=1)
knn.fit(data,train_y)
knn.score(data, train_y)
train_predicted = knn.predict(data)
'''
绘制混淆矩阵并可视化
'''
from sklearn import metrics
print(metrics.classification_report(train_y, train_predicted))
def cm_plot(y,yp):
from sklearn.metrics import confusion_matrix
import matplotlib.pyplot as plt
cm = confusion_matrix(y, yp)
plt.matshow(cm, cmap=plt.cm.Blues)
plt.colorbar()
for x in range(len(cm)):
for y in range(len(cm)):
plt.annotate(cm[x,y],xy=(y,x),horizontalalignment='center',
verticalalignment='center')
plt.ylabel('True label')
plt.xlabel('Predicted label')
return plt
cm_plot(train_y,train_predicted).show()
'''
使用测试集测试
'''
test_data.columns
test_x = train_data[['萼片长(cm)', '萼片宽(cm)', '花瓣长(cm)', '花瓣宽(cm)']]
test_y = train_data[['类型_num']]
#Z标准化
data_test = pd.DataFrame()
data_test['萼片长标准化'] = scale(test_x['萼片长(cm)'])
data_test['萼片宽标准化'] = scale(test_x['萼片宽(cm)'])
data_test['花瓣长标准化'] = scale(test_x['花瓣长(cm)'])
data_test['花瓣宽标准化'] = scale(test_x['花瓣宽(cm)'])
#使用测试集预测结果
test_predicted = knn.predict(data_test)
#预测概率
test_predicted_pr = knn.predict_proba(data_test)
#绘制混淆矩阵并可视化
print(metrics.classification_report(test_y,test_predicted))
cm_plot(test_y,test_predicted).show()
女性约会对象分类(多分类)
"""
女性约会对象分类(多分类)
"""
import pandas as pd
def cm_plot(y,yp):
from sklearn.metrics import confusion_matrix
import matplotlib.pyplot as plt
cm = confusion_matrix(y, yp)
plt.matshow(cm, cmap=plt.cm.Blues)
plt.colorbar()
for x in range(len(cm)):
for y in range(len(cm)):
plt.annotate(cm[x,y],xy=(y,x),horizontalalignment='center',
verticalalignment='center')
plt.ylabel('True label')
plt.xlabel('Predicted label')
return plt
'''
数据预处理
1:不喜欢
2:一般魅力
3:极具魅力
'''
data = pd.read_csv(r'/Users/dx/Desktop/Python数据分析与机器学习/7.KNN算法/KNN对女性约会对象分类案例/dating.txt',
sep = '\t')
data.head()
'''
数据标准化
'''
from sklearn.preprocessing import StandardScaler
scale = StandardScaler()
data['每年获得的飞行常客里程数'] = scale.fit_transform(data[['每年获得的飞行常客里程数']])
data['玩视频游戏所消耗的时间百分比'] = scale.fit_transform(data[['玩视频游戏所消耗的时间百分比']])
data['每周消费的冰淇淋公升数'] = scale.fit_transform(data[['每周消费的冰淇淋公升数']])
'''
数据切分
'''
from sklearn.model_selection import train_test_split
X_whole = data.drop('类别', axis = 1)
y_whole = data.类别
x_train, x_test, y_train,y_test = \
train_test_split(X_whole, y_whole, test_size = 0.2, random_state = 0)
'''
使用sklearn中的KNN模块
'''
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors= 13)
knn.fit(x_train,y_train)
knn.score(x_train,y_train)
train_predicted = knn.predict(x_train)
#绘制混淆矩阵,并可视化
from sklearn import metrics
print(metrics.classification_report(y_train,train_predicted))
cm_plot(y_train,train_predicted).show()
'''
使用测试集数据进行预测
'''
test_predicted = knn.predict(x_test)
print(metrics.classification_report(y_test,test_predicted))
cm_plot(y_test,test_predicted)
上一篇: 我的python之旅呀-09异常处理
下一篇: 数据库10大安全工具盘点