机器学习算法_01 KNN算法

"""
样本集
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)) #模型评估

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值