KNN简单介绍
-
KNN是分类算法,用于解决分类问题
-
KNN
算法怎么找到邻居的呢?- 对电脑而言,我们给给了一堆数据,它会去计算所有点的距离并然后排序!选择距离比较小的k个点!
-
KNN算法,比较耗费时间,要求数据量不能太大,时间复杂度空间复杂度,比较大。
KNN怎么优化
修改超参数
knn = KNeighborsClassifier(n_neighbors=5, weights='distance', p=2)
-
n_neighbors
:邻居数量,默认是5个- 邻居数量给的时候要小于样本数量的开平方: 总 样 本 数 量 \sqrt{总样本数量} 总样本数量
-
weights
:权重uniform
:每个样本的权重都一样(默认参数)distance
:根据距离的远近来判定获得的权重
-
p=2
p=2
:欧式距离(默认)p=1
:曼哈顿距离
-
数据预处理提高准确率
- 由于特征本身表达方式(度量衡)的原因而导致在绝对数值上的小数据被大数据“吃掉”的情况。影响。
- 这个时候我们需要做的就是对抽取出来的数据(features vector)进行归一化处理,以保证每个特征被分类器平等对待
- max-min归一化:将数值变成0~1之间
-
x
n
o
r
m
a
l
i
z
a
t
i
o
n
=
x
−
x
.
m
i
n
(
)
x
.
m
a
x
(
)
−
x
.
m
i
n
(
)
x_{normalization}=\frac{x-x.min()}{x.max()-x.min()}
xnormalization=x.max()−x.min()x−x.min()
- x n o r m a l i z a t i o n = x − x . m i n ( a x i s = 0 ) x . m a x ( a x i s = 0 ) − x . m i n ( a x i s = 0 ) x_{normalization}=\frac{x-x.min(axis=0)}{x.max(axis=0)-x.min(axis=0)} xnormalization=x.max(axis=0)−x.min(axis=0)x−x.min(axis=0)
-
x
n
o
r
m
a
l
i
z
a
t
i
o
n
=
x
−
x
.
m
i
n
(
)
x
.
m
a
x
(
)
−
x
.
m
i
n
(
)
x_{normalization}=\frac{x-x.min()}{x.max()-x.min()}
xnormalization=x.max()−x.min()x−x.min()
- z-score归一化
-
x
n
o
r
m
a
l
i
z
a
t
i
o
n
=
x
−
μ
σ
x_{normalization}=\frac{x-\mu}{\sigma}
xnormalization=σx−μ,
μ
\mu
μ是平均值,
σ
\sigma
σ 是标准差
- x n o r m a l i z a t i o n = x − x . m e a n ( a x i s = 0 ) x . s t d ( a x i s = 0 ) x_{normalization}=\frac{x-x.mean(axis=0)}{x.std(axis=0)} xnormalization=x.std(axis=0)x−x.mean(axis=0)
-
x
n
o
r
m
a
l
i
z
a
t
i
o
n
=
x
−
μ
σ
x_{normalization}=\frac{x-\mu}{\sigma}
xnormalization=σx−μ,
μ
\mu
μ是平均值,
σ
\sigma
σ 是标准差
- sigmiod归一化
-
x
n
o
r
m
a
l
i
z
a
t
i
o
n
=
1
1
+
e
−
x
x_{normalization} = \frac{1}{1 + e^{-x}}
xnormalization=1+e−x1
- 当我们的数据特别大的时候就会趋近于1,特别小的时候他就会趋近于0
- 所以,当有特别大或者特别小的数字的时候不适用sigmoid归一化
-
x
n
o
r
m
a
l
i
z
a
t
i
o
n
=
1
1
+
e
−
x
x_{normalization} = \frac{1}{1 + e^{-x}}
xnormalization=1+e−x1
3 σ \sigma σ准则
-
∣
∣
X
−
μ
∣
∣
>
3
σ
||X-\mu|| > 3\sigma
∣∣X−μ∣∣>3σ,
μ
\mu
μ是平均值,
σ
\sigma
σ 是标准差
- n p . a b s ( X − X . m e a n ( a x i s = 0 ) ) > 3 ∗ X . s t d ( a x i s = 0 ) np.abs(X-X.mean(axis=0)) > 3*X.std(axis=0) np.abs(X−X.mean(axis=0))>3∗X.std(axis=0)
cond = np.abs(X-X.mean(axis=0)) < 3*X.std(axis=0) # 一行中全部都是正常值才是正常值 cond.all(axis=1) # 获取正常值 X[cond2]