机器学习小记
用无监督机器学习识别数据集的模式和结构。
linear regression
http://ufldl.stanford.edu/tutorial/supervised/LinearRegression/
类似于曲线拟合或最小二乘。
逻辑回归
注意区分于线性回归,用于分类而非回归。
k-means
将样本集划分为k个簇,簇内点紧密在一起,簇间的距离尽量大。最小化平方误差E
E
=
∑
i
=
1
k
∑
x
∈
C
i
∥
x
−
μ
i
∥
2
2
E = \sum^k_{i=1}\sum_{x\in C_i}\|x-\mu_i\|^2_2
E=i=1∑kx∈Ci∑∥x−μi∥22
μ
i
\mu_i
μi是第i个簇的均值,即质心。
μ
i
=
1
∣
C
i
∣
∑
x
∈
C
i
x
\mu_i = \frac{1}{|C_i|}\sum_{x\in C_i}x
μi=∣Ci∣1x∈Ci∑x
算法流程,
- 选择适合的k值
- 选择合适的k个质心;初始化k个簇为空集
- 求各个样本点与每个质心的距离,各点加入距离最短的那个质心所对应的簇
- 更新各个簇的质心
- 若达到最大迭代次数或质心不变,则输出结果;否则转到步骤3
如何选择初始的质心:随机选择一个点做质心,再从余下点中找与已选质心最近距离中较大的作为新质心。
减少计算距离的次数:两个簇的质心
j
1
j_1
j1,
j
2
j_2
j2,若一点
x
x
x
2
D
(
x
,
j
1
)
≤
D
(
j
1
,
j
2
)
2D(x,j_1)\leq D(j_1,j_2)
2D(x,j1)≤D(j1,j2)
则
D
(
x
,
j
1
)
≤
D
(
x
,
j
2
)
D(x,j_1)\leq D(x,j_2)
D(x,j1)≤D(x,j2)
另一方面,
D
(
x
,
j
1
)
≥
m
a
x
{
0
,
D
(
x
,
j
2
)
−
D
(
j
1
,
j
2
)
}
D(x,j_1)\geq max\{0, D(x,j_2)-D(j_1,j_2)\}
D(x,j1)≥max{0,D(x,j2)−D(j1,j2)}
- 结果评价
同质性得分:簇内的数据点只属于一个类的程度,0-1,1表示完全属于一个类,我认为是分类结果是最好的。
有效性测度:同质性得分和完整性得分的调和平均数。
调整兰德指数:预测结果和真实标签的相关性。
上述三指标都需要数据标注。
轮廓系数:
s = b − a m a x ( a , b ) s=\frac{b-a}{max(a,b)} s=max(a,b)b−a
a:样本和簇内其他所有点的平均距离
b:样本和最近邻簇内所有数据点的平均距离
K Nearest Neighbor
给定查询点及正整数K,从数据集中找到距离查询点最近的K个数据。
SVM
有硬、软、核形式的SVM
a
r
g
m
i
n
∣
∣
w
∣
∣
2
,
任意
i
有
y
i
(
<
w
T
,
x
i
>
+
b
)
>
1
argmin{||w||^2}, 任意 i 有y_i(<w^T,x_i> + b) \gt 1
argmin∣∣w∣∣2,任意i有yi(<wT,xi>+b)>1
核方法,是把输入用带有参数的函数变换后求内积,转换为特征空间上的线性分类问题,即“点积被替换为核函数”。
常用k阶多项式核、高斯核特征空间。
∑
i
=
1
m
α
i
x
T
x
(
i
)
\sum_{i=1}^{m}\alpha_ix^Tx^{(i)}
i=1∑mαixTx(i)
SOM(自组织映射)
自组织映射,是一类数据减维的方法,典型方法是主成分分析。
自组织映射作为减维和可视化方法,自有独到之处。
import matplotlib.pyplot as plt
from sklearn.dataset import load_iris
from sklearn.decomposition import PCA
from mpl_toolkits.mplot3d import Axes3D
iris = load_iris()
X = iris.data
labels = iris.target
fig = plt.figure(figsize=(4, 3))
plt.clf()
ax = Axes3D(fig, rect=[0, 0, 0.95, 1], elev=30, azim=130)
plt.cla()
b_pca = PCA(n_components=3)
b_pca.fit(X)
X = b_pca.transform(X)
for n, l in [("Setosa", 0), ("Versicolour", 1), ("Virginica", 2)]:
#discrete label by labels == i
ax.scatter(X[labels == l, 0], X[labels == l, 1], X[labels == l, 2], alpha=0.5, label=n)
plt.legend()
plt.show()