无监督学习是机器学习中的一种方法,它主要用于从无标签数据中发现隐藏的模式和结构。
1、聚类算法
是一种无监督学习算法,用于将数据划分为不同的簇(聚类),相似的数据点被分配到同一个簇中。
(1)K-means算法:
知识点总结:
1)根据用户指定的簇数量K,选择随机的K个样本作为初始聚类中心。
2)通过计算每个样本与聚类中心的距离,将样本分配给最近的簇。
3)根据簇内样本的均值更新聚类中心,重复以上步骤直到聚类中心不再变化或达到最大迭代次数。
代码示例:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
np.random.seed(0)
X = np.random.rand(50,2)
kmeans = KMeans(n_clusters=3, random_state=0).fit(X)
colors = ['r', 'g', 'b']
markers = ['o', 's', 'D']
for i, (x,y) in enumerate(X):
plt.scatter(x, y, color=colors[kmeans.labels_[i]], marker=markers[kmeans.labels_[i]])
plt.show()
运行结果:
(2) DBSCAN算法
知识点总结:
1)定义一个半径r和邻居数目minPts来区分核心点、边界点和噪声点。
2)通过计算每个样本与其邻域内样本的密度来判断样本是否为核心点。
3)将核心点连接到密度可达的样本,形成一个簇,并将边界点分配给相应的簇。
4) 重复以上步骤直到所有样本都被访问过。
代码示例:
import numpy as np
from sklearn.cluster import DBSCAN
# 创建一些随机数据
X = np.random.rand(100, 2)
# 创建DBSCAN对象并拟合数据
dbscan = DBSCAN(eps=0.3, min_samples=5)
dbscan.fit(X)
# 打印每个数据点的簇标签
print(dbscan.labels_)
运行结果:
(3)层次聚类算法
知识点总结:
1)将每个样本看作一个初始簇。
2) 通过计算不同簇之间的距离(如最短距离、最长距离、平均距离等)合并相似的簇,形成新的簇。
3)不断合并最相似的簇,直到所有样本都被合并到一个簇中或达到预设的簇数量。
代码示例:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import AgglomerativeClustering
from sklearn.datasets import load_iris
# 加载数据集
iris = load_iris()
X = iris.data
# 设置层次聚类器
agg_clustering = AgglomerativeClustering(n_clusters=3, linkage='ward')
# 使用层次聚类器进行聚类
agg_clustering.fit(X)
# 绘制聚类结果图像
fig = plt.figure(figsize=(12, 10))
ax = fig.add_subplot(111, projection='3d')
colors = np.array(['r', 'g', 'b'])
ax.scatter(X[:, 0], X[:, 1], X[:, 2], c=colors[agg_clustering.labels_], s=60)
ax.set_xlabel('Sepal length')
ax.set_ylabel('Sepal width')
ax.set_zlabel('Petal length')
plt.show()
运行结果:
2. 关联规则学习(Association Rule Learning)
(1)Apriori算法
用于挖掘频繁项集和关联规则。通过迭代生成候选项集,并使用支持度和置信度来筛选频繁项集和关联规则。
支持度:是某个项集在所有数据项中出现的频率。
它可以形式化地表示为:
其中freq(X)表示包含X的记录数,|D|表示数据集D中记录的总数。
例如,假设有100个订单数据中有30个订单包含了牛奶和面包,那么牛奶和面包的支持度就是30%。
支持度常用于挖掘频繁项集,即根据一定支持度阈值筛选出出现频率高的项集,来寻找其中的规律或关联。因此,支持度越高,代表该项集出现的频率越高,其对于关联规则挖掘的重要性也就越大。
置信度(Confidence):是指数据集D中包含项集X 的记录中同时包含另一个项集Y的比例。
它可以形式化地表示为:
其中Supp(X∪Y)表示包含项集X和Y的记录数,Supp(X)表示包含项集X的记录数。
例如,假设有100个订单数据中有70个订单购买了牛奶,其中有60个订单同时购买了面包,那么购买了牛奶的订单同时购买了面包的置信度就是60÷70=85.7%。
置信度常用于挖掘关联规则,即在前提条件成立的情况下,探索结论的概率,以此来推断出它们之间的关系。因此,置信度越高,代表前提条件成立的情况下结论成立的概率越高,其对于关联规则挖掘的重要性也就越大。
代码示例:
from mlxtend.preprocessing import TransactionEncoder
from mlxtend.frequent_patterns import apriori, association_rules
import pandas as pd
# 准备数据集
dataset = [['A', 'B', 'C'], ['B', 'D'], ['B', 'E'], ['A', 'B', 'C', 'E'], ['B', 'D']]
te = TransactionEncoder()
te_ary = te.fit(dataset).transform(dataset)
df = pd.DataFrame(te_ary, columns=te.columns_)
# 计算频繁项集
frequent_itemsets = apriori(df, min_support=0.6, use_colnames=True)
# 计算关联规则
rules = association_rules(frequent_itemsets, metric="confidence", min_threshold=0.8)
print(frequent_itemsets)
print(rules)
结果:
support itemsets
0 0.6 (B)
1 0.6 (A, B)
2 0.6 (B,C)
3 0.6 (B, E)
antecedents consequents antecedent support consequent support support \
0 (A) (B) 0.4 0.6 0.4
1 (C) (B) 0.6 0.6 0.6
2 (E) (B) 0.4 0.6 0.4
confidence lift leverage conviction
0 1.000000 1.666667 0.16 inf
1 1.000000 1.666667 0.24 inf
2 1.000000 1.666667 0.16 inf
支持度和置信度的值越高,代表其对于关联规则挖掘的贡献越大,对于数据分析和决策制定也有更大的指导意义。
3. 降维算法(Dimensionality Reduction Algorithms)
(1)主成分分析(PCA)
主成分分析(PCA)是一种常见的数据降维方法,通过将高维数据映射到低维空间中,保留尽可能多的信息和方差,从而提高计算效率和模型性能。其主要思想是将原始数据转化为新的正交坐标系,使得数据在新坐标系下的方差最大,同时不同主成分之间相互独立,可以有效地减少冗余信息和噪声。
PCA的具体实现步骤如下:
1)对原始数据进行标准化处理,使得各维度数据具有相同的尺度和权重。
2)计算数据集的协方差矩阵C,其中第i行和第j列的元素表示第i个特征和第j个特征之间的协方差。
3)对协方差矩阵C进行特征值和特征向量分解,得到对应的特征值和特征向量。特征值表示数据在对应方向上的方差大小,而特征向量表示数据在对应方向上的投影系数。
4)将特征向量按照对应的特征值大小进行排序,选取前k个特征向量作为新的主成分,构成对应的转换矩阵W。
5)将原始数据乘以转换矩阵W,得到新的低维数据表示。
代码示例:
import numpy as np
from sklearn.decomposition import PCA
# 创建一个示例数据集
X = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 使用PCA库实现主成分分析
pca = PCA(n_components=2)
pca.fit(X)
# 输出主成分分析后的结果
print("主成分分析后的结果:")
print(pca.transform(X))
运行结果:
主成分分析后的结果:
[[-5.19615242e+00 -1.33226763e-15]
[ 0.00000000e+00 0.00000000e+00]
[ 5.19615242e+00 1.33226763e-15]]