"""
样本集
X=[[1,1],[1,1.5],[2,2],[4,3],[4,4]]
y=['A','A','A','B','B']
测试样本
t=[3,2]
设K=3
"""
import numpy as np
import operator
def knn_class(X,y,test,K):
"""
:param X: 样本集
:param y:样本类别
:param test:测试样本
:param K:
:return:
"""
X=np.array(X)
test=np.array(test)
# 1.计算测试样本到所有训练样本之间的距离
distance=np.sum((X - test) ** 2, axis=1) ** 0.5
print(distance)
# 2 对距离进行排序,从小到大的顺序
index=np.argsort(distance)
print(index)
#3 取最近的k个临近 取类别个数
print(y)
classCount={}
for i in range(K):
label=y[index[i]]
classCount[label]=classCount.get(label,0)+1
print(classCount.items())
print(classCount.items())
#4 投票
return sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)[0][0]
if __name__ == '__main__':
X = [[1, 1], [1, 1.5], [2, 2], [4, 3], [4, 4]]
y = ['A', 'A', 'A', 'B', 'B']
t = [3, 2]
K = 3
pred=knn_class(X,y,t,K)
print(pred)
输出:
D:\ProgramData\Anaconda3\envs\data_analys\python.exe D:/worke/pycode/PCA/20190630/knn.py
[2.23606798 2.06155281 1. 1.41421356 2.23606798]
[2 3 1 0 4]
['A', 'A', 'A', 'B', 'B']
dict_items([('A', 2), ('B', 1)])
dict_items([('A', 2), ('B', 1)])
A
Process finished with exit code 0
调用sklearn库实现KNN
from sklearn.neighbors import KNeighborsClassifier
X = [[1, 1], [1, 1.5], [2, 2], [4, 3], [4, 4]]
Y= ['A', 'A', 'A', 'B', 'B']
t = [[3, 2]]
K = 3
knn=KNeighborsClassifier(n_neighbors=3)
# 训练模型 fit() 的是二维的
knn.fit(X,Y)
# 预测 predict的X也是二维的
pred=knn.predict(t)
print(pred)
print(knn.predict_proba(t))
输出:
D:\ProgramData\Anaconda3\envs\data_analys\python.exe D:/worke/pycode/PCA/20190630/sk_knn.py
['A']
[[0.66666667 0.33333333]]
Process finished with exit code 0
项目案列:
项目案例: 优化约会网站的配对效果
项目概述
海伦使用约会网站寻找约会对象。经过一段时间之后,她发现曾交往过三种类型的人:
不喜欢的人
魅力一般的人
极具魅力的人
她希望:
工作日与魅力一般的人约会
周末与极具魅力的人约会
不喜欢的人则直接排除掉
现在她收集到了一些约会网站未曾记录的数据信息,这更有助于匹配对象的归类。
海伦把这些约会对象的数据存放在文本文件 datingTestSet.txt 中,总共有 1000 行。海伦约会的对象主要包含以下 3 种特征:
每年获得的飞行常客里程数
玩视频游戏所耗时间百分比
每周消费的冰淇淋公升数
文本文件数据格式如下:
40920 8.326976 0.953952 3
14488 7.153469 1.673904 2
26052 1.441871 0.805124 1
75136 13.147394 0.428964 1
38344 1.669788 0.134296 1
数据集:部分
40920 8.326976 0.953952 3
14488 7.153469 1.673904 2
26052 1.441871 0.805124 1
75136 13.147394 0.428964 1
38344 1.669788 0.134296 1
72993 10.141740 1.032955 1
35948 6.830792 1.213192 3
42666 13.276369 0.543880 3
67497 8.631577 0.749278 1
35483 12.273169 1.508053 3
50242 3.723498 0.831917 1
63275 8.385879 1.669485 1
代码实现:
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score #准确率
import numpy as np
dataset=np.loadtxt("datingTestSet.txt",delimiter="\t")
X=dataset[:,0:3]
y=dataset[:,3]
# print(y)
for k in range(3,50):
X_train, X_test, y_train, y_test =train_test_split(X,y,test_size=0.3,random_state=6)
knn=KNeighborsClassifier(n_neighbors=k)
knn.fit(X_train,y_train)
y_pred=knn.predict(X_test)
print(accuracy_score(y_pred,y_test)) #模型评估