dirty 发表于 2024-7-13 18:30

《机器学习算法与实现 —— Python编程与应用实例》环境搭建与k最近邻算法

<p>&nbsp; &nbsp; &nbsp; 本书第二、三章讲Python语言基础及常用库,这里将本书环境搭建部分做下讲解,在涉及到k最近邻算法部分涉及库部分自行安装,并将该算法进行演示。</p>

<p>&nbsp;</p>

<p><strong><span style="color:#0000ff;">一.环境搭建</span></strong></p>

<p>&nbsp; &nbsp; &nbsp; Anaconda集成大部分Python软件包,使用方便。这里使用国内镜像,&nbsp;<a href="https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/">https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/</a>&nbsp; ,下载完成后windows下安装,安装过程中选择自动加入环境变量选项。</p>

<p>&nbsp; &nbsp; &nbsp; 打开控制台,输入conda --version查询版本,是否安装上。生成一个新环境 conda create -n &lt;your_env&gt; ,激活虚拟运行环境conda activate &lt;your_env&gt;,激活成功后前面带括号工程名,如下</p>

<div style="text-align: center;"></div>

<div style="text-align: center;">图1:conda工程激活</div>

<p>&nbsp; &nbsp; &nbsp; 此外,也可在Pycharm里建立conda环境,如下所示,绿色框内一个为在windows控制台下创建,另一个为PyCharm下创建。</p>

<div style="text-align: center;"></div>

<div style="text-align: center;">图2:PyCharm下创建Conda工程</div>

<p>&nbsp; &nbsp; &nbsp; 此外,安装包可在pycharm Teiminal控制台命令安装或者设置里安装,如下</p>

<div style="text-align: center;"></div>

<div style="text-align: center;">图3:资源包安装选择</div>

<p>&nbsp; &nbsp; &nbsp; 到这里,环境基本搭建完成,根据需要安装资源包。</p>

<p>&nbsp;</p>

<p><strong><span style="color:#0000ff;">二.k最近邻算法</span></strong></p>

<p>&nbsp; &nbsp; &nbsp; k最近邻算法是机器学习中的基础算法之一,它既能用于分类,又能用于回归。k最近邻算法的中心思想是,通过度量给定样本到训练数据集中所有样本的特征距离,将与给定样本特征距离最近的k个样本中出现次数最多的类别指定为该样本最优估计的类别。</p>

<p>&nbsp; &nbsp; &nbsp; k最近邻算法的策略如下:有一堆已知类别的样本,当一个新样本进入时,依次求它与训练样本中的每个样本点的距离,然后挑选训练样本中最近的 k个点,通过被选样本所属的类别来决定待分配样本所属的类别。</p>

<div style="text-align: center;">
<div style="text-align: center;"></div>
</div>

<div style="text-align: center;">图4:k最近邻算法的基本原理</div>

<p>&nbsp; &nbsp; &nbsp; 生成训练数据和测试数据,代码如下:</p>

<pre>
<code>import numpy as np
import matplotlib.pyplot as plt

# 生成模拟数据
np.random.seed(314)

data_size1 = 100

x1 = np.random.randn(data_size1, 2) + np.array()
y1 =

data_size2 = 100

x2 = np.random.randn(data_size2, 2) * 2 + np.array()
y2 =

# 合并生成全部数据
x = np.concatenate((x1, x2), axis=0)
y = np.concatenate((y1, y2), axis=0)

data_size_all = data_size1 + data_size2
shuffled_index = np.random.permutation(data_size_all)
x = x
y = y

# 分割训练集和测试集
split_index = int(data_size_all * 0.7)
x_train = x[:split_index]
y_train = y[:split_index]
x_test = x
y_test = y


# 绘制结果
plt.scatter(x_train[:,0], x_train[:,1], c= y_train, marker='.')
plt.rcParams['font.sans-serif']=['SimHei']
plt.title("训练数据")
plt.show()

plt.scatter(x_test[:,0], x_test[:,1], c= y_test, marker='.')
plt.rcParams['font.sans-serif']=['KaiTi']
plt.title("测试数据")
plt.show()
</code></pre>

<p>&nbsp; &nbsp; &nbsp; 运行后可视化图如下:</p>

<div style="text-align: center;"></div>

<div style="text-align: center;">图5:训练数据与测试数据</div>

<p>&nbsp; &nbsp; &nbsp; k最近邻算法的实现主要分为三步:计算距离、按距离取样本点和投票决定类别。</p>

<p>●kNN_distance()函数:计算测试数据与各个训练数据之间的距离。在kNN 算法中,通过计算出对象之间的距离作为各个对象之间的非相似性指标,可以避免对象之间的匹配问题。</p>

<p>●kNN_vote()函数:确定k个点中不同类别的出现频率,返回其中出现频率最高的类別作为测试数据的预测类别。</p>

<p>●kNN_predict()函数:调用kNN_distance()函数计算距离,对距离排序后,选取距离最小的k个点,再调用kNN_vote()函数得到预测类别。</p>

<p>KNN算法代码实现如下:</p>

<pre>
<code>def kNN_distance(v1, v2):
    '''计算两个多维向量的距离'''
    return np.sum(np.square(v1 - v2))

def kNN_vote(ys):
    '''根据ys的类别, 挑选类别最多的一类作为输出'''
    vote_dict = {}
    for y in ys:
      if y not in vote_dict.keys():
            vote_dict = 1
      else:
            vote_dict += 1

    # 找到类别最多的一类,也可以用循环遍历的方式来找,这里使用了max函数来直接返回值最大的键
    max_key =max(vote_dict, key=lambda k: vote_dict)
    return max_key

def kNN_predict(x, train_x, train_y, k=3):
    '''
    针对指定的数据进行分类,参数:
    x - 输入的待分类样本
    train_x - 训练数据的样本
    train_y - 训练数据的标签
    k - 最近邻的样本数
    '''
    dist_arr = ) for j in range(len(train_x))]
    sorted_index = np.argsort(dist_arr)
    top_k_index = sorted_index[:k]
    ys = train_y
    return kNN_vote(ys)

'''对训练集的样本进行分类'''
y_train_test = ,x_train, y_train) for i in range(len(x_train))]
print(y_train_test)

# 统计训练精度
n_correct = 0
for i in range(len(x_train)):
    if y_train_test == y_train:
      n_correct += 1

accuracy = n_correct / len(x_train) * 100.0
print("Train Accuracy: %f%%" % accuracy)

#对测试集的样本进行分类
y_train_test = , x_train, y_train) for i in range(len(x_test))]

# 统计训练精度
n_correct = 0
for i in range(len(x_test)):
    if y_train_test == y_test:
      n_correct += 1

accuracy = n_correct / len(x_test) * 100.0
print("Test Accuracy: %f%%" % accuracy)
</code></pre>

<p>&nbsp; &nbsp; &nbsp; 算法对训练集和测试集进行预测,并计算精度:代码运行结果如下:</p>

<div style="text-align: center;"></div>

<div style="text-align: center;">图6:KNN算法运行</div>

<p>&nbsp; &nbsp; &nbsp; 拓展认识学习:动手编程实现kNN 分类器能够提高自己的算法思维与编程能力,但是考虑的细节不多。①未优化算法;②通用性较差。传统机器学习领域中著名的scikit-leamn&quot;(也称skleamn),这个库包括了大都分机器学习方法,涵盖了几乎所有的主流机器学习算法,是基于Python语言的开源机器学习工具包,可通过 NumPy、SciPy 和 Matplotlib等 Python 数值计算库高效地实现算法应用。</p>

<p>&nbsp;</p>

<p>&nbsp; &nbsp; &nbsp; 至此,对k最近邻算法有了一个较深入的了解与学习。</p>

<p>&nbsp;</p>
页: [1]
查看完整版本: 《机器学习算法与实现 —— Python编程与应用实例》环境搭建与k最近邻算法