机器学习1

一、 题目描述

原生python实现knn分类算法,用鸢尾花数据集进行训练并且测试

二、 算法设计

KNN是通过测量不同特征值之间的距离进行分类。它的的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。K通常是不大于20的整数。KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。
在KNN中,通过计算对象间距离来作为各个对象之间的非相似性指标,避免了对象之间的匹配问题,在这里距离一般使用欧氏距离或曼哈顿距离:
在我编写的knn算法中采用了欧式距离进行比较测试集与训练集之间的非相似性指标,在将二者之间的距离进性运算之后,选出距离测试集最近的k个邻居,并且利用投票机制,进行判断测试集的所属类别,

三、有注释的源代码

import numpy as np
from math import sqrt
from collections import Counter
class knn:
def init(self, k):
“”“初始化kNN分类器”""
assert k >= 1, “k must be valid”
self.k = k
self._X_train = None
self._y_train = None
def fit(self, X_train, y_train):
“”“根据训练数据集X_train和y_train训练kNN分类器”""
assert X_train.shape[0] == y_train.shape[0],
“the size of X_train must be equal to the size of y_train”
assert self.k <= X_train.shape[0],
“the size of X_train must be at least k.”
self._X_train = X_train
self._y_train = y_train
return self
def predict(self, X_predict):
“”“给定待预测数据集X_predict,返回表示X_predict的结果向量”""
assert self._X_train is not None and self._y_train is not None,
“must fit before predict!”
assert X_predict.shape[1] == self._X_train.shape[1],
“the feature number of X_predict must be equal to X_train”
y_predict = [self._predict(x) for x in X_predict]
return np.array(y_predict)
def _predict(self, x):
“”“给定单个待预测数据x,返回x的预测结果值”""
assert x.shape[0] == self._X_train.shape[1],
“the feature number of x must be equal to X_train”
#j计算欧氏距离
distances = [sqrt(np.sum((x_train - x) ** 2))
for x_train in self._X_train]
nearest = np.argsort(distances)
topK_y = [self._y_train[i] for i in nearest[:self.k]]
#进行投票机制
votes = Counter(topK_y)
return votes.most_common(1)[0][0]
#选择k紧邻k的个数
def repr(self):
return “KNN(k=%d)” % self.k
将鸢尾花数据集进行分类
import numpy as np

def train_test_split(X,y,test_ratio=0.2,seed=None):
“”“将数据 X 和 y 按照test_ratio分割成X_train, X_test, y_train, y_test”""
assert X.shape[0]==y.shape[0]
assert 0.0<=test_ratio<=1.0
if seed:
np.random.seed(seed)
shuffle_indexes = np.random.permutation(len(X))
test_size = int(len(X)*test_ratio)
test_indexes = shuffle_indexes[:test_size]
train_indexes = shuffle_indexes[test_size:]
X_train = X[train_indexes]
y_train = y[train_indexes]
X_test = X[test_indexes]
y_test = y[test_indexes]
return X_train,X_test,y_train,y_test
调用函数进行进行计算
import numpy as np
def train_test_split(X,y,test_ratio=0.2,seed=None):
“”“将数据 X 和 y 按照test_ratio分割成X_train, X_test, y_train, y_test”""
assert X.shape[0]==y.shape[0]
assert 0.0<=test_ratio<=1.0
if seed:
np.random.seed(seed)
shuffle_indexes = np.random.permutation(len(X))
test_size = int(len(X)*test_ratio)
test_indexes = shuffle_indexes[:test_size]
train_indexes = shuffle_indexes[test_size:]
X_train = X[train_indexes]
y_train = y[train_indexes]
X_test = X[test_indexes]
y_test = y[test_indexes]
return X_train,X_test,y_train,y_test

四、程序的运行及调试

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五、总结

在进行代码的编写时,由于对python的运用不是特别的熟悉导致在进行编写时出了很多的问题,例如在python中对于缩进的要求十分的严格在编写代码时由于对有的首字符没有缩进而引起了很多的问题。同时在导包时,开始计划利用 pycharm来进行导包结果在pycharm的pip文档中没有对应的包,最后采取的将anaconda与pycharm连接来使用一些对应的包。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值