1.统计学习方法 | 第3章 k邻近法近邻法是基本且简单的分类与回归方法。统计学习方法 | 第3章 k邻近法近邻法的基本做法是:对给定的训练实例点和输入实例点,首先确定输入实例点的统计学习方法 | 第3章 k邻近法个最近邻训练实例点,然后利用这统计学习方法 | 第3章 k邻近法个训练实例点的类的多数来预测输入实例点的类。

2.统计学习方法 | 第3章 k邻近法近邻模型对应于基于训练数据集对特征空间的一个划分。统计学习方法 | 第3章 k邻近法近邻法中,当训练集、距离度量、统计学习方法 | 第3章 k邻近法值及分类决策规则确定后,其结果唯一确定。

3.统计学习方法 | 第3章 k邻近法近邻法三要素:距离度量、统计学习方法 | 第3章 k邻近法值的选择和分类决策规则。常用的距离度量是欧氏距离及更一般的pL距离。统计学习方法 | 第3章 k邻近法值小时,统计学习方法 | 第3章 k邻近法近邻模型更复杂;统计学习方法 | 第3章 k邻近法值大时,统计学习方法 | 第3章 k邻近法近邻模型更简单。统计学习方法 | 第3章 k邻近法值的选择反映了对近似误差与估计误差之间的权衡,通常由交叉验证选择最优的统计学习方法 | 第3章 k邻近法

常用的分类决策规则是多数表决,对应于经验风险最小化。

4.统计学习方法 | 第3章 k邻近法近邻法的实现需要考虑如何快速搜索k个最近邻点。kd树是一种便于对k维空间中的数据进行快速检索的数据结构。kd树是二叉树,表示对统计学习方法 | 第3章 k邻近法维空间的一个划分,其每个结点对应于统计学习方法 | 第3章 k邻近法维空间划分中的一个超矩形区域。利用kd树可以省去对大部分数据点的搜索, 从而减少搜索的计算量。

 

距离度量

 

设特征空间统计学习方法 | 第3章 k邻近法统计学习方法 | 第3章 k邻近法维实数向量空间 ,统计学习方法 | 第3章 k邻近法,统计学习方法 | 第3章 k邻近法,统计学习方法 | 第3章 k邻近法 ,则:统计学习方法 | 第3章 k邻近法,统计学习方法 | 第3章 k邻近法统计学习方法 | 第3章 k邻近法距离定义为:

统计学习方法 | 第3章 k邻近法

  • 统计学习方法 | 第3章 k邻近法 曼哈顿距离
  • 统计学习方法 | 第3章 k邻近法 欧氏距离
  • 统计学习方法 | 第3章 k邻近法 闵式距离minkowski_distance
In [1]:
import math
from itertools import combinations
In [2]:
def L(x, y, p=2):
    # x1 = [1, 1], x2 = [5,1]
    if len(x) == len(y) and len(x) > 1:
        sum = 0
        for i in range(len(x)):
            sum += math.pow(abs(x[i] - y[i]), p)
        return math.pow(sum, 1 / p)
    else:
        return 0
 

课本例3.1

In [3]:
x1 = [1, 1]
x2 = [5, 1]
x3 = [4, 4]
In [4]:
# x1, x2
for i in range(1, 5):
    r = {'1-{}'.format(c): L(x1, c, p=i) for c in [x2, x3]}
    print(min(zip(r.values(), r.keys())))
 
(4.0, '1-[5, 1]')
(4.0, '1-[5, 1]')
(3.7797631496846193, '1-[4, 4]')
(3.5676213450081633, '1-[4, 4]')
 

python实现,遍历所有数据点,找出统计学习方法 | 第3章 k邻近法个距离最近的点的分类情况,少数服从多数

In [5]:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from collections import Counter
In [6]:
# data
iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['label'] = iris.target
df.columns = ['sepal length', 'sepal width', 'petal length', 'petal width', 'label']
# data = np.array(df.iloc[:100, [0, 1, -1]])
In [7]:
df
Out[7]:
  sepal length sepal width petal length petal width label
0 5.1 3.5 1.4 0.2 0
1 4.9 3.0 1.4 0.2 0
2 4.7 3.2 1.3 0.2 0
3 4.6 3.1 1.5 0.2 0
4 5.0 3.6 1.4 0.2 0
5 5.4 3.9 1.7 0.4 0
6 4.6 3.4 1.4 0.3 0
7 5.0 3.4 1.5 0.2 0
8 4.4 2.9 1.4 0.2 0
9 4.9 3.1 1.5 0.1 0
10 5.4 3.7 1.5 0.2 0
11 4.8 3.4 1.6 0.2 0
12 4.8 3.0 1.4 0.1 0
13 4.3 3.0 1.1 0.1 0
14 5.8 4.0 1.2 0.2 0
15 5.7 4.4 1.5 0.4 0
16 5.4 3.9 1.3 0.4 0
17 5.1 3.5 1.4 0.3 0
18 5.7 3.8 1.7 0.3 0
19 5.1 3.8 1.5 0.3 0
20 5.4 3.4 1.7 0.2 0
21 5.1 3.7 1.5 0.4 0
22 4.6 3.6 1.0 0.2 0
23 5.1 3.3 1.7 0.5 0
24 4.8 3.4 1.9 0.2 0
25 5.0 3.0 1.6 0.2 0
26 5.0 3.4 1.6 0.4 0
27 5.2 3.5 1.5 0.2 0
28 5.2 3.4 1.4 0.2 0
29 4.7 3.2 1.6 0.2 0
... ... ... ... ... ...
120 6.9 3.2 5.7 2.3 2
121 5.6 2.8 4.9 2.0 2
122 7.7 2.8 6.7 2.0 2
123 6.3 2.7 4.9 1.8 2
124 6.7 3.3 5.7 2.1 2
125 7.2 3.2 6.0 1.8 2
126 6.2 2.8 4.8 1.8 2
127 6.1 3.0 4.9 1.8 2
128 6.4 2.8 5.6 2.1 2
129 7.2 3.0 5.8 1.6 2
130 7.4 2.8 6.1 1.9 2
131 7.9 3.8 6.4 2.0 2
132 6.4 2.8 5.6 2.2 2
133 6.3 2.8 5.1 1.5 2
134 6.1 2.6 5.6 1.4 2
135 7.7 3.0 6.1 2.3 2
136 6.3 3.4 5.6 2.4 2
137 6.4 3.1 5.5 1.8 2
138 6.0 3.0 4.8 1.8 2
139 6.9 3.1 5.4 2.1 2
140 6.7 3.1 5.6 2.4 2
141 6.9 3.1 5.1 2.3 2
142 5.8 2.7 5.1 1.9 2
143 6.8 3.2 5.9 2.3 2
144 6.7 3.3 5.7 2.5 2
145 6.7 3.0 5.2 2.3 2
146 6.3 2.5 5.0 1.9 2
147 6.5 3.0 5.2 2.0 2
148 6.2 3.4 5.4 2.3 2
149 5.9 3.0 5.1 1.8 2

150 rows × 5 columns

In [8]:
plt.scatter(df[:50]['sepal length'], df[:50]['sepal width'], label='0')
plt.scatter(df[50:100]['sepal length'], df[50:100]['sepal width'], label='1')
plt.xlabel('sepal length')
plt.ylabel('sepal width')
plt.legend()
Out[8]:
<matplotlib.legend.Legend at 0x2c56f7f64e0>
 
统计学习方法 | 第3章 k邻近法
In [9]:
data = np.array(df.iloc[:100, [0, 1, -1]])
X, y = data[:,:-1], data[:,-1]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
In [10]:
class KNN:
    def __init__(self, X_train, y_train, n_neighbors=3, p=2):
        """
        parameter: n_neighbors 临近点个数
        parameter: p 距离度量
        """
        self.n = n_neighbors
        self.p = p
        self.X_train = X_train
        self.y_train = y_train

    def predict(self, X):
        # 取出n个点
        knn_list = []
        for i in range(self.n):
            dist = np.linalg.norm(X - self.X_train[i], ord=self.p)
            knn_list.append((dist, self.y_train[i]))

        for i in range(self.n, len(self.X_train)):
            max_index = knn_list.index(max(knn_list, key=lambda x: x[0]))
            dist = np.linalg.norm(X - self.X_train[i], ord=self.p)
            if knn_list[max_index][0] > dist:
                knn_list[max_index] = (dist, self.y_train[i])

        # 统计
        knn = [k[-1] for k in knn_list]
        count_pairs = Counter(knn)
#         max_count = sorted(count_pairs, key=lambda x: x)[-1]
        max_count = sorted(count_pairs.items(), key=lambda x: x[1])[-1][0]
        return max_count

    def score(self, X_test, y_test):
        right_count = 0
        n = 10
        for X

相关文章:

  • 2021-04-02
  • 2021-12-14
  • 2021-05-18
  • 2021-04-25
  • 2021-12-20
  • 2021-06-14
  • 2021-05-21
  • 2021-12-02
猜你喜欢
  • 2021-05-17
  • 2022-02-04
  • 2021-05-19
  • 2021-08-20
  • 2021-05-27
  • 2021-11-30
  • 2022-01-15
相关资源
相似解决方案